1

我有一个相当大的应用程序,我试图用 ProGuard 来混淆它。它使用 android 支持库 FragmentActivities,并有许多扩展 View、RelativeLayout 或 FrameLayout 的复合视图。

问题是 ProGuard 未能保留一些视图(后来我得到ClassNotFoundException了它们在 XML 中的引用)有趣的是,那些丢失的视图属于一个特定的包(我的视图分布在 3 或 4 个不同的包中)。即使通过编写明确的规则,我也无法保留这些视图。

更新

事实证明,这与我如何清理/重建项目等非常相关。

以我到目前为止的经验,正确获取包括所有类的签名 apk 的唯一方法是:

  1. 禁用自动项目构建
  2. 清理所有项目(手动)
  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 输出文件,我看到视图应该被正确保存,但事实是,它们丢失了!

任何帮助表示赞赏!

4

0 回答 0