这是我参与更文挑战的第3天,活动详情查看: 更文挑战
一:Analyze APK查看各目录大小
在Android Studio里双击APK即可查看APK里各资源的情况
| 文件/目录 | 描述 |
|---|---|
| lib | 存放对应CPU架构的so库,有armeabi、armeabi-v7a、arm64-v8a、X86、x86_64 等;其中armeabi-v7a 和 arm64-v8a 是主流平台 |
| res | 存放资源文件,如布局和图片等 |
| assets | 存放能够通过AssetManager获取的资源 |
| class.dex | .java-》.class-》.dex,dex文件是能被Dalvik/ART 虚拟机理解的格式文件 |
| resources.arsc | 资源映射表,包含了res/value目录下所有配置的xml内容。根据R.java中记录的id,可以在resources.arsc中找到对应资源的位置 |
| 其他 |
优化数据参考(不同应用效果不一样)
| 状态 | 大小 | 备注 |
|---|---|---|
| 未优化前 | 79.7 MB | |
| 图片压缩,多余资源清除,代码压缩 | 69.8MB | |
| 图片压缩,多余资源清除,代码不压缩 | 71.5MB | |
| 图片压缩 | 72.2 MB | 只压缩了一部分图片及移除字体 |
二、图片优化
1: 图片压缩 tinify.cn/ 能有效降低图片大小却看不大出来失真
2: 图片格式更换成webp,svg可以更小 .png > .jpg > .webp > .svg
Android Studio创建svg icon
Android Studio将图片转换成webp
对透明通道没有要求的高保真大图要存储到磁盘的图片,优先使用 jpg一般 UI 给我们的都是 jpg 或 png 格式,如果是一些普通图标切图的话就使用 png如果有用到网络传输且图片比较大的场景,比如和服务器通信获取网络图片,优先使用 webp,其次是 png图片体积小要求不高的纯色小图标可以使用 svg
3: 一些图片可以放到网络上加载
4: 用一套图片资源,如xhdpi或xxhdpi,针对性做差异化适配
三、沉冗资源优化
1: 右键 -> Refractor -> Remove Unused Resources -> preview,预览找到冗余的资源,可一键去除冗余资源
2: 手动分析冗余资源的操作, Code -> Analyze Code -> Run Inspection by Name... -> unused resources -> Whole Project
3: build.gradle 配置文件中将shrinkResources true,在打包的时候会自动清除掉冗余的资源;这里的清除并不是删除资源文件,而是将资源内的数据剔除
注:上述方式如代码中存在动态、反射加载资源的时候,会导致资源误删的情况
可以新增res/raw/keep.xml文件,在里面把需要保留的资源文件列举出
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools" tools:keep="@drawable/xxx"/>
4: 可以通过 resConfigs 配置使用哪些语言,从而让构建工具移除指定语言之外的所有资源
android {
defaultConfig {
resConfigs "zh-rCN"
}
flavorDimensions "default"
productFlavors {
huawei {
resConfigs "zh-rCN"
}
}
}
android {
defaultConfig {
resConfigs "zh-rCN", "xhdpi" // 只需要中文字符串、xhdpi 目录下的资源
}
flavorDimensions "default"
productFlavors {
huawei {
resConfigs "zh-rCN", "mdpi" // 只需要中文字符串、mdpi 目录下的资源
}
}
}
四、代码压缩:
minifyEnabled true开启代码混淆及压缩
五、SO优化:
1: 只保留指定平台CPU架构的so
android {
defaultConfig {
ndk {
abiFilters "armeabi-v7a"
}
}
}
2: 通过网络下载,通过插件化的方式将下载的so正常装载使用