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エクスポートウィザードで明示的に。助けや洞察をいただければ幸いです。ありがとうございます。
上記の回答の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クラスがある場合に必要なアイテムとして私には意味がありますエクスポートするライブラリの拡張子。
エクスポートされたAndroid難読化されたjarを生成するために、間接的な方法を使用します。私の方法は次のとおりです。
署名されたapkをエクスポートするEclipseを使用する
aPKを解凍し、classes.dexを見つけます
dex2jar.batを使用し、classes.dexをjarに変更します
jarを解凍し、不要なクラスを削除してから、圧縮してファイル名をXXX.jarに変更します。
次に、このjarを他のプロジェクトで使用するか、顧客に渡すと、難読化されます。
これがあなたを助けると確信しています!楽しめ!
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 で確認できます
純粋なJava Jarを難読化しないでください。 Jarの作成中にそのフェーズを完全にスキップします(Eclipseで手動でまたはコマンドラインからAntビルドを介して)。
代わりに、clientプロジェクトで適切な難読化をセットアップして実行します。このプロジェクトでは、ライブラリを外部Jarとして追加するJarを使用します。 Proguardは、Jar内のコードも難読化できるようになります。
私はこの問題に遭遇し、ここで説明したように成功しました。
ProGuardを呼び出す方法はかなり簡単です。
proguard.config=proguard.cfg
to project.propertiesデフォルトのproguard.cfgファイルは、新しいプロジェクトウィザードによって自動的に作成されているはずです。