我有一个相当大的应用程序,我试图用 ProGuard 来混淆它。它使用 android 支持库 FragmentActivities,并有许多扩展 View、RelativeLayout 或 FrameLayout 的复合视图。
问题是 ProGuard 未能保留一些视图(后来我得到ClassNotFoundException
了它们在 XML 中的引用)有趣的是,那些丢失的视图属于一个特定的包(我的视图分布在 3 或 4 个不同的包中)。即使通过编写明确的规则,我也无法保留这些视图。
更新
事实证明,这与我如何清理/重建项目等非常相关。
以我到目前为止的经验,正确获取包括所有类的签名 apk 的唯一方法是:
- 禁用自动项目构建
- 清理所有项目(手动)
- 手动构建项目,以及
- 生成签名的 APK
如果我启用自动构建,或者在构建之间不清理项目,则生成的 APK 会随机丢失类。
我想知道我是否做错了什么,或者你们是否有这个问题或解决方案。此外,任何关于 proguard 清洁等的技巧都非常受欢迎!提前致谢。
老问题
我的包层次结构:
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 输出文件,我看到视图应该被正确保存,但事实是,它们丢失了!
任何帮助表示赞赏!