Android中的ABI以及对应CPU的版本说明

一. Android中的ABI

ABI是Application Binary Interface的缩写。

ABI常表示两个程序模块之间的接口,且其中一个模块常为机器码级别的library或操作系统。

ABI定义了函数库的调用、应用的二进制文件(尤其是.so)如何运行在相应的系统平台上等细节。

Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。

二. Android中的CPU

不同的Android设备使用支持不同指令集的CPU。

Android目前有以下七种cpu架构:ARMv5、ARMv7、ARMv8、x86、x86_64、MIPS和MIPS64。

三. Android中的ABI与CPU

每种CPU架构都有其自己支持的ABIs。可通过Build.SUPPORTED_ABIS得到根据偏好排序的设备支持的ABI列表。

表中的数字表示最终选择安装的ABI的优先级,1为最高。

每种CPU架构都有自己对应的最优ABI。

应用安装到设备时,只有该设备的CPU架构支持的最优so库才会被安装。

如:x86架构的设备支持x86、armeabi-v7a和armeabi等ABI。但优先级从高到低依次为x86、armeabi-v7a、armeabi。系统会根据此顺序寻找首个可用的最优的so库,找到则结束。

x86设备包含ARM模拟层,能够很好地运行ARM类型的so库,但并不保证100%不发生Crash。

64位设备(arm64-v8a, x86_64,mips64`)能够运行32位的so库。但是以32位模式运行时,会丢失专为64位优化过的性能特征(ART, WebView, Media, etc.)。

四. NDK兼容性

NDK平台不是向后兼容(兼容过去的版本)的,而是向前兼容(兼容未来的版本)的。

NDK编译的版本应该尽量使用较低的版本,如minSdkVersion=“8”。

五. Android中的so库

1. so库的名称和文件名

so库的名称可任意,如dreamhai。

so库的文件名必须以lib开头。如libdreamhai.so,其中lib是必要前缀,dreamhai才是这个库的名称。

2. so库文件的路径

在Android Studio中的路径:

默认要放在模块/src/<SourceSet>/jniLibs/<ABI>/下。如:将so库放在app/src/main/jniLibs/armeabi。

可在模块的build.gradle中修改配置指定so库的路径。如,将so库放在app/libs/armeabi下,并修改配置如下:

在Eclipse中的路径:放在libs/<ABI>下。

在Android系统中的路径:/data/data/<应用包名>/lib/下。在aar包中的路径:jni/<ABI>下。

3. so库的代码加载

System.loadLibrary(“so库的名称”);如System.loadLibrary(“daking”);会加载该应用下的libdreamhai.so文件。

System.load(“so库文件的全路径”);如System.load("/data/data/com.daking.app.demo/libdaking.so");会加载包名为com.daking.app.demo的应用的libdreamhai.so文件。

4. so库的使用建议

理论上应该为每个ABI目录提供对应的so库。但是Android支持7种ABI,若全部支持,必然导致APK包过大。

一般只保留armeabi、armeabi-v7a这两个ABI的so库。

mips/mips64:极少用于手机,可忽略。

x86/x86_64:x86架构的手机的市场占有率很低,约为1%左右。而且x86架构都包含ARM模拟层,兼容ARM类型的ABI。注意,模拟器为x86架构。

arm64-v8a:64位ARM架构。可用32位模式运行armeabi-v7a和armeabi。

armeabi-v7a:截止于2017年2月,目前主流版本AMRv7。

armeabi:老版本ARMv5,但仍需要兼容。

通过上面的分析,不难发现,只要提供armeabi便可兼容新/旧设备。但armeabi缺少对浮点数机器的支持,存在性能瓶颈。应该将armeabi目录中的so库拷贝一份到armeabi-v7a目录中。

六.总结:

为了减小apk体积,只保留armeabi和armeabi-v7a两个目录,并保证这两个目录中so库数量一致。

对只提供armeabi版本的第三方so库,原样复制一份到armeabi-v7a目录中。

七. so库的常见错误

使用高版本编译出的so库运行在低版本的平台上会出错。考虑到NDK是向前兼容的,应使用低版本编译。

so库放置的路径有误。

没有在每个生效的ABI目录下放置对应的so库。

若某应用有armeabi和arm64-v8a两个ABI目录,armeabi目录里有a.so和b.so,但arm64-v8a只有a.so。

当ARMv8设备在安装此应用时,根据ABI优先级,首先发现arm64-v8a目录存在,并决定使用此ABI下的so库。

但arm64-v8a目录中没有b.so,于是报错。

此时的解决方案有:一,删除arm64-v8a目录;二,arm64-v8a目录的so库情况要与armeabi一致。

八. 工具

Native Libs Monitor,监控设备上所有已安装的App,列出它们apk中包含的so库以及检测出最终安装到的so库。

原文链接:https://blog.csdn.net/Dreamhai/article/details/109891208

(0)

相关推荐

  • 编译libmp3lame到Android

    创建一个根目录,随便起个名字.然后里面再创建一个jni目录,必须是这个名字,然后去官网上下载最新版3.99,解压以后把里面的libmp3lame和include目录复制到jni目录下: 然后在jni目 ...

  • JNI系列教程三

    3.1 背景 谈到JNI的使用场景,最常用的就是android NDK的编写了.首先从http://developer.android.com/ndk/downloads/index.html#dow ...

  • android中wifi原理及流程分析(很经典)

    在网上找的一篇好文章,分析的很详细,自己再加了些东西,图片有点大,不能完全显示,点击图像拖动鼠标直接查看图像. wifi相关的文件位置: WIFI Settings应用程序位于 packages/ap ...

  • Android中Cookie获取、保存以及同步

    Android中Cookie获取、保存以及同步

  • Android中的Service,潜在的服务者。

    前言年前因为疫情以及个人原因辞职以后,很久没有工作了.终于在休息了大半年后,准备回到手敲代码的生活中去,开始着手准备自己的简历和面试等等.在面试过程中,被面试官问到了最基本的问题:"介绍一下 ...

  • [干货] Android 中的 Calendar,听说你有这样的需求

    小生原创,请注意打赏哈! 1 android-times-square Standalone Android widget for picking a single date from a calen ...

  • 三步掌握 Android 中的 AIDL

    第一步 创建 aidl 接口文件 AndroidStudio 中直接右键创建,或者自己一步步建目录喽. 创建完成后会生成一个 XXX.aidl接口文件,我们需要根据需求在这个接口类中添加接口. 在看接 ...

  • Android 中的工厂模式(减少 if-else 和 switch-case)

    前言 Android 中的工厂模式,目的就是减少 if-else 和 switch-case 的出现,梳理代码的条理,使逻辑更加清晰,下面直接上代码: 1.首先新建一个接口,用来监听我们的操作 pub ...

  • Android 中.aar文件生成方法与用法

    前言 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Java Archive,即java归档文件. 在用AS的过程中,你会发现有aar这 ...

  • 【Android】线程/进程绑定指定CPU核

    code小生,一个专注 Android 领域的技术平台 公众号回复 Android 加入我的安卓技术群 作者:尛尛球 链接:https://blog.csdn.net/a569503963/artic ...

  • Android中的Fragment使用详解之页面加载

    静态加载 1.Fragment布局 <?xml version='1.0' encoding='utf-8'?> <LinearLayout xmlns:android='http: ...