6

我注意到在我最近创建的项目中,出现了一种新的 proguard 方法,即使用预构建的脚本:

${sdk.dir}/tools/proguard/proguard-android.txt

这没有优化,并带有评论:

默认情况下关闭优化。Dex 不喜欢代码通过 ProGuard 优化和预验证步骤运行(并且自己执行其中一些优化)。

似乎遵循此建议意味着assumenosideeffects没有效果。例如,这些常见任务:

#Remove logging
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int w(...);
    public static int d(...);
    public static int e(...);
}

#Remove asserts
-assumenosideeffects class junit.framework.Assert {
  public static *** assert*(...);
}

证明它不起作用:

if (release)
{
    Assert.assertTrue("Proguard config error, Asserts have been left in", false);
}

是否有一个安全的中间地带,我可以在其中应用优化来修剪定义的调试assumenosideeffects,但又不会冒与 Dex 和 proguard 优化相关的问题的风险?

4

1 回答 1

3

我找到的解决方案是显式仅启用assumenosideeffects命令所依赖的优化。因此,proguard 配置示例如下:

# proguard-project.txt

# Remove all Verbose/Debug logging
-optimizations code/removal/simple,code/removal/advanced
-dontobfuscate
-assumenosideeffects class android.util.Log {
    public static int v(...);
    public static int d(...);
}

请注意,project.properties 文件应指定优化SDK proguard 配置文件,因为单次调用-dontoptimize禁用优化。

# project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt
于 2013-10-16T21:57:32.850 回答