APK分包——splits

941 阅读3分钟

「这是我参与2022首次更文挑战的第3天,活动详情查看:2022首次更文挑战」。

此分包非彼分包,此处指的是按照指定的维度分别打包不同的apk,如:分辨率、ABI、语言等。

当一个APP需要尽可能支持多的目标设备,通常需要许多文件来支持不同的屏幕分辨率、ABI等。如果打包APK不加以限制,就会导致APK文件特别大。所以gradle提供了splits工具,可以按照我们指定维度分别打包apk。

使用

在build.gradle文件的android代码块中添加:

android {
  ...
  splits {

    // Configures multiple APKs based on screen density.
    density {

      // Configures multiple APKs based on screen density.
      enable true

      // Specifies a list of screen densities Gradle should not create multiple APKs for.
      exclude "ldpi", "xxhdpi", "xxxhdpi"

      // Specifies a list of compatible screen size settings for the manifest.
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }
}

针对屏幕密度配置多个APK

如需针对不同的屏幕密度创建单独的 APK,请在 splits 代码块内添加一个 density 代码块。

splits {

    // 根据屏幕分辨率密度维度生成多个APK
    density {

      // 是否起作用,false可以关闭
      enable true

      // 不包含的屏幕密度,设置之后不会对此屏密度单独生成apk
      exclude "ldpi", "xxhdpi", "xxxhdpi"
          
      // reset()与include通常一起使用,reset清空屏密度列表
      reset()
      // 为指定屏密度生成apk
      include "ldpi", "xxhdpi"

      // Specifies a list of compatible screen size settings for the manifest.
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }

针对 ABI 配置多个 APK

如需针对不同的 ABI 创建单独的 APK,请在 splits 代码块内添加一个 abi 代码块。

abi {

      // 同上
      enable true

      // By default all ABIs are included, so use reset() and include to specify that we only
      // want APKs for x86 and x86_64.

      // 清空ABI列表,配合include使用
      //默认会支持所有ABI列表,所以需要清空列表
      reset()
      // Specifies a list of ABIs that Gradle should create APKs for.
      include "x86", "x86_64"

      // 是否生成通用apk包,包含所以ABI目录
      universalApk false
    }

构建多个 APK

...
  splits {
    density {
      enable true
      reset()
      include "mdpi", "hdpi"
    }
    abi {
      enable true
      reset()
      include "x86", "x86_64"
    }
  }

上述示例配置的输出包括以下 4 个 APK:

  • app-hdpiX86-release.apk:仅包含适用于 hdpi 密度和 x86 ABI 的代码和资源。
  • app-hdpiX86_64-release.apk:仅包含适用于 hdpi 密度和 x86_64 ABI 的代码和资源。
  • app-mdpiX86-release.apk:仅包含适用于 mdpi 密度和 x86 ABI 的代码和资源。
  • app-mdpiX86_64-release.apk:仅包含适用于 mdpi 密度和 x86_64 ABI 的代码和资源。

APK 文件名格式

该方案由下面几部分组成:

  • modulename

    指定正在构建的模块名称。

  • screendensity

    如果启用了针对屏幕密度的多 APK 构建,应指定 APK 对应的屏幕密度,如“mdpi”。

  • ABI

    如果启用了针对 ABI 的多 APK 构建,应指定 APK 对应的 ABI,如“x86”。如果启用了同时针对屏幕密度和 ABI 的多 APK 构建,Gradle 会将密度名称与 ABI 名称连接起来,例如“mdpiX86”。如果针对按 ABI 生成的 APK 启用了 universalApk,Gradle 会将“universal”用作通用 APK 文件名的 ABI 部分。

  • buildvariant

    指定正在构建的构建变体,如“debug”。

例如,为调试版本的“myApp”构建 mdpi 屏幕密度 APK 时,APK 文件名为 myApp-mdpi-debug.apk。对于配置为同时针对 mdpi 屏幕密度和 x86 ABI 构建多个 APK 的发布版本的“myApp”,APK 文件名为 myApp-mdpiX86-release.apk