为了优化apk的大小,一般会只选择支持一种ABI,可以在AS中双击apk,在lib路径下查看so文件占用大小

Android ABI概念

Application Binary Interface 官方文档

cpu架构选择

  • arm64-v8a 作为最新一代架构,应该是目前的主流
  • 兼容性越好,则性能越差。兼容性:armeabi>armeabi-v7a>arm64-v8a
  • armeabi armeabi-v7a arm64-v8a 按顺序向下兼容
    举个栗子:
    armeabi 兼容 armeabi-v7a arm64-v8a
    arm64-v8a 不兼容 armeabi armeabi-v7a
1
2
3
4
5
6
7
android {
    defaultConfig {
        ndk {
            abiFilter "armeabi"
        }
    }
}

流程

ABI流程

对于一个 cpu 是 arm64-v8a 架构的手机,它运行 app 时,进入 jnilibs 去读取库文件时,先看有没有 arm64-v8a 文件夹,如果没有该文件夹,去找 armeabi-v7a 文件夹,如果没有,再去找 armeabi 文件夹,如果连这个文件夹也没有,就抛出异常;

如果有 arm64-v8a 文件夹,那么就去找特定名称的 .so 文件,注意:如果没有找到想要的 .so 文件,不会再往下(armeabi-v7a文件夹)找了,而是直接抛出异常。

小孩才做选择,我全都要

ABI 配置多个 APK,官方文档
部分应用市场支持上传多个 apk,比如谷歌

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
android {
  ...
  splits {

    // Configures multiple APKs based on ABI.
    abi {

      // Enables building multiple APKs per 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.

      // Resets the list of ABIs that Gradle should create APKs for to none.
      reset()

      // Specifies a list of ABIs that Gradle should create APKs for.
      include "armeabi", "armeabi-v7a", "arm64-v8a"

      // Specifies that we do not want to also generate a universal APK that includes all ABIs.
      universalApk false
    }
  }
}

其他

  • 如果仅保留 armeabi-v7a,而有些第三方包未提供v7a的包,可以尝试将对应 armeabi 的包拷贝到 armeabi-v7a