【问题标题】:Why does ProGuard keep the onCreate() method?为什么 ProGuard 保留 onCreate() 方法?
【发布时间】:2011-05-08 09:45:02
【问题描述】:

我正试图解决这个问题,但我根本不明白为什么会这样:根据默认的 proguard.cfg 文件,我定义了以下规则:

-keep public class * extends android.app.Activity

据我了解,这意味着:保留任何 Activity 类作为入口点,但可以随意缩小/混淆/优化其中的任何内容(否则我必须使用例如 <methods> 通配符来保留方法,对吗?)。

现在我的测试活动看起来像这样:

public class MyActivity extends Activity {

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

    public void unusedMethod() {
    }
}

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

【问题讨论】:

  • 此外,如果我添加一个 POJO A,其中包含从 MyActivity 调用的单个方法 M,并且不为其指定任何保留规则,那么 ProGuard 将保留 A 并混淆它的名字,但它不会混淆M...我很困惑。
  • 啊——实际上,我认为这是因为 ProGuard 决定内联该方法,因为它是一个单行... 有道理。

标签: android proguard


【解决方案1】:

您对配置选项的理解是正确的。但是,ProGuard 无法删除或重命名您的 onCreate 方法,因为它覆盖了 android.app.Activity 中的 onCreate 方法。重命名它会破坏应用程序。不覆盖库方法的方法(例如 unusedMethod)可以安全地删除、内联或至少重命名。

方法M 应该被重命名,除非你为它指定了一些-keep 选项。您可以使用选项-whyareyoukeeping 进行检查。

【讨论】:

  • 另外,请参阅我的其他评论,为什么 ProGuard 没有混淆 M——我查看了字节码,它实际上内联了调用,所以不再有方法 M...
猜你喜欢
  • 1970-01-01
  • 2016-08-18
  • 1970-01-01
  • 2017-07-11
  • 2012-05-05
  • 2015-03-25
  • 2018-05-11
  • 2015-07-27
  • 1970-01-01
相关资源
最近更新 更多