Android Proguard没有内联

J_D*_*J_D 10 android proguard inlining

我正在使用最新的Android SDK(4.1),我尝试导出已启用Proguard的签名jar.但是,在反编译优化的APK之后,我注意到我希望内联的方法不是.

我知道Proguard运行是因为代码被正确混淆了.所以为了确认这一点,我在我的Activity中添加了这个方法:

private void testInlining()
{
    mConfig = null;
}
Run Code Online (Sandbox Code Playgroud)

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

文档说明默认情况下启用所有优化,并且Proguard"内联方法很短或只调用一次".

是否有一个特定的标志我应该给Proguard启用内联?

编辑

我的proguard配置文件包含

-optimizationpasses 5
-allowaccessmodification
-overloadaggressively
-repackageclasses ''
-dontskipnonpubliclibraryclasses
Run Code Online (Sandbox Code Playgroud)

编辑

使用后

-whyareyoukeeping class com.templatecompany.templateappname.EntryPointActivity {*;}
Run Code Online (Sandbox Code Playgroud)

我得到了没有内联方法的原因:

 [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.
Run Code Online (Sandbox Code Playgroud)

但我不确定testInlining这个方法getIvConfig在另一个方法反过来使用的方法中使用的事实是如何阻止内联testInlininggetIvConfig.

Eri*_*une 16

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

-dontoptimize
Run Code Online (Sandbox Code Playgroud)

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

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
Run Code Online (Sandbox Code Playgroud)

您可以在project.properties中指定首选配置文件.

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

为了避免旧版Dalvik VM中的错误(!代码/简化/算术,代码/简化/强制转换),已禁用某些优化,并且可能已禁用某些优化以避免旧版ProGuard中的错误(!场/*,!类/合并/*).

请注意,这-whyareyoukeeping是指收缩步骤,它会删除不必要的类/字段/方法.可以在优化步骤中内联未被移除的方法(除非另有明确说明-keep).