U8SDK——增加CPU类型的选择(.so文件等问题)

作者: 分类: U8SDK 发布时间: 2015-07-06 09:11 67条评论

不管是以前自己老的方式去接SDK,还是现在采用U8SDK做统一的SDK接入,我相信很多童鞋都出现过so文件等相关的问题。其中,出现最多的莫过于“某个so文件找不到”的BUG。
那么,这背后到底是啥问题呢?这里,我们就来系统地了解下so相关的知识,并最终在U8SDK中,加入CPU架构的选择,使得这个问题更容易被U8SDK的使用者所熟悉和了解。
 
.so文件是一类和平台相关的动态库文件的统称,和平台相关,精确地说是和CPU类型相关。当前,Android NDK可以编译出来的动态库,可以选择4个CPU类型。分别是“armeabi””armeabi-v7a” “x86” 和 “mips”。所以,在包含平台相关的库文件的渠道SDK中,他们经常会在libs目录下提供多个平台的.so文件。多的,四个平台都包含,少的只包含”armeabi”。
 
现在市面上,几乎%90以上的Android智能手机的CPU都是ARM系列处理器,x86和mips相对占得比例很少。所以,一些包含动态库的渠道SDK仅仅提供了“armeabi”的动态库。
 
同样是ARM系列,armeabi和armeabi-v7a还是有区别的。armeabi通用性强,但是缺点是速度慢。但是armeabi-v7a 则可以充分发挥v7a CPU的能力。armeabi主要针对老的arm CPU系列( ARM-v5),而armeabi-v7a则是针对有浮点运算或高级扩展功能的ARM-v7 CPU。
 
但是,如果渠道SDK在libs中包含了不同平台的库文件,我们是否都需要打到apk中呢? 之前,U8SDK是毫无选择地打入apk中,但是这样,不仅会增大apk的尺寸(有的so文件还是很大的),还可能会引发某些so文件找不到的BUG。
 
这里,就不得不说一下,当apk同时包含多个CPU类型的库文件时,它是如何决定应用程序去使用哪个平台下的库文件?
 
对于ARM系列的CPU,他会有一个第一选择和第二选择。举个例子:
比如,如果当前Android手机是ARM-v5处理器,apk包含armeabi,armeabi-v7,x86,mips四个平台的库文件,那么,只会加载armeabi目录下的so文件。
如果当前Android手机是ARM-v7处理器,那么,他会优先去判断是否存在armeabi-v7a这个目录,如果目录不存在或者没有加载到任何so文件,那么他会有第二个选择,就是去armeabi目录下加载so文件。但是,这里注意下:如果他从armeabi-v7a目录下加载到了(至少加载到一个),那么他将不再去加载armeabi目录下的so文件。
 
对于x86和mips系列的CPU,只有第一选择,就是他们本身。
 
这里,需要注意的有两点:
 
1、armeabi和armeabi-v7a中,不要放不同的so文件。否则可能会加载不到so文件。
 
2、选择过程在apk安装的时候就发生了,安装的时候,根据当前CPU类型,根据选择规则,选择最匹配的so文件,拷贝到当前应用程序的私有数据目录\lib\下,当程序中通过System.loadLibrary()加载的时候,其实是加载已经选择好了的so文件。
 
 
BUG出现分析:
 
根据上面所说的,如果出现so文件加载不到的BUG时,可能的问题分析:
 
渠道SDK,仅仅提供了armeabi目录下的so文件,但是游戏母包中既包含armeabi和armeabi-v7a两个平台的游戏相关的so文件。
比如:渠道SDK提供了libChannel.so,放在armeabi目录下。游戏母包包含aremabi和armeabi-v7a两个平台的so文件,比如叫libGame.so。
 
通过U8SDK反编译资源合并打包之后,会有两个平台下的目录。
armeabi : 里面包含libChannel.so和libGame.so两个文件
armeabi-v7a : 里面包含libGame.so一个文件。
 
如果当前Android手机是ARM-v7a的处理器,那么,安装的时候,他优先去armeabi-v7a目录下拷贝so文件,如果拷贝到了任何so文件,那么他将不再去armeabi目录下拷贝so文件。这样,游戏运行的时候,渠道SDK加载libChannel.so的时候,就会发生so文件找不到的情况。
 
所以,为了避免这样的BUG,或者类似的问题。我们在U8SDK中加入CPU类型的选择。让CP根据每个游戏支持的平台来设置当前需要支持的CPU类型。
 
在打包工具/config/games/games.xml的game节点中增加一个param节点,支持的CPU类型以|分割:
 

然后在apk_utils.py中的copyLibs方法中,加入支持的CPU类型的处理和过滤。copyLibs修改为如下:
 

 
这样,对于不同的游戏,都可以设置当前游戏支持的CPU类型。拷贝的时候,不需要的so文件不再拷贝到apk中,降低apk包的大小。同时,如果渠道SDK有armeabi目录,那么会将armeabi目录中的文件,拷贝到armeabi-v7a中。

本文出自 U8SDK技术博客,转载时请注明出处及相应链接。

本文永久链接: http://www.uustory.com/?p=1850

评论功能已经关闭,请加入U8SDK技术群进行讨论和咨询:207609068
Ɣ回顶部
U8SDK技术群 x
技术同学请加入
点击加入