Android Proguard不在线

Android Proguard不在线,android,proguard,inlining,Android,Proguard,Inlining,我正在使用最新的Android SDK(4.1),并尝试导出一个启用Proguard的签名jar。然而,在对优化后的APK进行反编译之后,我注意到我原本希望内联的方法并没有实现 我知道Proguard运行是因为代码被正确地混淆了。为了证实这一点,我将此方法添加到我的活动中: private void testInlining() { mConfig = null; } 这个私有方法在我的活动中只被调用一次,因为它是私有的,所以优化器应该非常清楚它只被调用一次,并且应该内联 文档中说,所

我正在使用最新的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
中使用了
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的答案,如果它修复它。这是有意义的,我不知道谷歌默认禁用优化。非常感谢,如果答案正确的话,我会尝试一下。