安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)[通俗易懂]

安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)[通俗易懂]背景Android系统本质是一个经过改造的Linux系统,so库是Linux系统上使用的共享库(类似windows上的dll)。最早,Android系统只支持ARMv5的CPU构架,随着Android系统的发展,又加入了ARMv7(2010),x86(2011),MIPS(2012),ARMv8,MIPS64和x86_64(2014)。每一种CPU构…

大家好,又见面了,我是你们的朋友全栈君。

背景

Android 系统本质是一个经过改造的 Linux 系统,so库是Linux系统上使用的共享库(类似windows上的dll)。最早,Android 系统只支持 ARMv5 的 CPU 构架,随着 Android 系统的发展,又加入了 ARMv7 (2010), x86 (2011), MIPS (2012), ARMv8, MIPS64 和 x86_64 (2014)。每一种 CPU 构架,都定义了一种 ABI(Application Binary Interface),ABI 决定了二进制文件如何与系统进行交互。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IfB5m8yJ-1592650237349)(https://upload-images.jianshu.io/upload_images/6169789-ea3357514e3dc870.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

安卓工程中配置支持的平台类型

下面样例表示支持armeabi、armeabi-v7a和arm64-v8a

defaultConfig {
        ndk {
            abiFilters 'armeabi','armeabi-v7a','arm64-v8a'
        }
    }

为什么要设置ndk的abiFilters?

其实这个可以不设置,这样编译时,就会将项目里所有依赖资源包里的so库都打到最终的apk里。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VWncJqkm-1592650237351)(https://upload-images.jianshu.io/upload_images/6169789-f9f74c59aef798ba.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
但是有些平台,我们是不需要支持的,如果不删除的话,apk就臃肿了。如果那些so库是我们自己编译出来的,那可以直接在工程中删除对应so文件,但是如果是第三方提供的,就不好删除了,所以就需要使用abiFilters来过滤了。

如果需要针对不同的平台出不同的包,可以在productFlavors里进行设置,可参考文章:https://blog.csdn.net/hknock/article/details/76034125

armeabi、armeabi-v7a、arm64-v8a的兼容性问题

看上上面的描述,以为新增一个so库文件可以随便根据需要适配的目录放,就错了。如果你有库文件在armeabi里有,但是armeabi-v7a目录下没有,那么运行在V7a的架构时,就会出现找不到so库文件的情况。具体描述参照:Android 关于arm64-v8a、armeabi-v7a、armeabi、x86下的so文件兼容问题

正确的做法

  1. 当前市面绝大多数是arm的CPU,而且都是V7架构的了,所以可以保留armeabi或者armeabi-v7a即可。
  2. 如果仅保留armeabi-v7a,而有些第三方包未提供v7a的包,则可以将对应armeabi包拷贝到armeabi-v7a。
  3. 如果同时保留armeabi和armeabi-v7a,则需要保证两个目录下的so库文件数相同。

关于我

厦门大学计算机专业 | 前华为工程师
分享编程技术,没啥深度,但看得懂,适合初学者。
Java | 安卓 | 前端 | 小程序 | 鸿蒙
公众号:花生皮编程
安卓项目中so库选择(ndk abiFilters设置,armeabi,armeabi-v7a,arm64-v8a)[通俗易懂]

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/143549.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cpu overclocking_cpu memory overclocking

    cpu overclocking_cpu memory overclockingWhydoeskworkerhogyourCPU?TofindoutwhyakworkeriswastingyourCPU,youcancreateCPUbacktraces:watchyourprocessorload(withtoporsomething)andinmomentsofhighloadthroughkworker,executeechol>/proc/sysrq-triggertocreatea

    2022年9月16日
    0
  • latex大括号错位显示_LaTeX表格

    latex大括号错位显示_LaTeX表格amsmath中\smash妙用样例-大括号错位显示。原始大括号显示\[\text{机器学习}\begin{cases}\text{~~监督学习~}{\begin{cases}\text{回归算法}\\\text{分类算法}{\begin{cases}\text{生成模型}\\\text{判别模型}\end{cases}}

    2022年10月11日
    0
  • 项目复盘/总结模板

    项目复盘/总结模板复盘会议的安排、步骤及意义什么是复盘?为何要复盘?WHAT?复盘,是行动后的深刻反思和经验总结,是一个不断学习、总结、反思、提炼和持续提高的过程。复盘是企业文化、是行动学习、是提升组织智慧的重

    2022年8月3日
    5
  • Python模拟一个用户登录系统

    Python模拟一个用户登录系统题目:模拟一个用户登录系统,用户输入用户名和密码,输入正确即可进入系统直接上代码:#模拟一个用户登录系统,用户输入用户名和密码,输入正确即可进入系统d=[‘yao’,’123456′]while1:name=input("请输入用户名:")ifnameind:breakelse:print("你输入的用户名不存在,请…

    2022年5月17日
    43
  • java.library.path_java的path的设置路径

    java.library.path_java的path的设置路径添加Handler:me.add(new ContextPathHandler(“ctx”)),然后在页面中就可以${ctx}来用代码如下:找不到代码写在哪里的,请在整个工程中搜索configHandlerconfig: /** *配置处理器 */ publicvoidconfigHandler(Handlersme){ me.add(newCont

    2022年9月16日
    0
  • SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit「建议收藏」

    SqlBulkCopy 来自数据源的 String 类型的给定值不能转换为指定目标列的类型 bit「建议收藏」使用SqlBulkCopy批量插入,可以快速对大批量的数量插入,性能非常好在使用时出现“来自数据源的String类型的给定值不能转换为指定目标列的类型bit”异常为DataTable与要插入的数据表字段位置不一样所至DataTable与要插入的数据表要字段名,位置,数据类型都一至才可示例,使用使用SqlBulkCopy插入多个表publicbo…

    2022年7月20日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号