一.android目前有几种cpu架构?

早期的Android系统几乎只支持ARMv5的CPU架构,目前支持七种CPU架构:ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64 (从2014年起),每一种都关联着一个相应的ABI。对应的ABI依次是:armeabi,armeabi-v7a,x86,mips,arm64-v8a,mips64,x86_64,对应Android app工程中so库的不同目录。

二.需要每种架构的so库都放全吗?

看so库的来源,是第三方提供的,还是自己开发的。

1.倘若是集成第三方sdk,最好将它提供的都拷贝到项目中。(但是基本很少提供全面so库支持的)

2.倘若是自己开发的 ,那就根据自己的情况,编译出对应版本的so库。

三.每种机型只能加载一种适合自己版本的so库吗?

很多设备都支持多于一种的ABI。例如ARM64和x86设备也可以同时运行armeabi-v7a和armeabi的二进制包。但最好是针对特定平台提供相应平台的二进制包,这种情况下运行时就少了一个模拟层(例如x86设备上模拟arm的虚拟层),从而得到更好的性能(归功于最近的架构更新,例如硬件fpu,更多的寄存器,更好的向量化等)。

四.如何查看当前设备支持那些版本的so库?

可以通过Build.SUPPORTED_ABIS得到根据偏好排序的设备支持的ABI列表。但你不应该从你的应用程序中读取它,因为Android包管理器安装APK时,如果在对应的lib/ABI目录中存在.so文件的话,会自动选择APK包中为对应系统ABI预编译好的.so文件。

五.不同的开发环境so库应该放在哪里?

  • Android Studio工程放在jniLibs/ABI目录中(当然也可以通过在build.gradle文件中的设置jniLibs.srcDir属性自己指定)

  • Eclipse工程放在libs/ABI目录中(这也是ndk-build命令默认生成.so文件的目录)

  • AAR压缩包中位于jni/ABI目录中(.so文件会自动包含到引用AAR压缩包的APK中)

  • 最终APK文件中的lib/ABI目录中

  • 通过PackageManager安装后,在小于Android 5.0的系统中,.so文件位于app的nativeLibraryPath目录中;在大于等于Android 5.0的系统中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目录中。

六.为什么一般的项目中只看到armeabi文件夹?

因为所有的x86/x86_64/armeabi-v7a/arm64-v8a设备都支持armeabi架构的.so文件。  mips和mips64是不支持armeabi架构的.so文件的,不过MIPS是一种高性能的嵌入式CPU构架,其出发点是高性能,主要用于路由器、猫等,基本在手机上不使用

七.是不是只放一种armeabi就够了?

事实上并不是:这不只影响到函数库的性能和兼容性。x86设备能够很好的运行ARM类型函数库,但并不保证100%不发生crash,特别是对旧设备。64位设备(arm64-v8a, x86_64, mips64)能够运行32位的函数库,但是以32位模式运行,在64位平台上运行32位版本的ART和Android组件,将丢失专为64位优化过的性能(ART,webview,media等等)。

八.不同Android版本系统拷贝不同目录so库的差异

工程项目中,有armeabi 、armeabi-v7a两个文件夹,而两个文件夹中的库文件不一样,编译运行的时候,报错java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader

原因分析

在android APK的根目录有一个libs文件夹,此文件夹下包含了armeabi 、armeabi-v7a两个文件夹,有时候会有x86的;一般c代码编译成的各种.so库就会放在这两个文件夹中。

armeabi和armeabi-7a是表示cpu的类型,一般的手机或平板都是用arm的cpu,armeabi是针对普通的或旧的arm cpu,armeabi通用性强,但速度慢;armeabi-v7a是针对有浮点运算或高级扩展功能的arm cpu,速度快

android的APP在安装时,会将APP中的so库拷贝到一个指定的目录(ApplicationInfo.nativeLibraryDir),运行时就在这个指定的目录下查找对应的so库。查找不到则会报错。

  1. 在android4.4以下版本的安装过程中的,是先把所有so库全部寻找出来,然后优先列出cpu类型(通过ro.product.cpu.abi属性获得)目录下的so库,如果有其他的cpu类型下有跟手机cpu类型名称不一致的so库,则会将兼容cpu架构(通过ro.product.cpu.abi2属性获得)的另外的库也列出来。将列出来so库全部拷贝的系统指定目录,以供运行时加载。 即在android4.4以下版本,一个so库只要在 ro.product.cpu.abi和ro.product.cpu.abi2属性目录下至少存在一个就可以了。在android4.4以下的arm架构的设备 ro.product.cpu.abi的属性通常是armeabi-v7a, ro.product.cpu.abi2的属性值是armeabi,并且armeabi-v7a设备一定兼容armeabi。但不排除某些设备的ro.product.cpu.abi的属性为armeabi。

  2. 在android5.0及以上,由于增加了arm64的支持,app安装时的so库拷贝代码也修改了。修改成只拷贝一个最合适的目录下的so库到系统指定目录。 在arm架构下,64位cpu的优先级是arm64-v8a > armeabi-v7a > armeabi,32位cpu的优先级是armeabi-v7a > armeabi ,优先级可通过ro.product.cpu.abilist属性查看。由于android5.0是拷贝整体目录,所以在每一个目录下的,都必须要有完整的so,即所有app需要so库都要有。例如64位的cpu的设备上,
    如果app目录里存在arm64-v8a子目录,则只拷贝该目录下的so库,其他目录的so,即使名称不一样,也不拷贝,如果arm64-v8a子目录的so库不全,则会报错。

解决方法

  1. apk中要么增加armeabi文件夹,需要注意的是,假如增加armeabi文件夹,armeabi-v7a里面的so库一定需要全部拷贝过来,否则还是会报错。

  2. 可以删除了armeabi-v7a文件夹,保留armeabi文件夹。

Android app中的so库和CPU架构的更多相关文章

  1. 在android app中使用STL库(转)

    1.在jni目录下新建Application.mk; 加入 APP_STL := stlport_static右边的值还可以换成下面几个: system - 使用默认最小的C++运行库,这样生成的应用 ...

  2. Android Studio中导入第三方库

    之前开发Android都是使用的eclipse,近期因为和外国朋友Timothy一起开发一款应用,他是从WP平台刚切换使用Android的,使用的开发环境时Android Studio,为了便于项目的 ...

  3. Android开发中常用的库总结(持续更新)

    这篇文章用来收集Android开发中常用的库,都是实际使用过的.持续更新... 1.消息提示的小红点 微信,微博消息提示的小红点. 开源库地址:https://github.com/stefanjau ...

  4. iOS App中 使用 OpenSSL 库

    转自:http://blog.csdn.net/kmyhy/article/details/6534067 在你的 iOS App中 使用 OpenSSL 库 ——译自x2on的“Tutorial: ...

  5. 在Android App中集成Google登录

    技术文章 来源:码农网 发布:2016-09-19 浏览:194 摘要:今天,几乎所有的web和移动app都自带谷歌和Facebook登录,这对app开发者和用户来说是一个非常有用的功能,因为几乎每个 ...

  6. Android开发中导入第三方库所遇问题记录

    1.重复循环依赖的问题 (1)需求 如下图所示: 在Android 项目中,采用模块化开发,一个是主跑application--Mudule A,另外一个是library--Library B 1)M ...

  7. android APP 中微信分享功能实现 的总结

    //花了很长时间最终完成了微信分享功能,中间走了很多弯路,在此做一下小结,希望对在应用中使用到微信分享的朋友有所帮助. 主要问题就是下面两个: 1.为什么运行了项目之后,微信分享只是闪了一下就没有了? ...

  8. 将unity3d项目嵌入到Android App中使用

    创建一个新的AndroidStudio app项目. 1.添加库文件:拷贝unity安装目录下的库文件:Unity\Editor\Data\PlaybackEngines\AndroidPlayer\ ...

  9. 怎么样android app正在使用STL库

    方法: 1.在jni文件夹下新建Application.mk; 增加 APP_STL := stlport_static右边的值还能够换成以下几个: system - 使用默认最小的C++执行库,这样 ...

随机推荐

  1. bzoj3122 [SDOI2013]随机数生成器

    bzoj3122 [SDOI2013]随机数生成器 给定一个递推式, \(X_i=(aX_{i-1}+b)\mod P\) 求满足 \(X_k=t\) 的最小整数解,无解输出 \(-1\) \(0\l ...

  2. 2018-2019-2 20175228实验一《Java开发环境的熟悉》实验报告

    一.实验内容及步骤 (一)使用JDk编译.运行简单的Java程序 实验步骤如下: 实验截图如下: (二)使用IDEA调试程序 1.设置断点2.单步运行:Step Into(快捷捷F7)和Step Ov ...

  3. linux 下一些命令

    1. 后台执行命令 nohup  http://blog.csdn.net/liuyanfeier/article/details/62422742 2. 查看日志文件 格式:tailf logfil ...

  4. Python中的垃圾回收与del语句

    python中的垃圾回收采用计数算法 一个对象如果被引用N次,则需要N次(即计算引用次数为零时)执行del 才能回收此对象. a = 100 b = a del a print(b) print(a) ...

  5. 相片后期处理,PS调出温暖的逆光美女

    原图: 效果图: 后面就是开PS导图: 说明下,因为拍的时候大概知道自己的方法会让照片变暖,现场光线又很暖,所以色温要调低一些,这边是4100,其他不用变,直接转JPG调色了 1:第一步是加第一个曲线 ...

  6. django的中英文支持及切换

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 1.http://mlocati.github.io/articles/gettext-iconv-w ...

  7. JUC (java.util.concurrent)

    1.什么是线程?什么是进程? 2.多线程的状态? public enum State { //6种状态 NEW, RUNNABLE, //可运行 BLOCKED, //阻塞 WAITING, //等待 ...

  8. golang运算与循环等

    一.golang运算符 1.算术运算符 + 相加- 相减* 相乘/ 相除% 求余++ 自增-- 自减 2.关系运算符 == 等于!= 不等于> 大于< 小于>= 大于等于<= ...

  9. CSS3文字、背景与列表

    一.文本相关属性 1.字体 (1)字体设置 在HTML中,字体通过<font face="字体名称">来设置.在CSS中字体通过font-family属性来控制,里面可 ...

  10. 不用Ajax时的传参方法

    不用Ajax时的怎么传参 创建一个form表单 function test(){ var params = { "参数名": "参数值" }; postExce ...