【问题标题】:Android Proguard does not inlineAndroid Proguard 不内联
【发布时间】:2012-08-20 04:50:29
【问题描述】:

我正在使用最新的 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.

但我不确定在 getIvConfig 方法中使用方法 testInlining 的事实如何阻止 getIvConfigtestInlining 的内联。

【问题讨论】:

标签: android proguard inlining


【解决方案1】:

这个最新的 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 中指定您喜欢的配置文件。

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

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

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

【讨论】:

  • 有道理,我不知道谷歌默认禁用优化。非常感谢,如果可以解决问题,我会尝试接受答案。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-13
    • 2017-11-21
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多