我正在使用最新的 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
的内联。testInlining
getIvConfig