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