web-dev-qa-db-ja.com

EclipseでProguardを使用してAndroidライブラリ(.jarファイル)を難読化する方法

EclipseでProGuardを使用してAndroidアプリケーション(.apkファイル)を難読化する方法に関する多くの投稿を見てきました。 http://developer.Android.com/guide/developing)も参照してください。 /tools/proguard.html

"antreleaseを実行するかEclipseでExport Wizard)を使用して、リリースモードでアプリケーションをビルドすると、ビルドシステムは自動的にプロガードかどうかを確認します.configプロパティが設定されています。設定されている場合、ProGuardはすべてを。apkファイルにパッケージ化する前にアプリケーションのバイトコードを自動的に処理します。 "

ただし、Eclipse ExportWizardを使用して.jarファイルでAndroidプロジェクトをエクスポートする場合は、説明されている手順に従います(ファイルproguard.cfgを作成し、proguard.configプロパティをproguard.cfgに構成します)。 Export Wizardなど)を使用したdefault.propertiesファイルは機能していないようです-結果のjarファイルにクラス名などの難読化は見られません。また、次の設定があります。 proguard.cfgファイルがありますが、プロジェクトディレクトリまたはproguardディレクトリに出力ファイルが表示されません(そのディレクトリは作成されていません)。

-dump class_files.txt 
-printseeds seeds.txt 
-printusage unused.txt 
-printmapping mapping.txt

プロジェクトディレクトリに次の行を含むファイルproject.propertiesを作成しましたが、ProGuardを実行に移すようには見えませんでした。

proguard.config=proguard.cfg

このプロジェクトで定義されているアクティビティはありません。私はWindowsでAndroid 2.3.1とEclipseGalileo3.5.2を使用しています。Android 3.0と同じ結果です。難読化の手順を何らかの方法で中断する必要があるようです。 Eclipseエクスポートウィザードで明示的に。助けや洞察をいただければ幸いです。ありがとうございます。

19
Damodar Periwal

上記の回答の1つへのコメントで示唆されているように(ただし、「追加のコメント」の1つに埋もれていたため、最初は気づきませんでした)…

eclipseの外部のライブラリでコマンドライン(以下の最初のブロックを参照)でprogruardを実行し、以下の2番目のブロックのパラメーターを使用します。 proguard.cfgファイル(そして間違いなくしない-dontpreverifyを使用するか、プロジェクトをAndroidライブラリとして使用するプロジェクトは使用できません) project.jarからのStackMapTableの問題により、適切に難読化されます)。

コマンドライン:

$ Java -jar $Android_SDK/tools/proguard/lib/proguard.jar \
  -libraryjars $Android_SDK/platforms/Android-18/Android.jar @proguard.cfg
  -outjars /tmp/project.jar -verbose

proguard.cfg:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn our.company.project.R*
-injars bin/project.jar
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-keep class org.Apache.3rdparty.stuff.**
-keep public class our.company.project.ProjectAPI
-keep public class * extends Android.app.Activity
-keep public class * extends Android.app.Application
-keep public class * extends Android.app.Service
-keep public class * extends Android.content.BroadcastReceiver
-keep public class * extends Android.content.ContentProvider
-keep public class * extends Android.app.backup.BackupAgentHelper
-keep public class * extends Android.preference.Preference

-keepclassmembers public class our.company.project.ProjectAPI {
    public static <fields>;
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembers class * {
    public <init>(Android.content.Context, Android.util.AttributeSet);
}

-keepclasseswithmembers class * {
    public <init>(Android.content.Context, Android.util.AttributeSet, int);
}

-keepclassmembers class * extends Android.app.Activity {
    public void *(Android.view.View);
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}

-keep class * implements Android.os.Parcelable {
    public static final Android.os.Parcelable$Creator *;
}

すべてのパラメーターと-keepアイテムが厳密に必要なわけではない可能性があります(前述のように-dontpreverifyを使用しない場合を除く)が、これらのほとんどは、Activityクラスがある場合に必要なアイテムとして私には意味がありますエクスポートするライブラリの拡張子。

18
john.k.doe

エクスポートされたAndroid難読化されたjarを生成するために、間接的な方法を使用します。私の方法は次のとおりです。

  1. 署名されたapkをエクスポートするEclipseを使用する

  2. aPKを解凍し、classes.dexを見つけます

  3. dex2jar.batを使用し、classes.dexをjarに変更します

  4. jarを解凍し、不要なクラスを削除してから、圧縮してファイル名をXXX.jarに変更します。

  5. 次に、このjarを他のプロジェクトで使用するか、顧客に渡すと、難読化されます。

これがあなたを助けると確信しています!楽しめ!

11
Xitao
Java -jar proguard.jar @yourconfig.pro

yourconfig.pro( http://proguard.sourceforge.net/index.html#manual/examples.html から拡張):

-injars yourjar.jar
-outjars yourjar_out.jar

-libraryjars 'C:\Android\sdk\platforms\Android-10\Android.jar'

-printmapping mapping.txt
-verbose
-dontoptimize
-dontpreverify
-dontshrink
-dontskipnonpubliclibraryclassmembers
-dontusemixedcaseclassnames
-keepparameternames
-renamesourcefileattribute SourceFile
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

-keep public class * {
    public protected *;
}

-keepclassmembernames class * {
    Java.lang.Class class$(Java.lang.String);
    Java.lang.Class class$(Java.lang.String, boolean);
}

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}

-keepclassmembers class * implements Java.io.Serializable {
    static final long serialVersionUID;
    private static final Java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(Java.io.ObjectOutputStream);
    private void readObject(Java.io.ObjectInputStream);
    Java.lang.Object writeReplace();
    Java.lang.Object readResolve();
}

結果は jd-gui で確認できます

7
pulp

純粋なJava Jarを難読化しないでください。 Jarの作成中にそのフェーズを完全にスキップします(Eclipseで手動でまたはコマンドラインからAntビルドを介して)。

代わりに、clientプロジェクトで適切な難読化をセットアップして実行します。このプロジェクトでは、ライブラリを外部Jarとして追加するJarを使用します。 Proguardは、Jar内のコードも難読化できるようになります。

私はこの問題に遭遇し、ここで説明したように成功しました。

2
superjos

ProGuardを呼び出す方法はかなり簡単です。

  1. 行を追加しますproguard.config=proguard.cfg to project.properties
  2. アプリケーションパッケージをエクスポートします

デフォルトのproguard.cfgファイルは、新しいプロジェクトウィザードによって自動的に作成されているはずです。

2
Ted Hopp