android so文件的作用,Android SO库
查看手机CPU架构:
$adb shell
$cat /proc/cpuinfo
OnePlus6:
AArch64 Processor rev 12 (aarch64)
➜ ~ adb shell
OnePlus6:/ $ cat /proc/cpuinfo
Processor : AArch64 Processor rev 12 (aarch64)
processor : 0
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 1
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 2
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 3
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x7
CPU part : 0x803
CPU revision : 12
processor : 4
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x6
CPU part : 0x802
CPU revision : 13
processor : 5
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x6
CPU part : 0x802
CPU revision : 13
processor : 6
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x6
CPU part : 0x802
CPU revision : 13
processor : 7
BogoMIPS : 38.40
Features : fp asimd evtstrm aes pmull sha1 sha2 crc32 atomics fphp asimdhp
CPU implementer : 0x51
CPU architecture: 8
CPU variant : 0x6
CPU part : 0x802
CPU revision : 13
Hardware : Qualcomm Technologies, Inc SDM845
那么我的OnePlus6的CPU架构是ARM v8 64位
ARM v8 64
ARM v8 64
SO库
image.png
一种CPU架构 = 一种ABI = 一种对应的SO库;
加载SO库时,需要加载对应类型的SO库;
尽量提供全平台CPU类型的SO库支持;
SO库类型和CPU架构类型
现在至少支持以下七种不同的CPU架构:ARMv5,ARMv7,x86,MIPS,ARMv8,MIPS64和x86_64。每一种CPU类型都对应一种ABI(Application Binary Interface),“armeabi-v7a”文件夹前面的“armeabi”指的就是ARM这种类型的ABI,后面的“v7a”指的是ARMv7。这7种CPU类型对应的SO库的文件夹名是:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64。
只提供armeabi架构的.so文件而忽略其他ABIs的
armeabi与armeabi-v7a表示支持不同的CPU类型
armeabi是指的该so库用于ARM的通用CPU,而v7a的CPU支持硬件浮点运算。因此armeabi通用性强,但速度慢,而v7a能充分发挥v7a CPU的能力,在AIR打包APK调试模式adobe选择的是通用性强的armeabi模式。
android支持不同CPU的深层含义
首先从硬件支持方便来看,我们的adnroid设备目前为止大部分都是支持ARM芯片,(当然市面上此刻最新的android机器还支持intel等另外的几个芯片,例如intel最新的凌动项目芯片,就获得了android4.1的青睐)。从android版本与支持ARM硬件编码的程度来看:
起初android1.6:只支持armv4与armv5te指令集。
到了android2.0:增加了支持arm-vfp,armv6,armv6t2指令集。
到了android2.2:增加支持armv7-a指令集。
所以armeabi-v7a 应该是与AIR限定支持android2.2以上的条件有关。android2.2以上能让硬件发挥更大的作用。
我项目中使用armeabi还是armeabi-v7a
对于AIR项目来说性能问题是最大的瓶颈,能优化一点就一点,所以如果接平台方SDK或者写ANE的时候使用到SO库,个人推荐全部放到armeabi-v7a下,而不要为了兼容放到armeabi
当你引入一个.so文件时,不止影响到CPU架构。我从其他开发者那里可以看到一系列常见的错误,其中最多的是"UnsatisfiedLinkError","dlopen: failed"以及其他类型的crash或者低下的性能:
所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件,因此似乎移除其他ABIs的.so文件是一个减少APK大小的好技巧。但事实上并不是:这不只影响到函数库的性能和兼容性。
x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。
以减少APK包大小为由是一个错误的借口,因为你也可以选择在应用市场上传指定ABI版本的APK,生成不同ABI版本的APK可以在build.gradle中如下配置:
android {
...
splits {
abi {
enable true
reset()
include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a' //select ABIs to build APKs for
universalApk true //generate an additional APK that contains all the ABIs
}
}
// map for the version code
project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]
android.applicationVariants.all { variant ->
// assign different version code for each output
variant.outputs.each { output ->
output.versionCodeOverride =
project.ext.versionCodes.get(output.getFilter(com.android.build.OutputFile.ABI), 0) * 1000000 + android.defaultConfig.versionCode
}
}
}
减少SO库体积的正确姿势
构建特定ABI支持的APK
从网络下载当前设备支持的SO库
android so文件的作用,Android SO库相关推荐
- android清单文件的作用,Android 清单文件
每个Android项目都有一个清单文件. 例子 以下代码含有AndroidManifest.xml文件的示例:<?xml version="1.0" encoding=&qu ...
- android bp文件_Android 基础 | Android.bp 语法浅析
相关推荐: 随着 android 工程越来越大,包含的 module 越来越多,以 makefile 组织的项目编译花费的时间越来越多.Google 在 7.0 引入了 ninja 是 Google ...
- android主要文件的作用是什么,androidmanifest.xml文件的作用是什么
androidmanifest.xml文件的作用:1.是每个android程序中必须的文件,它位于整个项目的根目录:2.配置程序运行所必要的组件,权限,以及一些相关信息:3.是整个应用的入口,所以有助 ...
- android mkdirs 不起作用,Android mkdirs()创建一个零字节文件而不是文件夹
在我的 Android应用程序中,我试图在SD卡上创建以下文件夹: /mnt/sdcard/OSGiComponents/admin/felix-cache/ 这是代码: File cacheDir ...
- [Android]Android布局文件中的android:id=@*属性使用方法汇总以及介绍
由于项目需要进行Android开发,因此一边开发,一边查阅资料,一边总结了Android布局文件中android:id="@*"属性的使用方法汇总以及介绍.id资源的引用 andr ...
- android bp文件_理解Android.bp
介绍Android最新的编译系统 一.简介 早期的Android系统都是采用Android.mk的配置来编译源码,从Android 7.0开始引入Android.bp.很明显Android.bp的出现 ...
- xamarin Android 开发 文件“obj\Debug\android\bin\packaged_resources”不存在
严重性 代码 说明 项目 文件 行 禁止显示状态 错误 文件"obj\Debug\android\bin\packaged_resources"不存在. AndroidTest 各 ...
- android 读写文件 简书,Android 中的文件操作
Android 文件操作 概述 Android 中的文件操作主要涉及到两个部分,一个是内部存储的读写,一个是外部存储的读写两者的主要区别如下表: 内部存储 外部存储 始终可用 它并非始终可用,因为用户 ...
- android手机文件储存地址,Android手机缓存的位置
在Android手机里面,缓存的位置分为两类,一类是Internal Storage,即内部存储,另外一类是External Storage,即外部存储. 比较老的手机,有一个手机内部存储,还有一个S ...
最新文章
- “35岁才是一个程序员成熟的开始!”
- obj + mtl 格式说明
- python爬虫反爬 对方是如何丧心病狂的通过css_如何应对网站反爬虫策略?如何高效地爬大量数据?...
- pandas常用函数,个人常用的
- 服务器母鸡系统,母鸡云服务器
- create-react-app入门教程
- HDU 5306 线段树
- 《深入理解Nginx》 学习笔记(一)
- 编程语言为什么不能用中文
- 最强代码审查工具报告
- spring-boot2 + vue2+ element-ui2 + avue 通用架构 xijia-plus (兮家 plus)
- excel保存快捷键_Excel新手必备的5大技巧,看看你会几个?(附26个超实用快捷键)
- MATLAB绘制圆、椭圆、矩形等基本平面图形
- ubuntu-CPU频率调节
- linux服务器中毒挖矿,Linux服务器中挖矿病毒 二
- MySQL8.0.22安装及配置(超详细)
- 在PHP中使用Mockery进行测试驱动开发(TDD) - 上
- 分享Python简短代码,实现TXT转换MySQL文件。
- XCTF sherlock WP
- 很值得收藏的安卓开源控件库