-
它是一个包含代码文件压缩、优化、混淆和校验等功能的工具
-
它能够检测并删除无用的类、变量、方法和属性
-
它能够优化字节码并删除未使用的指令
-
它能够将类、变量和方法的名字重命名为无意义的名称从而达到混淆效果
-
最后,它还会校验处理后的代码,主要针对 Java 6 及以上版本和 Java ME
资源压缩
Android 中,编译器为我们提供了另外一项强大的功能:资源的压缩。资源压缩能够帮助我们移除项目及依赖仓库中未使用到的资源,有效地降低了apk包的大小。由于资源压缩与代码混淆是协同工作,所以,如果需要开启资源的压缩,切记要先开启代码混淆,否则会出现以下问题:
ERROR: Removing unused resources requires unused code shrinking to be turned on. See http://d.android.com/r/tools/shrink-resources.html for more information.
Affected Modules: app
自定义要保留的资源
当我们开启了资源压缩之后,系统会默认替我们移除所有未使用的资源,假如我们需要保留某些特定的资源,可以在我们项目中创建一个被 标记的 XML 文件(如 res/raw/keep.xml),并在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。
这两个属性都接受逗号分隔的资源名称列表。同样,我们可以使用字符 * 作为通配符。
如:
<?xml version="1.0" encoding="utf-8"?><resources xmlns:tools=“http://schemas.android.com/tools”
tools:keep="@layout/activity_video*,@layout/dialog_update_v2"
tools:discard="@layout/unused_layout,@drawable/unused_selector" />
启用严格检查模式
正常情况下,资源压缩器可准确判定系统是否使用了资源。不过,如果您的代码(包含库)调用 Resources.getIdentifier(),这就表示您的代码将根据动态生成的字符串查询资源名称。
这时,资源压缩器会采取防御性行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。例如,以下代码会使所有带 img_ 前缀的资源标记为已使用:
String name = String.format(“img_%1d”, angle + 1);
res = getResources().getIdentifier(name, “drawable”, getPackageName());
这时,我可以开启资源的严格审查模式,只会保留确定已使用的资源。