一个Android多平台问题兼容解决思路-创新互联

问题:使用AS打出来的签名包,在调试一直用的5.0的小米手机上可以正常运行,4.4的联想手机上闪退,5.1的模拟器上闪退。

网站建设哪家好,找创新互联!专注于网页设计、网站建设、微信开发、成都小程序开发、集团企业网站建设等服务项目。为回馈新老客户创新互联还提供了灵璧免费建站欢迎大家使用!

抛出:java.lang.UnsatisfiedLinkError,ClassLoader找不到相关的so库。

解决思路:

猜想跟CPU架构有关系,查询如下(cat /proc/cpuinfo):

    模拟器:           电脑使用的是Intel的cpu             x86_64架构

    联想:Processor    : ARMv7 Processor rev 2 (v7l)         armeabi-v7a

    小米:Processor    : AArch74 Processor rev 2 (aarch74)    arm64-v8a

问题一、Android支持哪些cpu架构?

答案很容易搜索到:android目前支持7种架构

  1. x86_64

  2. x86

  3. mips64

  4. mips

  5. armeabi-v7a

  6. armeabi

  7. arm64-v8a

问题二、系统是怎么查找so库的呢?

查找so库规则:

   运行的时候,系统会到Jnidirs目录里查找so库,会根据当前平台架构查找对应的目录。这里面有一个规则是这个问题的元凶。当你只提供了armeabi目录时,armeabi-v7a、arm64-v8a架构的程序都会去armeabi里寻找,而当你同时也提供了armeabi-v7a、armeabi-v8a目录,而里面又不存在对应的so库时,系统就不会再去armeabi里面寻找了,直接找不到报错。

   而签名包里面这七个目录都有,这个问题后面讨论。

验证猜想:

   将app-release.apk使用打包软件打开,删除其中的armeabi-v7a目录,发现联想手机可以正常运行了(去armeabi里面寻找了)。移除x86_64文件夹,模拟器可以正常运行(去x86里面寻找了)。

问题三、签名包为什么七个目录全都有?

   对应Jnidirs目录中的七个目录。打开签名包,发现这七个目录都有。奇怪的是我的项目里只有x86、armeabi和arm64-v8a三个类型的so库。打开其他的目录发现都是只有一个so文件:libgenius_graphics.so。百思不得其解这个从何而来,查找build-gradle的时候发现:compile 'net.qiujuer.genius:graphics:2.0.0-beta8' 非常相似,这是一个开源的UI库。猜测是引入这个库在编译的时候自动生成各个平台下的libgenius_graphics.so文件。移除之,rebuild,确实如此,只剩下原本的三个文件夹。

问题四、armeabi能否兼容x86平台?

   而当我连x86文件夹都移除,则根本不能安装在模拟器上,提示:INSTALL_FAILED_NO_MATCHING_ABIS。证明x86架构不会去寻找armeabi目录。当你想在x86的机器上运行app时,一定要获得对应的x86版本so库文件。(查阅许多文档都说x86是兼容armeabi的so文件的,验证时必须保证x86文件夹为空,或者根本没有x86文件夹)

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


当前题目:一个Android多平台问题兼容解决思路-创新互联
网站链接:http://myzitong.com/article/dehpoc.html