Android中的ABI
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列表。
| CPU(纵向)/ABI(横向) | armeabi | armeabi-v7a | arm64-v8a | x86 | x86_64 | mips | mips64 |
|---|---|---|---|---|---|---|---|
| ARMv5 | 支持(1) | ||||||
| ARMv7 | 支持(2) | 支持(1) | |||||
| ARMv8 | 支持(3) | 支持(2) | 支持(1) | ||||
| x86 | 支持(3) | 支持(2) | 支持(1) | ||||
| x86_64 | 支持(4) | 支持(3) | 支持(2) | 支持(1) | |||
| MIPS | 支持(1) | ||||||
| MIPS64 | 支持(2) | 支持(1) |
表中的数字表示最终选择安装的ABI的优先级,1为最高。
- 每种CPU架构都有自己对应的最优ABI。
| CPU架构 | 最优ABI |
|---|---|
| ARMv5 | armeabi |
| ARMv7 | armeabi-v7a |
| ARMv8 | arm64-v8a |
| x86 | x86 |
| x86_64 | x86_64 |
| MIPS | mips |
| MIPS64 | mips64 |
-
应用安装到设备时,只有该设备的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库
so库的名称和文件名
-
so库的名称可任意,如daking。
-
so库的文件名必须以lib开头。如libdaking.so,其中lib是必要前缀,daking才是这个库的名称。
so库文件的路径
-
在Android Studio中的路径:
默认要放在
模块/src/<SourceSet>/jniLibs/<ABI>/下。如:将so库放在app/src/main/jniLibs/armeabi。可在模块的
build.gradle中修改配置指定so库的路径。如,将so库放在app/libs/armeabi下,并修改配置如下:
android {...sourceSets {main {jniLibs.srcDirs = ['libs']}}
}
-
在Eclipse中的路径:
放在
libs/<ABI>下。 -
在Android系统中的路径:
/data/data/<应用包名>/lib/下。 -
在aar包中的路径:
jni/<ABI>下。
so库的代码加载
-
System.loadLibrary("so库的名称");如System.loadLibrary("daking");会加载该应用下的
libdaking.so文件。 -
System.load("so库文件的全路径");如System.load("/data/data/com.daking.app.demo/libdaking.so");会加载包名为
com.daking.app.demo的应用的libdaking.so文件。
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一致。
- 若某应用有armeabi和arm64-v8a两个ABI目录,armeabi目录里有
工具
- Native Libs Monitor,监控设备上所有已安装的App,列出它们apk中包含的so库以及检测出最终安装到的so库。
相关文章:
Android中的ABI
Android中的ABI ABI是Application Binary Interface的缩写。 ABI常表示两个程序模块之间的接口,且其中一个模块常为机器码级别的library或操作系统。 ABI定义了函数库的调用、应用的二进制文件(尤其是.so)如何运行在相应的系统平台上等细节…...
Python爬虫在用户行为模型构建中的应用与挑战
嗨,大家好!作为一名专业的爬虫代理,我今天要和大家分享一些关于爬虫与人类行为分析的知识。在数字化时代,我们每天都在互联网上留下大量的数据痕迹,通过分析这些数据,我们可以理解用户行为、性偏好和需求&a…...
LangChain与大模型的学习
这里写目录标题 问题记录1、库的版本问题 实例记录1、公司名生成2 提示模板的使用3LLM Chain 参考资料 问题记录 1、库的版本问题 openai.error.APIConnectionError: Error communicating with OpenAI: HTTPSConnectionPool(hostapi.openai.com, port443): Max retries excee…...
C语言标准定义的32个关键字
欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 …...
PE半透明屏是怎么制造的?工艺、材料、应用
PE半透明屏是一种新型的屏幕材料,具有半透明的特点。 它由聚乙烯(PE)材料制成,具有良好的透明度和柔韧性。PE半透明屏广泛应用于建筑、广告、展览等领域,具有很高的市场潜力。 PE半透明屏的特点之一是其半透明性。 它…...
linux文本三剑客---grep,sed,awk
目录 grep 什么是grep? grep实例演示 命令参数: 案例演示: sed 概念: 常用选项: 案例演示: awk 概念: awk常用命令选项: awk变量: 内置变量 自定义变量 a…...
leaflet-uniapp 缩放地图的同时 显示当前缩放层级
记录实现过程: 需求为移动端用户在使用地图时,缩放地图的同时,可以获知地图此时缩放的级别。 效果图如下:此时缩放地图级别为13 map.on() 有对应的诸多行为 查看官网即可,这里根据需要为--zoomstart zoom zoomend 代…...
[Securinets CTF Quals 2023] Admin Service,ret2libc,One is enough
只作了3个pwn,第4个附件没下下来,第5个不会 Admin Service 这是个最简单的题,最后来弄出来。原来只是看过关于maps文件的,一直没什么印象。 题目一开始设置seccomp禁用execv等,看来是用ORW,然后建了个mm…...
计算机组成原理-笔记-第二章
二、第二章——数据的表示和运算 1、进位制度(二进制、十进制) 2、BCD码(余三码、2421码) 编码方式 功能 好处 弊处 BCD码 将每个十进制数码转换为4位二进制码 精度高,适合直接用于数码管或LED等显示设备 编码…...
mysql大量数据导入记要
需求描述 在工作中经历过两个项目要对数据库中的数据做大量数据的导出,转换和导入的工作。对于不涉及数据格式转换的导出导入工作,一般都是数据的备份。这个工作一般都由DBA搞定。对于要进行格式转换的工作,一般还是要由程序员参与。除非DBA…...
极狐GitLab 全新「价值流仪表盘」使用指南
本文来源:about.gitlab.com 作者:Haim Snir 译者:极狐(GitLab) 市场部内容团队 GitLab / 极狐GitLab 价值流仪表盘的使用相对简单,这种可以定制化的仪表盘能够让决策者识别数字化转型进程中的趋势及机遇。 如果你已经在用 GitLab…...
通过logrotate实现nginx容器内日志按天存储
场景 最近底层api需要上集群,于是用nginx做了转发,但是随着时间的增长,nginx的日志越来越大,磁盘空间也顶不住了,于是需要对日志进行分割,由于nginx原生是不支持日志按天存储和分割的,网上也介…...
广东珠海电子行业导入MES系统需要注意什么
一、电子行业工厂的生产特征 1.高度自动化: 电子行业的生产车间大多采用高度自动化的生产设备制造工艺。自动化流水线能够实现高效、精准和连续的生产过程,提升产品完整性和生产率。 2.多样化和个性化定制需求: 电子产品市场的需求多样化&…...
小红书2023/08/06Java后端笔试 AK
T1(模拟、哈希表) #include <bits/stdc.h>using namespace std;typedef long long LL; typedef pair<string, int> PSI;const int N 1e5 10;void solve() {string line, t;getline(cin, line);line ;vector<PSI> ans;unordered_m…...
3、有序数组的平方
有一个有序数组从大到小排列:-10 -5 1 2 3 4,将他们的每一项平方,然后再形成新的有序数组。 解法:双指针 因为前面是负数,后面是正数,平方和的最大值一定是从两端取得,所以可以定义一个头指针和…...
用于自然语言处理 (NLP) 的 MLOps
介绍 自然语言处理( NLP )的人工智能关注的是计算机和人们如何用日常语言进行交流。鉴于 NLP 模型在生产系统中的部署,我们需要简化 NLP 应用程序的不断使用,从而使 MLOps(机器学习操作)对 NLP 有所帮助。在生产系统中自动创建、训练、测试和部署 NLP 模型是 MLOps for …...
C#抽象静态方法
抽象静态方法 在C# 11中,引入了对抽象静态接口成员的支持。这个特性可以让你在接口中定义静态抽象方法、属性、或事件。具体来说,一个接口可以定义一个或多个抽象静态成员,这些成员没有具体的实现。任何实现该接口的类或结构必须提供这些成员…...
小研究 - Mysql快速全同步复制技术的设计和应用(一)
Mysql半同步复制技术在高性能的数据管理中被广泛采用,但它在可靠性方面却存在不足.本文对半同步复制技术进行优化,提出了一种快速全同步复制技术,通过对半同步数据复制过程中的事务流程设置、线程资源合理应用、批量日志应用等技术手段&#…...
HTML <samp> 标签
定义和用法 以下元素都是短语元素。虽然这些标签定义的文本大多会呈现出特殊的样式,但实际上,这些标签都拥有确切的语义。 我们并不反对使用它们,但是如果您只是为了达到某种视觉效果而使用这些标签的话,我们建议您使用样式表&a…...
C之(8)linux动态库编译框架
C之(8)Linux动态库编译基础框架 Author: Once Day Date:2023年8月5日 漫漫长路,有人对你微笑过嘛… 参考引用文档: VERSION (LD) (sourceware.org)Warning Options (Using the GNU Compiler Collection (GCC))All about symbo…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
