写点什么

今日头条 APK 瘦身之路 (1),android 设计模式

用户头像
Android架构
关注
发布于: 刚刚

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-rH


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


K", "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 等等)。所以一般的应用完全可以根据自己业务需求选择使用 armeabi 或者 armeabi-v7a 一种支持就行。


可以通过 gradle 配置


defaultConfig {


ndk {


abiFilter "armeabi"


}


}


比如:微信、微博、QQ 只保留了 armeabi,Facebook、Twitter、Instagram 只保留了 armeabi-v7a


假设只支持了 armeabi,如果有特殊要求(比如视频应用)需要用到部分 armeabi-v7a 的 so,可以通过改名放到 armeabi 文件夹中,根据手机实际情况选择加载。


动态下发


比较大的 so 可以选择动态下发的形式延迟加载,代码上需要加一些判断逻辑。


dex 文件


1、添加设置 minifyEnabled true,混淆、压缩代码,这个设置现在 app 应该都已经添加了。


2、删除一些无用库,早期为了兼容低版本手机,添加了一些兼容库,随着时间推移 APP 支持的最低版本也在升高,之前的一些无用库就可以移除。


3、插件下发业务模块 添加插架框架,将部分代码延迟下发加载,这部分效果显著。


其他

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
今日头条APK瘦身之路(1),android设计模式