1. 结构分析
首先上传一张瘦身前通过Analyze app分析出来的图片(打开方式:Android Studio下 ——> Build——> Analyze app):
APK包结构如下:
lib/:包含特定于处理器软件层的编译代码。该目录包含了每种平台的子目录,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多数情况下我们可以只用一种armeabi-v7a,后面会讲到原因。
assets/:包含应用可以使用AssetManager对象检索的应用资源。
res/:包含未编译到的资源 resources.arsc,主要有图片资源文件。
META-INF/:包含CERT.SF和 CERT.RSA签名文件以及MANIFEST.MF 清单文件。
resources.arsc:包含已编译的资源。该文件包含res/values/ 文件夹所有配置中的XML内容。打包工具提取此XML内容,将其编译为二进制格式,并将内容归档。此内容包括语言字符串和样式,以及直接包含在resources.arsc文件中的内容路径 ,例如布局文件和图像。
classes.dex:包含以Dalvik / ART虚拟机可理解的DEX文件格式编译的类。
AndroidManifest.xml:包含核心Android清单文件。该文件列出应用程序的名称,版本,访问权限和引用的库文件。该文件使用Android的二进制XML格式。
2.具体实操
1. 对lib目录下的文件进行瘦身处理
1. 修改lib配置:
参考资料
so文件的优化:通常我们在使用NDK开发的时候,我们经常会有如下这么一段代码:
ndk {
//设置支持的so库架构
abiFilters "armeabi-v7a", "x86", "arm64-v8a", "x86_64", "armeabi"
}
修改后的配置 减少一些cpu的配置会减少apk大小很多 但是在部分机型上会出现bug GooglePlay上配置必须64位
ndk {
//设置支持的so库架构
abiFilters "armeabi-v7a"
}
2. 优化res,assets文件大小
1. 手动lint检查,手动删除无用资源
在Android Studio中打开“Analyze” 然后选择"Inspect Code...",范围选择整个项目,然后点击"OK"。
2. 使用图片压缩工具对图片进行压缩。
推荐用 https://zh.recompressor.com/ 没有图片限制
https://tinypng.com/ 图片限制20张
3. 大部分图片使用占有小的来代替如webp
一般不太现实 因为毕竟项目成型了 新项目可以考虑下 前提是UI得会
4. 尽量不要在项目中使用帧动画
参考使用lottie-android。当然还得UI设计师会。
5. 使用gradle开启shrinkResources 开启混淆 移除无用资源
buildTypes {
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
//混淆
minifyEnabled true
// 移除无用的resource文件
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
4. 在项目中设置一套语言
删除翻译资源,只保留中英文 resConfigs "zh"
defaultConfig {
applicationId ""
minSdkVersion 15
targetSdkVersion 28
versionCode 22
versionName "1.0.21"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
resConfigs "zh"
}
5. 然后删除一下项目中无用的框架或者重复的框架
比如:fresco glide 等多种图片缓存框架或者网络请求框架等等 这个估计改动很大(看项目的封装和规范性我接触的项目都很乱)
基本下来项目就能压缩百分之五十这是我分享的有用的压缩方法