为什么ProGuard会保留onCreate()方法?

6

我试图理解这个问题,但我仍然不明白为什么会发生这种情况:根据默认的proguard.cfg文件,我定义了以下规则:

-keep public class * extends android.app.Activity

据我所了解,这意味着:将任何Activity类保留为入口点,但可以自由缩小/混淆/优化其中的任何内容(否则我将不得不使用例如<methods>通配符来保留方法,对吗?)。
现在我的测试Activity看起来像这样:
public class MyActivity extends Activity {

    public void onCreate(Bundle savedInstanceState) {
        ...
    }

    public void unusedMethod() {
    }
}

如果我现在导出一个已签名的APK,并且调用了ProGuard,它将按预期删除unusedMethod,但它将保留onCreate方法并且不会混淆其名称。为什么会这样?

此外,如果我添加一个包含单个方法M的POJO A,并从MyActivity调用它,而且没有为其指定任何保留规则,那么ProGuard将保留A并混淆其名称,但它将不会混淆M... 我感到困惑。 - mxk
啊,其实我认为这是因为ProGuard决定内联该方法,因为它只有一行代码... 这很合理。 - mxk
1个回答

9
您对配置选项的理解是正确的。但是,ProGuard无法删除或重命名您的onCreate方法,因为它覆盖了android.app.Activity中的onCreate方法。重命名它将破坏应用程序。像unusedMethod这样不覆盖库方法的方法可以安全地被删除、内联或至少重命名。
除非您为方法M指定了某个-keep选项,否则应将其重命名。您可以使用选项-whyareyoukeeping来检查。

另外,看到我的另一条评论,为什么ProGuard没有混淆M - 我查看了字节码,它实际上内联了调用,所以就没有M方法了... - mxk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接