Android包大小优化方案

903 阅读3分钟

前言

随着业务需求的不断增加,app的包体积会越来越大:一方面是为了实现相应的功能引入一些第三方库,一方面是对于一些资源的利用没有进行优化处理,等等~但是app体积越大,用户下载或更新的成本就越高,这会严重的影响app的用户体验以及推广。因此有必要对包体积进行优化。下边主要是整理了一些常见的优化手段

优化方案

需要对体积进行优化,首先得了解我们apk最后的构建成分,哪些文件相对较大,再针对性进行优化处理。Android Studio为我们提供了包大小分析工具:Android Studio→ Build→Analyze APK

工具.png

选择需要分析的apk后,工具会自动分析包的各项资源占用并按大小排序

分析.png

通过上边的分析,发现apk较大的资源都在res、lib和assets三个目录下,接下来就开始优化这三个文件夹的内容。

图片等资源的处理(res文件夹)

图片压缩

android的图片资源一般会有静态图和动态图两种,我们可以分别进行压缩处理:

  • gif(动态图):GIF压缩
  • png(静态图):TinyPNG 静态图的压缩处理有两种方式,直接通过上述访问tinypng的官网,将图片资源上传压缩后再下载回来替换到项目中。这种流程相对繁琐。

当然,懒惰驱动技术的创新,哈哈~有些童鞋为我们提供了更便捷的方式,我们可以直接在android studio安装tinypng插件进行图片压缩:

plugin.png

通过Tools--TinyPNG,然后选择相应的文件夹,该插件会自动调用tinypng的服务进行图片压缩,一步到位~

use.png

图片精度保留

只保留drawable-xxhdpi一套超高精度图片,确保大部分机型都可使用而不会模糊

lib文件夹处理

lib文件夹主要存放了我们引用到的一些第三方so库。目前市面上绝大部分的CPU架构都是 ARMv7/ARMv8,可以在gradle中加入配置只保留这两种so库,具体配置如下:

android {
    ...
    defaultConfig {
        ...
        ndk {
            abiFilters "armeabi-v7a", "arm64-v8a"
        }
    }
}

assets文件夹处理

该文件夹是存放不进行编译加工的原生文件,通常会用来存放一些一些图片、音视频、h5等资源文件。对于该文件夹的内容:

  • 确保没有被使用到的资源被及时删除
  • 音视频文件,可以进行压缩,或者更换更优编码的方式

配置优化

我们可以在build.gradle中开启代码混淆和资源缩减,这样子没有被使用到的资源就不会被打包进apk中,具体配置如下:

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
    }
}

对比分析

Analyze APK工具,除了可以分析某个apk的包大小信息外,还提供了一个【Compare with previous APK】,就在该工具的右上角处。选择之前的版本和我们通过上述流程优化后的版本进行对比,发现整体的包大小还是下降了不少~

对比.png

其他方案的一些总结

微信开源工具AndResGuard的使用

AndResGuard是一个帮助你缩小APK大小的工具, 官方文档和地址在:AndResGuard

  • 将原本冗长的资源路径变短
  • 使用7zip对apk进行压缩 当然它有自身的一些局限性,使用需要仔细参考官方文档的说明,以免出现资源查找不到导致的崩溃等问题。

插件化

目前市面上的插件化技术比较多,各有优劣。通过该技术可以让我们将一些附加业务以插件的形式提供给用户,让用户按需下载使用,减少主apk的包大小。这里就不进行细究~