Android 安装包主要由 libs(就是so文件)、assets、res以及code组成。大部分应用中,这些内容都占了安装包99%的体积。
下面我们逐步分析每一种类型文件的瘦身方案。
libs
libs也就是so文件。大部分流行应用都会包含libs,而且会占用很大的体积。比如国民App微信中的libs就占了50%以上的体积。
libs下会包含多种cpu架构的so文件系列,可以根据市场中手机设备的分布对so进行过滤。比如只内置arm-v7或arm-v8的版本。这可以通过在编译脚本中添加abiFilters来实现。
谷歌市场能够做到按需下载app内容,也就是无论app中内置了多少cpu架构的so文件,在下载时都是只下载匹配当前设备的那一部分内容,其他都不会下载。不知道国内的应用市场是否也支持这个功能。
第二个方案就是将so文件远程化。但是远程化so可能会造成大量的崩溃,所以【不建议】这样做。
assets
assets是应用中会用到的一些资源文件。和res的区别在于,res会在编译期间被压缩优化,但是assets的内容不会被修改。
assets中的文件可以完全远程化并在需要的时候进行下载,因为我们可以完全控制assets文件的访问代码(当然前提是这些代码和资源都是我们自己的)。
问题在于,当本地没有资源而且又没有网络的时候,需要有降级方案解决资源缺失的问题。
res
资源,也就是代码中定义的各种layout、图片、颜色、字符串等等。
对于资源文件,可以通过工具快速查找无用资源并删除,具体方法可以参考这里。
另外也可以通过一些优化方案减少图片等资源的体积,比如
- 使用shape或矢量图定义规则的图片。
- 使用tint修改图片颜色,避免定义多个仅颜色不同的图片。
code
针对代码的优化没有什么好的方法,只能是平时的开发中注意优化,而且优化效果很差,因为代码可以被压缩,在最终包里面体积是很小的。而且应用里面大部分代码都是接入的三方sdk的内容。
不过在开发中可以做到以下几点,至少可以将包体积增长的速度降下来:
- 随手删除无用的方法、类等(基础工具方法除外)
- 删除代码时,同时删除其依赖的资源文件,包括res和assets等。
网友评论