我有一个非常大的应用程序,我正试图与ProGuard混淆。它使用Android支持库FragmentActivities,并且有很多可以扩展View,RelativeLayout或FrameLayout的复合视图。
问题是ProGuard无法保留一些视图(之后我得到ClassNotFoundException
,因为它们在XML中引用)有趣的是,那些缺少的视图属于一个特定的包(我的观点分布在3或4种不同的包装)。即使编写明确的规则,我也无法保留这些视图。
更新
事实证明这与我如何清理/重建项目等非常相关。
根据我的经验到目前为止,正确获取已签名的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输出文件,我看到应该正确保存视图,但事实是,它们已经丢失了!
任何帮助表示赞赏!