私のアプリケーションには多くのアクティビティがあり、ネイティブライブラリも使用しています。 Eclipseが生成するデフォルトのProGuard構成では、ProGuardは多くのものを削除します-OnClickメソッド、静的メンバー、ネイティブライブラリが使用するコールバックメソッド...パッケージから何も削除しないようにProGuardに指示する簡単な方法はありますか?ものを削除すると、アプリケーションサイズの約2.5%しか節約できませんが、アプリケーションが完全に破損します。 ProGuard構成でクラスごとに構成、テスト、および保守するのは面倒です。
最終結果として、すべてのクラスメンバーを保持するだけでは、アプリケーションを正しく動作させるのに十分ではなく、必要でもないことがわかりました。これを設定ファイルに追加しました:
-keepclasseswithmembers class * {
void onClick*(...);
}
-keepclasseswithmembers class * {
*** *Callback(...);
}
OnClick *の場合は、.xmlレイアウトファイルのAndroid:onClick属性でアドレス指定するすべてのメソッドです(このようなメソッドの名前はすべて「onClick」で始まります)。
* Callbackの場合は、ネイティブコードから(JNIを介して)呼び出すすべてのコールバックメソッドです。そのようなすべてのメソッドの名前に「Callback」という接尾辞を付けます。
また、次のようなネイティブコードから使用する変数を使用して、いくつかの特別な場合にいくつかの行を追加しました。
-keep class com.myapp.mypackage.SomeMyClass {
*** position;
}
(パッケージcom.myapp.mypackageからの名前 'SomeMyClass'を持つクラスの名前 'position'を持つ変数の場合)
これは、これらのonClick、コールバックなどが存在するだけでなく、元の名前を保持する必要があるためです。 ProGuardが他に自由に最適化できること。
ネイティブメソッドの場合も重要ですが、そのためにはEclipseファイルから生成された宣言がありました。
-keepclasseswithmembernames class * {
native <methods>;
}
少なくともこれらのフラグを追加する必要があると思います(個々のパッケージ名を変更してください):
-keep class javax.** { *; }
-keep class org.** { *; }
-keep class Twitter4j.** { *; }
また、これらのフラグを追加します。
-dontshrink
-dontoptimize
-dontpreverify
ここに私のProguard.cfgの設定ファイル全体があります:
-dontshrink
-dontoptimize
-dontpreverify
-verbose
-dontwarn javax.management.**
-dontwarn Java.lang.management.**
-dontwarn org.Apache.log4j.**
-dontwarn org.Apache.commons.logging.**
-dontwarn org.slf4j.**
-dontwarn org.json.**
-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
-keep public class com.Android.vending.licensing.ILicensingService
-keep class javax.** { *; }
-keep class org.** { *; }
-keep class Twitter4j.** { *; }
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(Android.content.Context, Android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(Android.content.Context, Android.util.AttributeSet, int);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(Java.lang.String);
}
-keep class * implements Android.os.Parcelable {
public static final Android.os.Parcelable$Creator *;
}