❤️Android 安装包体积优化❤️

2,883 阅读5分钟

小知识,大挑战!本文正在参与「程序员必备小知识」创作活动

本文已参与 「掘力星计划」 ,赢取创作大礼包,挑战创作激励金。

介绍

实际开发应用时,包体积优化是必不可少的。毕竟手机内存有限,如果包体积过大很多用户会直接放弃(以前手机内存很小的时候,这个真的很重要),现在由于手机内存大了(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)选项,则是我们需要转换的了,剩下的提示进行就可以啦。

使用 tint 着色器

纯色图片,仅修改颜色就要再导入一张图片,比较占资源,这时我们使用tint就避免浪费资源和时间。

<ImageView
            android:layout_width="200dp"
            android:src="@drawable/ic_vector"
            android:layout_marginTop="@dimen/dimen_20"
            android:layout_gravity="center_horizontal"
            android:layout_height="200dp"/>
        <ImageView
            ...其他属性跟上面一致
            android:tint="@color/color_188FFF"
            tools:ignore="UseAppTint" />

tools:igore的作用就是忽略一些指定错误,或者 抑制警告。

使用 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 上发布的项目,国内目前还是通过各家的插件化方案来实现动态部署,一定程度上也可以算作减少安装包大小的方案。

还有一个骚操作,就是前期资源打包,后续资源用户边玩边下载,缺点可能造成卡顿和浪费流量,仅供参考。