【发布时间】: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 的事实如何阻止 getIvConfig 中 testInlining 的内联。
【问题讨论】:
-
你试过了吗? -optimizationpasses 5 更多关于stackoverflow.com/questions/5068251/…
-
你真的能够让 proguard 让任何方法调用内联吗?使用 proguard-android-optimize.txt 并编写一个返回 int 的简单私有方法,我无法看到它工作:paste.ofcode.org/hbpzPe4EdAnDGnNqNTE7c3