android so 库兼容性

Android 设备的CPU类型(通常称为”ABIs”)

  1. armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年15月以后的生产的大部分Android设备都使用它。
  2. arm64-v8a: 第 8 代、64 位 ARM 处理器,很少设备,三星 Galaxy S6 是其中之一。
  3. armeabi: 第 5 代、第 6 代的 ARM 处理器,早期的手机用的比较多。
  4. x86: 平板、模拟器用得比较多。
  5. x86_64: 64 位的平板。

android so库的兼容性

对于 CPU 来说,不同的架构并不意味着一定互不兼容,根据目前 Android 共支持七种不同类型的 CPU 架构,其兼容特点可总结如下:

  • armeabi 设备只兼容 armeabi;
  • armeabi-v7a 设备兼容 armeabi-v7a、armeabi;
  • arm64-v8a 设备兼容 arm64-v8a、armeabi-v7a、armeabi;
  • X86 设备兼容 X86、armeabi;
  • X86_64 设备兼容 X86_64、X86、armeabi;
  • mips64 设备兼容 mips64、mips;
  • mips 只兼容 mips;

根据以上的兼容总结,我们还可以得到一些规律:

  • armeabi 的 SO 文件基本上可以说是万金油,它能运行在除了 mips 和 mips64 的设备上,但在非 armeabi 设备上运行性能还是有所损耗;
  • 64 位的 CPU 架构总能向下兼容其对应的 32 位指令集,如:x86_64 兼容 X86,arm64-v8a 兼容 armeabi-v7a,mips64 兼容 mips。

App 中可能出错的地方

处理 .so 文件时有一条简单却并不知名的重要法则。

你应该尽可能的提供专为每个 ABI 优化过的 .so 文件,但要么全部支持,要么都不支持:你不应该混合着使用。你应该为每个 ABI 目录提供对应的 .so 文件。

当一个应用安装在设备上,只有该设备支持的 CPU 架构对应的 .so 文件会被安装。在 x86 设备上, libs/x86 目录中如果存在 .so 文件的话,会被安装,如果不存在,则会选择 armeabi-v7a 中的 .so 文件,如果也不存在,则选择 armeabi 目录中的 .so 文件(因为 x86 设备也支持armeabi-v7a 和 armeabi)。

其他地方也可能出错

当你引入一个 .so 文件时,不止影响到 CPU 架构。我从其他开发者那里可以看到一系列常见的错误,其中最多的是"UnsatisfiedLinkError",“dlopen: failed” 以及其他类型的 crash 或者低下的性能

gradle 编译

现在很多 Android 第三方 sdk 是以 aar 形式提供的,甚至是远程 aar,如果这个 sdk 对 abi 的支持比较全,可能会包含 armeabi, armeabi-v7a,x86, arm64-v8a,x86_64 五种 abi,而你应用的其它 so 只支持armeabi,armeabi-v7a,x86 三种,直接引用 sdk 的 aar,会自动编译出支持 5 种 abi 的包。

比如播放 gif 动画图片的署名开源库:android-gif-drawable

dependencies {
    compile 'pl.droidsonroids.gif:android-gif-drawable:1.2.7'
}

但有时我们只需要其中某个或某几个 abi 的分辨率,这怎么实现呢,可以使用以下方法:

build.gradle 的 android 里的 defaultConfig 内添加如下内容:

defaultConfig {  
    ndk {  
        abiFilters "armeabi", "armeabi-v7a", "x86"  
    }  
}  
文章目录
  1. 1. android so库的兼容性
  2. 2. App 中可能出错的地方
  3. 3. gradle 编译
|