Android的Proguard的不内联(Android Proguard does not inl

2019-06-27 08:35发布

我使用的是最新的Android SDK(4.1),我尝试导出一个签名的jar启用Proguard的。 然而,反编译优化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在该方法中使用getIvConfig后者又通过另一种方法使用防止内联上testInlininggetIvConfig

Answer 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您首选的配置文件。

您可以其完整的配置ProGuard的是通过添加选项使用验证-printconfiguration

一些优化也为了避免在老版本的Dalvik虚拟机的(!代码/简化/算术,!代码/简化/ CAST)的bug被禁用,而一些优化可能已被禁用,以避免在旧版本的ProGuard的(错误!场/ * ,!类/合并/ *)。

需要注意的是-whyareyoukeeping指收缩步骤,这消除不必要的类/字段/方法作为一个整体。 未删除的方法可以在优化步骤内联(除非有明确规定,否则-keep )。



Answer 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的问题远(见埃里克Lafortune的答案)。



文章来源: Android Proguard does not inline