实际开发应用时,包体积优化是必不可少的。毕竟手机内存有限,如果包体积过大很多用户会直接放弃(以前手机内存很小的时候,这个真的很重要),现在由于手机内存大了(512G已经挡不住了),现在的用户更关注流畅度和美观作为参考,但是该有的优化还是要优化的,毕竟要尽善尽美嘛。
安装包监控
Android Studio 的 APK Analyser
这是 Android Studio 提供的一个 APK 检测工具,通过它可以查看一个 apk 文件内部各项内容所占的大小,并且按照大小排序显示。因此我们很容易观察到 APK 中哪一部分内容占用了最大空间。APK Analyzer 的使用非常简单,只要将需要分析的 APK 文件拖入 Android Studio 中即可(直接点击项目中的apk也可以),显示内容类似下图所示:
从上图中可以看出classes.dex都代码文件,不是很好东,看图片也占用了比较大的资源空间,因此可以针对性地对其做压缩优化等操作。(我这个项目是个demo所以显得代码占比较多。实际项目中肯定是图片资源占比相对较大)
从上图看出,实际上 APK Analyzer 的作用不光是查看 APK 大小,从它的名字也能看出它是用来分析 APK 的,因此可以使用它来分析一些优秀 APK 的目录结构、代码规范,甚至是使用了哪些动态库技术等。
Matrix中 的 ApkChecker(传送)
Matrix 是微信终端自研和正在使用的一套APM(Application Performance Management)系统。 Matrix-ApkChecker 作为Matrix系统的一部分,是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪。
安装包优化实践
Lint查找无用文件
使用 Lint 查看未引用资源。Lint 是一个静态扫描工具,它可以识别出项目中没有被任何代码所引用到的资源文件。具体使用也很简单,只要在 Android Studio 中点击 Analyze -> Inspect Code,如下所示:
选中整个项目,如下所示
如果项目中有未被使用资源,则 Lint 会在窗口 Inspection Result 中显示,类似结果如下:
低效布局权重:提供优化方案。
上面就是未使用的资源:会使应用程序变大,并降低构建速度。
还有很多就不多介绍了,感兴趣的可以去玩玩。
启用压缩、混淆和优化功能
当你使用 Android Studio 3.4 或 Android Gradle 插件 3.4.0 及更高版本时,R8 是默认编译器,用于将项目的 Java 字节码转换为在 Android 平台上运行的 DEX 格式。不过,当您使用 Android Studio 创建新项目时,缩减、混淆处理和代码优化功能默认处于停用状态。
debug{ // 启用代码收缩、模糊处理和优化 minifyEnabled true // 资源缩减 shrinkResources true //包括与打包在一起的默认ProGuard规则文件 //R8配置文件。 proguardFiles getDefaultProguardFile( 'proguard-android-optimize.txt'), 'proguard-rules.pro' }
未启用
启用后
文件优化
图片优化
降低图片bit
不需要太精致的图片可以将图中32 bit降至16 bit或者8 bit。
使用 VectorDrawable 图片
UI小姐姐能提供最好不能提供,咱们自己自己造。
Android Studio 中点击 File > New > Vector Asset
Clip Art 项为固有的矢量图,我们直接用即可,而Local file(SVG,PSD)选项,则是我们需要转换的了,剩下的提示进行就可以啦。
使用 webp 格式图片
使用webp格式的图片可以在保持清晰度的情况下减小图片的磁盘大小,是一种比较优秀的,Google推荐的图片格式。
选中图片>右键>选择
图片由.png转为.webp
三方库优化
在 App 中会引入各种三方的库,但是在引入之前最好权衡一下是否需要将其代码全部引入,造成不必要的代码或者资源也被打包到 APK 中。
例如Facebook全家桶,你不可能全部用到仅导入部分即可,如登入和分享
dependencies { // Facebook Core only (Analytics) implementation 'com.facebook.android:facebook-core:11.1.0' // Facebook Login only implementation 'com.facebook.android:facebook-login:11.1.0' // Facebook Share only implementation 'com.facebook.android:facebook-share:11.1.0' // Facebook Messenger only implementation 'com.facebook.android:facebook-messenger:11.1.0' // Facebook App Links only implementation 'com.facebook.android:facebook-applinks:11.1.0' // Facebook Android SDK (everything) implementation 'com.facebook.android:facebook-android-sdk:11.1.0' } 仅需导入 dependencies { implementation 'com.facebook.android:facebook-login:11.1.0' implementation 'com.facebook.android:facebook-share:11.1.0' }
例如XRecyclerView一个 RecyclerView 实现了 pullrefresh 、loadingmore 和 header featrues。你可能仅用到 loadingmore,那你就可以将关于loadingmore部分截取出来。而不用导入整个包。
关于 App Bundle
这个功能就跟ios一样了,他们就是将所有资源全部打到项目中,然后App Store,根据安装设备的属性,来选取相应资源打包进行下载。
谷歌的 Dynamic Delivery 功能就天然地解决了这个问题,通过 Google Play Store 安装 APK 时,也会根据安装设备的属性,只选取相应的资源打包到 APK 文件中。
如下图,你上传的700MB大小的aab,但是你下载的话会有两套资源打在apk中,但是用户下载仅一套资源700MB。
但是 App Bundle 目前只适合在 Google Play Store 上发布的项目,国内目前还是通过各家的插件化方案来实现动态部署,一定程度上也可以算作减少安装包大小的方案。
还有一个骚操作,就是前期资源打包,后续资源用户边玩边下载,缺点可能造成卡顿和浪费流量,仅供参考。