Android Proguard不在线
我正在使用最新的Android SDK(4.1),并尝试导出一个启用Proguard的签名jar。然而,在对优化后的APK进行反编译之后,我注意到我原本希望内联的方法并没有实现 我知道Proguard运行是因为代码被正确地混淆了。为了证实这一点,我将此方法添加到我的活动中:Android Proguard不在线,android,proguard,inlining,Android,Proguard,Inlining,我正在使用最新的Android SDK(4.1),并尝试导出一个启用Proguard的签名jar。然而,在对优化后的APK进行反编译之后,我注意到我原本希望内联的方法并没有实现 我知道Proguard运行是因为代码被正确地混淆了。为了证实这一点,我将此方法添加到我的活动中: private void testInlining() { mConfig = null; } 这个私有方法在我的活动中只被调用一次,因为它是私有的,所以优化器应该非常清楚它只被调用一次,并且应该内联 文档中说,所
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
中使用了testinline
方法这一事实是如何防止getIvConfig中testinline
的内联默认情况下禁用所有优化的,请参见${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/algorithm,!code/simplification/cast)中出现错误,已经禁用了一些优化;为了避免旧版本的ProGuard(!field/*,!class/merging/*)中出现错误,可能已经禁用了一些优化
请注意,-whyareyoukeeping
指的是收缩步骤,它从整体上删除不必要的类/字段/方法。未删除的方法可以在优化步骤中内联(除非使用-keep
明确指定)。此最新的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/algorithm,!code/simplification/cast)中出现错误,已经禁用了一些优化;为了避免旧版本的ProGuard(!field/*,!class/merging/*)中出现错误,可能已经禁用了一些优化
请注意,-whyareyoukeeping
指的是收缩步骤,它从整体上删除不必要的类/字段/方法。未删除的方法可以在优化步骤中内联(除非使用-keep
明确指定)。在模块的build.gradle
文件中,您应该查看:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt')
signingConfig signingConfigs.release
}
}
和用proguard android optimize.txt
替换proguard android optimize.txt
,其中不包括-dontoptimize
行,同时避免dalvik问题(参见Eric Lafortune的答案)。在模块的build.gradle
文件中,您应该查看:
buildTypes {
release {
minifyEnabled true
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt')
signingConfig signingConfigs.release
}
}
和用proguard android optimize.txt
替换proguard android optimize.txt
,其中不包括-dontoptimize
行,同时避免dalvik问题(参见Eric Lafortune的答案)。您尝试过这个吗-optimizationpasses 5更多关于您是否能够让proguard内联进行任何方法调用?使用proguard-android-optimize.txt并编写一个返回int的简单私有方法,我无法看到它工作:您尝试过这个吗-optimizationpasses 5更多关于您是否能够让proguard内联进行任何方法调用?使用proguard-android-optimize.txt并编写一个返回int的简单私有方法,我无法看到它工作:这是有道理的,我不知道谷歌默认禁用了优化。非常感谢,我会尝试一个DACEPT的答案,如果它修复它。这是有意义的,我不知道谷歌默认禁用优化。非常感谢,如果答案正确的话,我会尝试一下。