什么优化是安全的,仍然允许-assumenosideeffects删除

时间:2013-06-08 12:48:48

标签: android proguard

我注意到,最近我创建的项目中有一种新方法,即使用预构建的脚本来实现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优化相关的问题的风险?

1 个答案:

答案 0 :(得分:1)

我发现的解决方案是明确只启用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文件应指定 optimize SDK proguard配置文件,因为对-dontoptimize的单次调用会禁用优化。

# project.properties

proguard.config=${sdk.dir}/tools/proguard/proguard-android-optimize.txt:proguard-project.txt