11

我正在使用最新的 Android SDK (4.1),并尝试导出启用了 Proguard 的签名 jar。但是,在反编译优化后的 APK 后,我注意到我原本期望内联的方法并没有。

我知道 Proguard 运行是因为代码被正确混淆了。所以为了确认这一点,我将此方法添加到我的活动中:

private void testInlining()
{
    mConfig = null;
}

这个私有方法在我的活动中只被调用一次,并且因为它是私有的,所以优化器应该很明显它只被调用一次并且应该被内联。

文档说默认情况下启用所有优化,并且 Proguard “短或仅调用一次的内联方法”。

我应该给 Proguard 一个特定的标志来启用内联吗?

编辑

我的 proguard 配置文件包含

-optimizationpasses 5
-allowaccessmodification
-overloadaggressively
-repackageclasses ''
-dontskipnonpubliclibraryclasses

编辑

使用后

-whyareyoukeeping class com.templatecompany.templateappname.EntryPointActivity {*;}

我得到了该方法未内联的原因:

 [proguard] com.templatecompany.templateappname.EntryPointActivity: void testInlining() (20:21)
 [proguard]   is invoked by    com.templatecompany.templateappname.EntryPointActivity: com.td.media.ivConnection.IvConfig getIvConfig() (14:15)
 [proguard]   implements       com.td.widget.MainActivity: com.td.media.ivConnection.IvConfig getIvConfig()
 [proguard]   is invoked by    com.td.widget.MainActivity: void onCreate(android.os.Bundle) (140:175)
 [proguard]   implements       android.app.Activity: void onCreate(android.os.Bundle)
 [proguard]   is a library method.

但是我不确定该方法testInlining在该方法中使用的事实是如何被另一个方法使用的,这一事实如何阻止ingetIvConfig的内联。testInlininggetIvConfig

4

2 回答 2

17

这个最近的 Android SDK 默认禁用所有优化,参见 ${sdk.dir}/tools/proguard/proguard-android.txt:

-dontoptimize

替代优化配置仅禁用一些优化,请参阅 ${sdk.dir}/tools/proguard/proguard-android-optimize.txt:

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*

您可以在 project.properties 中指定您喜欢的配置文件。

您可以通过添加选项来验证 ProGuard 正在使用哪个完整配置-printconfiguration

为了避免旧版本 Dalvik VM 中的错误(!code/simplification/arithmetic,!code/simplification/cast),一些优化已被禁用,并且一些优化可能已被禁用以避免旧版本 ProGuard(!字段/*,!类/合并/*)。

请注意,-whyareyoukeeping指的是缩小步骤,它将不必要的类/字段/方法作为一个整体删除。未删除的方法可以在优化步骤中内联(除非用 明确指定-keep)。

于 2012-08-25T09:58:13.107 回答
2

在您的模块build.gradle文件中,您应该查看:

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt')
        signingConfig signingConfigs.release
    }
}

替换proguard-android.txtproguard-android-optimize.txt,它不包括该-dontoptimize行,同时避免 dalvik 问题(请参阅 Eric Lafortune 的回答)。

于 2016-01-17T20:19:15.343 回答