写点什么

今日头条 APK 瘦身之路,android 组件化开发框架对比

用户头像
Android架构
关注
发布于: 2 小时前

res 主要是存放图片资源


lib 主要是存放 so 库,各个 cpu 架构


classes.dex 是 java 源码编译后生成的 java 字节码文件,因方法数限制拆分了多个 dex


assets 主要存放不需要编译处理的文件


resources.arsc 是编译后的二进制资源文件,包括图片、文本索引等


META-INF 签名信息


AndroidManifest.xml 描述配置文件


从 APK 的构成中可以看出占比较大的几个部分,可以着重对其优化


优化


res 文件夹


图片资源压缩


1、ImageOptim


提供了相应客户端,支持通过客户端批量处理,mac 上可以使用如下命令开启:


find . -name '*.png' | xargs open -a ImageOptim


2、TinyPng


没有提供客户端,支持拖拽到网页处理;提供了 HTTP API 来批量处理,但是有数量限制,每个 key 每个月可以压缩 500 张。 开发了一个 gradle 插件来批量操作,网上也有一些类似的插件:TinyPng Gradle 插件


移除无用资源


1、通过使用 Lint 检测删除无用资源,某些业务代码删除的时候遗漏了相应资源,可以写个脚本检测移除不再使用的资源


2、添加 shrinkResources 设置项(官方说明),有 0.18M 的优化空间,但是该设置有风险如果要使用需要做好测试


3、选择支持合适的图片,目前有 ldpi mdpi hdpi xhdpi xxhdpi xxxhdpi 资源文件夹,可根据自己 app 的用户设备选择支持 2-3 种即可(当然一套也行)


高版本的 gradle 已不再支持通过 resConfigs “nodpi”, “hdpi”, “xhdpi”, "xxhdpi"配置支持的资源,只能人肉删除。如果你只想打包某一种屏幕密度的资源,可以使用分包策略,添加如下 density 配置可以只支持打包 xhdpi 资源(如果出现某些资源 xhdpi 没有,而其他文件夹包含的情况也不用担心,gradle 会保留相应资源),这种配置最终会出多个 apk 包,具体介绍可参看官方说明。


splits {


density {


enable true


reset()


include "xhdpi"


compatibleScreens 'small', 'normal', 'large', 'xlarge'


}


}


4、如果想整体移除 res 下某个文件夹可以添加如下 aaptOptions 配置,而不用打包时手工删除,多个文件夹用:隔开


aaptOptions {


ignoreAssetsPattern 'color-night-v8:drawable-night-v8'


}


arsc 文件


resource.arsc 文件记录了资源 id 和资源的对应关系(字符串的内容,图片的相对路径等)


减少语言支持


目前包括各种语言(v7 包引入),点击 resources.arsc 可以看到支持 80 种



可以通过修改 gradle 配置,去除不需要部分,这里我们保留 4 种


defaultConfig {


resConfigs "zh-rCN", "zh-rHK", "zh-rTW", "en"


}


只保留"zh-rCN", “zh-rHK”, “zh-rTW”, “en” 减少不必要的语言(80 种减到 5 种,有一个 default)apk 可减少 0.61M



资源混淆


开源解决方案 AndResGuard 可以看下,通过使用段路径和压缩可以减小 apk,需要注意的是你的项目中某些资源需要 keep,减少了 1.5M。


lib 文件夹


架构支持


Android 系统目前支持以下七种不同的 CPU 架构:ARMv5,ARMv7 (从 2010 年起),x86 (从 2011 年起),MIPS (从 2012 年起),ARMv8,MIPS64 和 x86_64 (从 2014 年起)


每一个 CPU 架构对应一个 ABI:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64


所有的 x86、x8664、armeabi-v7a、arm64-v8a 设备都支持 armeabi 架构的.so 文件,x86 设备能够很好的运行 ARM 类型函数库,但并不保证 100%不发生 crash,特别是对旧设备。64 位设备(arm64-v8a, x8664, mips64)能够运行 32 位的函数库,但是以 32 位模式运行,在 64 位平台上运行 32 位版本的 ART 和 Android 组件,将丢失专为 64 位优化过的性能(ART,webview,media 等等)。所以一般的应用完全可以根


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


据自己业务需求选择使用 armeabi 或者 armeabi-v7a 一种支持就行。


可以通过 gradle 配置


defaultConfig {


ndk {


abiFilter "armeabi"


}

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
今日头条APK瘦身之路,android组件化开发框架对比