【问题标题】:What optimisation is safe that still allows -assumenosideeffects removals什么优化是安全的,仍然允许 -assumenosideeffects 删除
【发布时间】:2013-06-04 16:19:31
【问题描述】:

我注意到,在我最近创建的项目中,出现了一种新的 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 优化相关的问题的风险?

【问题讨论】:

    标签: android proguard


    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-11
      • 2011-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多