Android中的.so,了解一下

为什么要使用.so

  1. so机制让开发者最大化利用已有的C和C++代码,达到重用的效果,利用软件世界积累了几十年的优秀代码
  2. so是二进制,没有解释编译的开消,用so实现的功能比纯java实现的功能要快
  3. so内存分配不受Dalivik/ART的单个应用限制,减少OOM
  4. 相对于java代码,二进制代码的反编译难度更大,一些核心代码可以考虑放在so中

如何使用.so

  • 在Android Studio配置so有两种方式

    1. 放在libs下

      需要在build.gradle中配合

      sourcesets{
      
          main{
      
              jniLibs.srcDirs = ['libs']
      
          }
      
      }       
      
    2. 在src\main\jniLibs目录下

  • load SO库

    • load libs中的.so

      System.loadLibrary("xxx");
      
    • load /data/data/package name/xxx.so

      System.loadLibrary("/data/data/package name/xxx.so");
      
  • 调用native方法

Android中的CPU架构

早期Android系统只支持ARMV5的cpu架构,目前支持ARMv5,ARMv7 (从2010年起),x86 (从2011年起),MIPS (从2012年起),ARMv8,MIPS64和x86_64(从2014年起),每一种都关联着一个相应的ABI

ABI

  1. ABI是Application Binary Interface的缩写

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

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

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

Android中CPU架构和ABI对应关系

一种CPU架构 = 一种对应的ABI参数 =  一种对应类型的SO库

Android中使用SO,需要注意的问题

  • Android系统在安装APK的时候,不会安装APK里面全部的SO库文件,而是会根据当前CPU类型支持的ABI,从APK里面拷贝最合适的SO库,并保存在APP的内部存储路径的 libs 下面。如果我们自己动态的加载so,就需要自行通过Build.SUPPORTED_ABIS来判断ABI的类型。

  • Android开发对SO库的存放路径有严格的要求

    SO库其实都是APP运行时加载的,也就是说APP只有在运行的时候才知道SO库文件的存在,这就无法通过静态代码检查或者在编译APP时检查SO库文件是否正常。

  • 尽可能提供CPU支持的最优SO库。

    当一个应用安装在设备上,只有该设备支持的CPU架构对应的SO库会被安装。但是,有时候,设备支持的SO库类型不止一种,比如大多的X86设备除了支持X86类型的SO库,还兼容ARM类型的SO库,所以如果你的APK只适配了ARM类型的SO库的话,还是能以兼容的模式在X86类型的设备上运行,但是这不意味着你就不用适配X86类型的SO库了,因为X86的CPU使用兼容模式运行ARM类型的SO库会异常卡顿

  • 注意SO库的编译版本

    NDK平台不是向下兼容的,而是向上兼容的。应该使用app的minSdkVersion对应的版本的NDK标本来编译SO库文件,如果使用了太高版本的NDK,可能会导致APP性能低下,或者引发一些SO库相关的运行时异常,比如“UnsatisfiedLinkError”,“dlopen: failed”以及其他类型的Crash

  • 不要通过“减少其他CPU类型支持的SO库”来减少APK的体积

    所有的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等等)。

通过SO库体积的正确方式

  1. 构建特定ABI支持的APK

  2. 只提供armabi的so

  3. 从网络下载当前设备支持的SO库


参考文章如下:

loadLibrary动态库加载过程分析

关于Android的.so文件你所需要知道的

ANDROID动态加载 使用SO库时要注意的一些问题

关于Android Studio UnsatisfiedLinkError错误的解决办法

Android中的ABI

谈谈Android的so

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值