1. 主流CPU架构
CPU架构目前主流有x86、ARM、MIPS、PowerPC、RISC-V架构,不同CPU结构具有不同的应用场景和价值。
x86、x86_64架构代表厂商有英特尔和AMD开发,采用复杂指令集设计,指令数量较多,长度较长、功能强大,同时功耗也会更高和更大的芯片面积。主要应用在个人电脑、服务器、工作站等。
ARM架构常见代表厂商有高通、苹果、联发科、华为。采用精简指令集架构,功耗相对于x86功耗更低、体积和成本更小,同时性能没那么强劲。主要应用在移动设备,如手机、平板。以及嵌入式系统、物联网设备等。
MIPS架构也是精简指令集RISC架构,性能较弱,主要用于嵌入式系统、路由器、打印机等。代表厂商有联发科、博通。
PowerPC架构也是RISC架构,处理性能强劲,但功耗高,主要应用在服务器,工作站和游戏机等领域。代表厂商有IBM、摩托罗拉。
RISC-V架构是一种开源RISC架构,处理器功耗低、成本低、可扩展性强,但生态系统尚不完善。主要应用在嵌入式系统、物联网设备等领域。代表厂商为华为、阿里巴巴、中芯国际等。
2. 指令集
这些主流CPU架构有对应的指令集。例如:
- x86架构的指令集称为x86指令集,根据版本号分为x86、x86-64。
- ARM架构的指令集称为ARM指令集,根据版本号分为ARMv5,ARMv6,ARMv7,ARMv8等。
- MIPS架构的指令集称为MIPS指令集,根据版本号分为MIPS16、MIPS32、MIPS64等。
…..
3. ABI
ABI即应用程序二进制接口,定义了一套规则,允许编译好的二进制代码在所有兼容该ABI的操作系统和硬件平台中无需改动就能运行。
我们知道,Android设备的厂商非常多,采用的CPU和指令集的都是有可能不同的,不像苹果手机,一家独大,使用统一的CPU架构和指令集。所以我们编译出来的so文件,就需要有多套,以便更好的适用不同的架构,达到更好的性能。
当一个应用被安装到设备上时,只有该设备支持的CPU架构对应的.so文件会被安装,如果支持多个ABI架构,会按照优先级进行。
目前主流的Android ABI:
- arm64-v8a: 该ABI支持64位ARMv8架构的处理器。ARMv8架构是ARM最新的架构,具有更高的性能和更强的功能。arm64-v8a ABI支持ARMv8架构的完整功能集,包括AArch64指令集。
- armeabi-v7a: 该ABI支持32位ARMv7架构的处理器。ARMv7架构是目前使用最广泛的ARM架构,因此armeabi-v7a也是目前使用最广泛的Android ABI。该ABI支持ARMv7架构的完整功能集,包括NEON指令集。
- armeabi: 该ABI仅支持32位ARMv5和ARMv6架构的处理器。它是最早的Android ABI之一,现在已经很少使用了。
- x86: 该ABI支持32位x86架构的处理器。它主要用于Android模拟器和x86平板电脑。该ABI支持x86架构的完整功能集,包括SSE指令集。
- x86_64: 该ABI支持64位x86_64架构的处理器。它主要用于x86_64平板电脑和Chromebook。该ABI支持x86_64架构的完整功能集,包括AVX指令集。
总结的说,如果要支持尽可能多的设备,选择armeabi-v7a;如果需要更高的性能,采用arm64-v8a。
4. 项目中导入so文件
4.1 将 SO 文件放在 libs 文件夹下
-
将so文件放在libs文件夹下。
app/libs/armeabi-v7a/ app/libs/arm64-v8a/ -
在
app/build.gradle文件添加如下配置:android { ... sourceSets { main { jniLibs { srcDir 'libs' } } } } -
在项目代码中加载so库。例如要加载的名称是
libnative.so的so文件。System.loadLibrary("native")
4.2 使用 jniLibs 文件夹导入
-
将所有so文件放到
jniLibs文件夹下src/main/jniLibs/armeabi-v7a/ src/main/jniLibs/arm64-v8a/ -
在项目代码中加载so库。例如要加载的名称是
libnative.so的so文件。System.loadLibrary("native")
4.3 指定要兼容的架构
android {
...
ndk {
abiFilters "armeabi-v7a", "arm64-v8a"//指定兼容的CPU架构,对应的so文件会被打包,不兼容的so不会打包
}
}
对一些特定的so文件,要排除掉可以采用packagingOptions进行处理。
5. 查看设备支持的ABI
5.1 查看主要ABI
adb shell getprop ro.product.cpu.abi
返回结果:
arm64-v8a
5.2 查看设备支持的ABI列表
adb shell getprop ro.product.cpu.abilist
返回结果:
arm64-v8a,armeabi-v7a,armeabi
6、资源
本文大多数内容参考互联网知识和AI智能,可能存在个人理解错误和偏见,请注意甄别。