Build.CPU_ABI、Build.CPU_ABI2,API level 大于等于21时,使用Build.SUPPORTED_ABIS
一般来说,一个Android设备可以支持多种ABI,设备主ABI和辅助ABI,以arm64-v8a为主ABI的设备,辅助ABI为armeabi-v7a和armeabi,以armeabi-v7a为主ABI的设备,辅助ABI为armeabi,也就是说他是向下兼容的,即arm64-v8a>armeabi-v7a>armeabi。
例如:对于一个cpu是arm64-v8a架构的手机,它运行app时,进入jnilibs去读取库文件时,先看有没有arm64-v8a文件夹,如果没有该文件夹,去找armeabi-v7a文件夹,如果没有,再去找armeabi文件夹,如果连这个文件夹也没有,就抛出异常;
如果有arm64-v8a文件夹,那么就去找特定名称的.so文件,注意:如果没有找到想要的.so文件,不会再往下(armeabi-v7a文件夹)找了,而是直接抛出异常。
Exception:Java.lang.UnsatisfiedLinkError: dlopen failed: library “/***.so” not found
特别需要注意的情况是在命中了文件夹,而未命中so文件这种情况:
例如:第三方aar文件,如果这个sdk对abi的支持比较全,可能会包含armeabi、armeabi-v7a、x86、arm64-v8a、x86_64五种abi,而你应用的其它so只支持armeabi、armeabi-v7a、x86三种,直接引用sdk的aar,会自动编译出支持5种abi的包。但是应用的其它so缺少对其它两种abi的支持,那么如果应用运行于arm64-v8a、x86_64为首选abi的设备上时,就会crash了。
因此,我们需要在我们的app中配置 abiFilter 配置,来避免一些未知的错误。
defaultConfig {
ndk {
abiFilters “armeabi”// 指定ndk需要兼容的ABI(这样其他依赖包里x86,armeabi,arm-v8之类的so会被过滤掉)
}
}
根据ABI向下兼容性的特点,我们可以得出一下这些结论:
因为armeabi-v7a和arm64-v8a会向下兼容:
ye 那我们该如何适配呢?
一、只适配armeabi
二、只适配 armeabi-v7a
能运行在arm64-v8和armeabi-v7a机器上,在性能和兼容二者中比较平衡
三、只适配 arm64-v8
只能运行在arm64-v8上,要放弃部分老旧设备用户,优点就是:性能最佳
这三种方案都是可以的,现在的大厂APP适配中,这三种都有,大部分是前2种方案。 具体选哪一种就看自己的考量了,以性能换兼容就arm64-v8,以兼容换性能armeabi,二者稍微平衡一点的就armeabi-v7a。 最后,根据市场上ABI的占有率情况,我们可以选择第二种方案,性能和兼容二者中比较平衡,一则armeabi类型的手机已经很少了,二则可以兼容armeabi-v7a;若你比较看重性能的也可以选择第一种方案。
abi split,分包就是为每个CPU架构单独打一个APK,为了性能和兼容同时兼得,Google提供了abi split分包的机制:
在gradle 中添加如下配置:
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 “x86”, “x86_64”, “arm64-v8a”, “armeabi”, “armeabi-v7a”
// Specifies that we do not want to also generate a universal APK that includes all ABIs.
universalApk false
}
}
}
然后,就能为每个CPU架构单独打一个APK,该apk 中就只包含一个平台,如下:
这样,又能保证性能,又能不额外增加APK的大小,同时又又很完美的兼容,因为可以为所有架构都单独打一个包,一举多得。
给大家送上我成功跳槽复习中所整理的资料,由于文章篇幅有限,所以只是把题目列出来了,我自己手头上整理的资料均和上面的答案可免费分享,需要这些资料和答案的朋友,可以点击这里免费领取。
%96%AA%EF%BC%81.md)。**
[外链图片转存中…(img-xx6RDFTT-1645161801727)]
[外链图片转存中…(img-Q9Lvgh4z-1645161801727)]