随着app的业务复杂度越来越高、资源文件越来越多,我们的app安装包apk文件也就越来越大,而过大的apk文件往往会把用户拒之门外,所以减小apk大小就势在必行了。
从APK结构说起
- apk包含以下目录
- assets/: 包含了应用的资源,这些资源能够通过AssetManager对象获得。
- lib/: 包含了针对处理器层面的被编译的代码。这个目录针对每个平台类型都有一个子目录,比如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64和mips。
- res/: 包含了没被编译到resources.arsc的资源。
- META-INF/: 包含CERT.SF和CERT.RSA签名文件,也包含了MANIFEST.MF文件。(译注:校验这个APK是否被人改动过)
- apk包含以下文件
- classes.dex: 包含了能被Dalvik/Art虚拟机理解的 dex 文件格式的类。
- resources.arsc: 包含了被编译的资源。该文件包含了res/values目录的所有配置的 xml 内容。打包工具将 xml 内容编译成二进制形式并压缩。这些内容包含了语言字符串和styles,还包含了那些内容虽然不直接存储在resources.arsc文件中,但是给定了该内容的路径,比如布局文件和图片。所以又叫 资源映射表
- AndroidManifest.xml: 包含了主要的Android配置文件。这个文件列出了应用名称、版本、访问权限、引用的库文件。该文件使用二进制 xml 格式存储。(译注:该文件还能看到应用的minSdkVersion, targetSdkVersion等信息)
apk瘦身概览-六大措施
- 移除无用资源
- 国际化资源配置:精确配置需要的语言,不需要的语言,对应的字符串不要打包到apk中
- 动态库打包配置:仅配置armeabi-v7a即可运行,如果特殊要求,可酌情处理
- 压缩代码、压缩资源
- 资源混淆
- svg图片优化
一、移除无用资源
在项目中往往会有一些因为产品的变更或者其他原因而产生一些无用资源,我们apk瘦身的第一步便是要移除这些无用资源,as帮我们提供了两种方式来移除。
- 1.粗暴移除(不推荐):只要资源未被静态引用,则就移除该资源,如果某资源是被动态使用的,则仍然会被移除,所以此方案不推荐。
- 使用方式:点击as顶部的 Refactor,再点击 Remove Unused Resources,即可选择移除或者移除预览
- 静态使用与动态使用
- 静态使用资源,即通过R.来引用的
- 动态使用资源
// getResources().getIdentifier("name","defType",getPackageName());,使用例子如下 int layoutId = getResources().getIdentifier("activity_second","layout",getPackageName());