AndroidStudio打包Apk java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader:couldn't find "lib

原文地址:http://blog.csdn.net/sinat_22657459/article/details/53420047
我本来也想写的,结果他先写好了,我就转过来吧,哈哈,这两天被微博整的烦躁啊。。。     

早上一来,一哥们找我,让帮忙看个问题,是他们的工程在使用微博SDK的功能时候,开发工具用的AndroidStudio,工程中有添加微博规定的so库,但是一运行,就直接崩溃,报couldn't find "libweibosdkcore.so",so库找不到。好,拿到问题,还是要先根据现象分析,判断清楚问题产生的原因在哪里。

这里写图片描述

 首先,使用微博给出的demo,gradle配置也是完全相同的,运行完成,正常,加载so库和调用方法都没有问题。然后运行自己的项目,调用System.loadLibrary("weibosdkcore")加载微博的so库时就直接崩溃,问了下他,各种查找,各种百度,各种google,都用了,但是问题仍然没有解决。然后还给我说,在微博的开放平台上各种找,也没有办法,里边推荐的QQ群也满了,根本加不进去,发邮件给微博,屁都没有回。这种感觉我也是有的,之前搞过一个项目,也是调用微博的功能,出现个问题,各方面找,就是没办法,也是相同的给微博发邮件,但是泥牛入海,根本没有因信,所以从那之后就不找官方了。

 估计官方人员都是非常繁忙,没鸟空理会我们这些屌丝!!

 娘的,没人回就自己搞!开始让我们哥们把他初始化的代码和崩溃的日志发过来看下,初始化调用和崩溃的截图如下:

这里写图片描述
这里写图片描述

 那么首先就要确定一下,apk安装完成后,对应的so库到底有没有成功解析出来?大家都知道,每个工程对应有个data目录,就是放的工程的各种文件,有sharedPreferences、file、database、lib,其中的lib就是存放我们在工程当中引用的so库的,好,我让他adb shell进入当前的工程目录下看一下,结果确实没有。

这里写图片描述

 而其他两个so库是正常的,好,那么我们需要进一步确认了,为什么so库没有,是打包apk时候就出问题了,还是PMS在安装过程中解析apk出问题了?PMS解析apk出问题,这个应该不可能,如果是这样,那demo应该也会崩溃了,而且这是系统安装的必要步骤,这里出问题的概率应该非常小,基本上就是不可能!好,那么从第一个猜想入手,是不是AndroidStudio打包apk时,对应的微博so库根本没进来,这个可能性还是比较大的,第一,AS推出时间不久,有一些小的Bug也是正常的,另外呢,他们的工程当中gradle配置是不是有问题,可能也有可能和扰码有关,之前也碰到过我们哥们问我的,最终查出来就是和项目扰码导致的问题。那么怎么验证这个猜想呢?最直接的就是把apk文件解压一下,看看那个so库到底有没有。

在让他试的过程中,自己也各种百度,找到一个跟他的崩溃描述非常相似的,不过全英文,自己也没怎么看。

[The Perils of Loading Native Libraries on Android](http://blog.csdn.net/sinat_22657459/article/details/53420047)

 大家如果有英文非常好的,希望能翻译出来看一下,他解压完看了下,果然,lib目录下根本没有微博的so库:

这里写图片描述
我们初步的判断已经正确了,问题的范围缩小了一些。那么demo为什么是正常的呢,让他把demo解压也看一下,demo当中根本没有lib目录。
这里写图片描述

 看来很可能是gradle配置的问题了,两个工程出来的apk文件目录都不一样,真可惜,自己对gradle又一点不懂。又让他把工程的build.gradle发过来看一下。

这里写图片描述

 跟so库相关的配置就是sourceSets节点了,然后又各种百度,发现网上有说如下这样配置的:

这里写图片描述

 自己先搞个Demo,按照两种配置试了下,果然,第一种配置没有lib目录,而第二种配置就会有lib目录了,而且微博的so库也在当中。

这里写图片描述
这里写图片描述
我靠,真是如获至宝啊!!!!让他再试了下,果然,打包出来的apk解压出来也是有对应的so库的,再运行一下,OK,没有问题!!!哈哈哈哈哈,好兴奋,又给哥们帮忙搞了个问题,自己也赶紧写个博客记录下来,以免自己以后碰到又忘了!

 最终的解决方案如下:

 原始build.gradle中sourceSets的配置如下:

 sourceSets {
     main {
         jniLibs.srcDirs = ['libs']
     }
 }

 将其改为如下:

 sourceSets {
     main {
         jni.srcDirs = []
         jniLibs.srcDirs = ['src/main/jniLibs']
     }
 }

 从这里其实最终解决问题是小,最主要的是想给大家说一下我们解决问题的思路,尤其在碰到一些自己根本没办法的问题时,一定要一步步将问题的范围缩小,如果能最终确定问题的产生原因,那解决它就是小case了!

 好了,希望本博客能给碰到相同问题的同学带来帮助,也希望大家关注我的博客!!

你可能感兴趣的:(android,开发,综合)