1

以下の Proguard 構成を使用して Ant をビルドしました。これは、「android」コマンド ライン ツールによって生成されたものです。しかし、このスクリプトを使用してアプリをビルドすると、アプリがデバイス上で実行されると、一連の null ポインター例外が発生して、アプリが異常終了します (難読化プロセスにより、何らかの形でコードにバグが追加されます)。アプリを修正するには、Proguard を介して実行せずに再構築するだけです。

Android アプリで Proguard を使用している人に、a) アプリが最適化され、妥当な程度に難読化され、b) 機能の完全性が損なわれないようにするために、どのようなアドバイスをしますか?

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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

-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 *;
}
4

2 に答える 2

5

私が経験した特定のケースの解決策を見つけました。他の人が役立つと思うので、解決策を文書化します。

JSON API 呼び出しとの間のペイロードを保持するために特別に使用される 2 つのクラスがあります。これらのクラスを難読化から除外していなかったため、クラス メンバー名が JSON パラメーター名と一致しなかったため、GSON パーサーはオブジェクトを正しく作成できませんでした。

したがって、この話の教訓は、JSON データをデシリアライズして、JSON パラメーター名とクラス メンバー名を一致させる GSON またはその他のツールを使用してオブジェクトを作成する場合、Proguard がそれらの名前を変更しないようにすることです。私が見た null 参照の例外は、非シリアル化されたすべてのオブジェクトが空白だったことが原因でした。

私は ClassNotFoundException を経験していないと言わざるを得ません。これは別の問題であり、最初は非常に不可解なランタイム エラーのように見えたのは、興味深い仮定の組み合わせに過ぎませんでした。

于 2011-02-15T16:04:00.453 に答える
4

Pro-guardの構成セクションに記載されているルールに従ってください。キーは、おそらく xml 内のクラスへの参照です。したがって、コードで明示的に使用されていないレシーバーまたはサービスがマニフェストにある場合、それらは Proguard によって削除される可能性があります。これには、カスタム ビューなどのレイアウトのクラスも含まれます。

于 2011-02-15T15:46:45.460 に答える