Android的.so文件详细解读

澳门新葡亰娱乐官网 1

最早的Android系统大致只辅助ARMv5的CPU架构,你知道将来它帮衬多少种啊?7种!

Android系统当下支撑以下多种不相同的CPU构造:ARMv5,ARMv7 (从二〇〇两年起卡塔尔国,x86
(从二零一一年起卡塔尔,MIPS (从二零一一年起卡塔尔,ARMv8,MIPS64和x86_64
(从二零一四年起State of Qatar,每大器晚成种都关乎着叁个相应的ABI。

应用程序二进制接口(Application Binary
Interface)定义了二进制文件(特别是.so文件)怎么样运作在对应的连串平台上,从使用的指令集,内部存款和储蓄器对齐到可用的种类函数库。在Android
系统上,每三个CPU布局对应叁个ABI:armeabi,armeabi-v7a,x86,mips,arm64-
v8a,mips64,x86_64。

为何你必要注重关心.so文件

假诺项目中使用到了NDK,它将会生成.so文件,由此鲜明你以往在关切它了。倘若只是接受Java语言实行编码,你或者在想不必要关切.so文
件了吗,因为Java是跨平台的。但实际上,纵然你在项目中只是采纳Java语言,非常多状态下,你恐怕并未意识到品种中借助的函数库大概引擎库里面已经
嵌入了.so文件,并依附于不一样的ABI。

比方,项目中动用RenderScript扶助库,OpenCV,Unity,android-gif-drawable,SQLCipher等,你都早已在扭转的APK文件中包涵.so文件了,而你须求关切.so文件。

Android应用支撑的ABI决计于APK中位居lib/ABI目录中的.so文件,此中ABI恐怕是地点说过的多种ABI中的后生可畏种。

澳门新葡亰娱乐官网 1

Native Libs
Monitor
这么些利用能够协助大家领略手提式有线电电话机上安装的APK用到了怎么.so文件,以至.so文件来源于哪些函数库可能框架。

无可争辩,大家也得以自身对app反编写翻译来收获那么些消息,可是相对费力一些。

成都百货上千器材都协助多于后生可畏种的ABI。举例ARM64和x86设备也得以况且运转armeabi-v7a和armeabi的二进制包。但但是是对准特
定平台提供相应平台的二进制包,这种状态下运作时就少了三个模拟层(比如x86设备上模拟arm的虚构层),进而获取越来越好的品质(归功于这段时间的构造更新,
举例硬件fpu,越多的寄存器,越来越好的向量化等)。

咱俩得以通过Build.SUPPORTED_澳门新葡亰娱乐官网 ,ABIS获得依据偏心排序的设备支持的ABI列表。但您不应当从您的应用程序中读取它,因为
Android包微电脑安装APK时,会活动选用APK包中为对应系统ABI预编写翻译好的.so文件,借使在相应的lib/ABI目录中存在.so文件的
话。

App中或然出错的地方

管理.so文件时有一条轻松却并不有名的首要规律。

您应有尽或然的提供专为每一种ABI优化过的.so文件,但依旧全体协助,要么都不扶助:你不应当混合着使用。你应当为各类ABI目录提供相应的.so文件。

当四个运用设置在设施上,唯有该设备支撑的CPU结构对应的.so文件会被安装。在x86设备上,libs/x86目录中要是存在.so文件的
话,会被设置,尽管不设有,则会采用armeabi-v7a中的.so文件,假如也不真实,则选取armeabi目录中的.so文件(因为x86设备也协理armeabi-v7a和armeabi)。

其它地方也会有可能出错

当您引进三个.so文件时,不仅影响到CPU布局。小编从其余开采者这里能够见见朝气蓬勃多元大范围的一无是处,当中最多的是”UnsatisfiedLinkError”,”dlopen:
failed”以至其余类别的crash恐怕低下的习性:

行使android-21平台版本编写翻译的.so文件运行在android-15的装置上

应用NDK时,你大概会协助于选拔最新的编写翻译平台,但实际那是不当的,因为NDK平台不是后向宽容的,而是前向包容的。推荐应用app的minSdkVersion对应的编译平台。

这也象征当您引进一个预编写翻译好的.so文件时,你须要检讨它被编写翻译所用的平台版本。

错落使用不一样C++运维时编写翻译的.so文件

.so文件能够借助于差异的C++运维时,静态编写翻译或然动态加载。混合使用不一样版本的C++运转时恐怕导致众多离奇的crash,是应该防止的。
作为贰个资历法则,当只有五个.so文件时,静态编写翻译C++运营时是没难题的,不然当存在多少个.so文件时,应该让具备的.so文件都动态链接相仿的
C++运营时。

那意味着当引进一个新的预编写翻译.so文件,並且品种中还设有任何的.so文件时,大家须求首先断定新引入的.so文件使用的C++运营时是否和曾经存在的.so文件生机勃勃致。

并没有为各类扶助的CPU构造提供对应的.so文件

那一点在前文已经谈起了,但您应该真正非常注意它,因为它大概发生在根本未有察觉到的气象下。

比如:你的app协助armeabi-v7a和x86构造,然后利用Android
Studio新增添了三个函数库注重,这么些函数库富含.so文件并援助更加多的CPU结构,比如新扩张android-gif-drawable函数库:

compile ‘pl.droidsonroids.gif:android-gif-drawable:1.1.+’

发表大家的app后,会发掘它在少数设备上会爆发Crash,举个例子Galaxy
S6,最后得以窥见唯有六十二人目录下的.so文件被安装进手提式无线电话机。

消除方案:重新编写翻译大家的.so文件使其补助缺点和失误的ABIs,或然设置

ndk.abiFilters

来得钦定扶助的ABIs。

末尾一点:
假诺您是叁个SDK提供者,但提供的函数库不帮助全部的ABIs,那您将会搞砸你的顾客,因为他们能帮助的ABIs必定将只可以少于你提供的。

将.so文件放在错误的地点

我们往往非常轻易对.so文件应该献身可能生成到哪儿以为纠缠,上面是一个总计:

  • Android
    Studio工程坐落于jniLibs/ABI目录中(当然也得以因此在build.gradle文件中的设置jniLibs.srcDir属性自身钦定)
  • Eclipse工程坐落于libs/ABI目录中(那也是ndk-build命令私下认可生成.so文件的目录)
  • AA库罗德压缩包中位居jni/ABI目录中(.so文件会活动包蕴到引用AA索罗德压缩包的APK中)
  • 聊起底APK文件中的lib/ABI目录中
  • 透过PackageManager安装后,在小于Android
    5.0的系统中,.so文件坐落于app的nativeLibraryPath目录中;在超过等于Android
    5.0的系统中,.so文件位于app的nativeLibraryRootDir/CPU_ARCH目录中。

只提供armeabi结构的.so文件而忽视任何ABIs的

所有的x86/x86_64/armeabi-v7a/arm64-v8a装置都支持armeabi结构的.so文件,由此就好像移除别的ABIs的.so文件是三个减小APK大小的好技艺。但骨子里并非:那不只影响到函数库的品质和宽容性。

x86设备能够很好的运营ARM类型函数库,但并不保险百分之百不产生crash,极度是对旧设备。陆拾壹个人设备(arm64-v8a,
x86_64,
mips64)能够运维三拾三个人的函数库,不过以三十三位方式运转,在陆16个人平台上运营34人版本的ART和Android组件,将错过专为六11个人优化过的品质(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
     }
   }
}
You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图