ABI 是什么
在Android编码时候 ,我们经常会看到ABI 。ABI的意思是 Application Binary Interface 的缩写。
不同 Android 手机使用不同的 CPU,因此支持不同的指令集。CPU 与指令集的每种组合都有其自己的应用二进制界面(或 ABI)。 ABI 可以非常精确地定义应用的机器代码在运行时如何与系统交互。 您必须为应用要使用的每个 CPU 架构指定 ABI。
常用的abi有:
- armeabi 对应着 ARMV5和ARMV6架构
- armeabi-v7a - 对应着 ARMV7a架构,是32位的寻址长度,里面放置32位系统上运行的so库
- armeabi-v8a - 对应着 ARMV8架构,64位寻址长度,里面放置64位的so
- x86 对应 x86架构(PC机的架构),里面放置x86上运行的so
- x86_64 对应着x86_64架构,里面放置x86_64上运行的so
可以通过Build.SUPPORTED_ABIS得到根据偏好排序的设备支持的ABI列表。
因为Android包管理器安装APK时,会自动选择APK包中为对应系统ABI预编译好的.so文件,不同的ABI,针对不同的cpu架构有不同的优先权例如: x86设备上,libs/x86目录中如果存在.so文件的话,会被安装,如果不存在,则会选择armeabi-v7a中的.so文件,如果也不存在,则选择armeabi目录中的.so文件。x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。
image.png
64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)
如何区分64位app 和32位app
当下载安装一个App之后,从Launcher启动该应用,系统会由Zygote分叉出一个子进程来提供App运行的虚拟机和Runtime环境。
与32位系统不同的是,在64系统中会同时存在两个Zygote进程——zygote和zygote64,分别对应32位和64位应用。
所以,要进行App的32/64位检测,只需要看它的父进程是哪个Zygote即可。