ProGuard で難読化しようとしているかなり大きなアプリケーションがあります。Android サポート ライブラリ FragmentActivities を使用し、View、RelativeLayout、FrameLayout のいずれかを拡張する多数の複合ビューを備えています。
問題は、ProGuard が一部のビューを保持できないことです (その後ClassNotFoundException
、それらが XML で参照されていることが分かります) 興味深いことに、欠落しているビューは 1 つの特定のパッケージに属しています (私のビューは 3 つまたは 4 つの異なるパッケージに分散しています)。明示的なルールを作成しても、これらのビューを保持することはできません。
アップデート
プロジェクトのクリーンアップ/再構築などに非常に関連していることが判明しました。
これまでの私の経験では、すべてのクラスを含む署名済みの apk を正しく取得する唯一の方法は次のとおりです。
- 自動プロジェクト構築を無効にする
- すべてのプロジェクトを消去 (手動)
- プロジェクトを手動でビルドし、
- 署名済み APK を生成する
自動ビルドを有効にするか、ビルド間でプロジェクトをクリーンアップしないと、結果の APK にランダムに不足しているクラスが含まれます。
私は何か間違ったことをしているのだろうか、それともあなたたちはこの問題や解決策を持っているのだろうか. また、プロガードのクリーニングなどに関するトリックも大歓迎です! 前もって感謝します。
古い質問
私のパッケージ階層:
Application: tv.nebular.funq
Views 1: tv.nebular.funq.gui.*
Views 2: tv.nebular.funq.apps.*
Views 3: com.regaliz.gui.views.*
Views 4: com.regaliz.custom.*
パッケージ (3) と (4) のビューは、私が問題を抱えているビューです。パッケージは異なりますが、異なるプロジェクトではありません。それは単一のプロジェクトです。
ビューに関する私のルール:
-keep public class * extends android.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
そして、欠落しているビューの特定のルール:
# regaliz views
-keep public class com.regaliz.gui.views.*
-keepclassmembers class com.regaliz.gui.views.** {
public <init>(android.content.Context, android.util.AttributeSet);
}
# regaliz custom
-keep public class com.regaliz.custom.FunqViewPager
-keepclassmembers class com.regaliz.custom.FunqViewPager {
public <init>(android.content.Context, android.util.AttributeSet);
}
しかし、これは無視されているようです。これらのパッケージのビューは常に欠落しています。明示的に宣言されたものでさえ。
更新: proguard-mapping.txt 出力ファイルを見ると、ビューが正しく保持されているはずですが、実際にはビューが欠落しています!
どんな助けでも大歓迎です!