APK瘦身

APK文件的构成

瘦身方法

移除未使用资源

可以通过IDE提供的建议,和lint检查工具检测出未使用的资源、无用的import、字段、方法、类,然后删掉。

如何保护必须资源

lint 工具不会扫描 assets/ 文件夹、通过反射引用的资源或已链接至应用的库文件。此外,它也不会移除资源,只会提醒您它们的存在。

那么有些资源暂时用不到,我们又需要保留的,可以通过创建一个包含<resources>的xml文件:

1
2
3
4
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
tools:discard="@layout/unused2" />

这两个属性都接受逗号分隔符和*号通配符。

启用资源缩减

指定本地化语言

如果使用了包含了语言的库(如AppCompat),那么打包的时候会把所有已翻译的语言的字符串都打包进去。

所以我们可以指定需要的语言来缩减apk体积:

1
2
3
4
5
6
android {
  defaultConfig {
    ...
    resConfigs "zh-rCN"
  }
}

指定需要的动态库so

1
2
3
4
5
6
7
android{
  defaultConfig{
    ndk{
      abiFilters "armeabi-v7a"
    }
  }
}

armeabi-v7a兼容arm64架构,但是不如arm64的so性能高。我们可以配合productFlavorflavorDimensions来分别针对arm和arm64设备来打包。

图片瘦身

可以使用webp替代png和jpg,可以使用VectorDrawable矢量图替代应用图标。

可以通过ImageView的tint属性前台改色,达到复用图片的目的。

开启本地库压缩

1
2
3
4
5
6
7
8
<application
        android:name="io.flutter.app.FlutterApplication"
        android:extractNativeLibs="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network_security_config"
        android:requestLegacyExternalStorage="true"
        android:usesCleartextTraffic="true">

android:extractNativeLibs = true时,gradle打包会对工程中的so进行压缩,使最终生成的apk体积变小。但用户在安装过程中,系统会对so库解压,从而造成apk安装时间变长。