web-dev-qa-db-ja.com

ProGuardにすべてを特定のパッケージに保存するように指示するにはどうすればよいですか?

私のアプリケーションには多くのアクティビティがあり、ネイティブライブラリも使用しています。 Eclipseが生成するデフォルトのProGuard構成では、ProGuardは多くのものを削除します-OnClickメソッド、静的メンバー、ネイティブライブラリが使用するコールバックメソッド...パッケージから何も削除しないようにProGuardに指示する簡単な方法はありますか?ものを削除すると、アプリケーションサイズの約2.5%しか節約できませんが、アプリケーションが完全に破損します。 ProGuard構成でクラスごとに構成、テスト、および保守するのは面倒です。

49
ggurov

最終結果として、すべてのクラスメンバーを保持するだけでは、アプリケーションを正しく動作させるのに十分ではなく、必要でもないことがわかりました。これを設定ファイルに追加しました:

-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>;
}
22
ggurov

少なくともこれらのフラグを追加する必要があると思います(個々のパッケージ名を変更してください):

-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 *;
}
52
Caspar Harmer