学徒浅析Android——斜体、依赖、NoClassDefFoundError

起这个标题是因为我想到了《死亡,爱,机器人》,看起来毫无关联的词汇,实际暗示着蛛丝马迹。最近在定位一个so引用问题时,就遇到了这种现象。异常日志很简单,如下所示:

java.lang.NoClassDefFoundError: Failed resolution of XXX

NoClassDefFoundError实际上就ClassNotFoundException。常见的类加载异常,如字面意思所说,没有从默认类路径中找到所需的类。实际上我一开始就说出了原因是什么,但是同事一句话让我不得不去证明他是错误的。他说用AS打开apk后可以看到有包含引用的类,而我用反编译工具打开后,却没有看到这类。两边一对比,肯定是有什么未知的事情困扰着我和小伙伴们。

在分析一个apk搭载了哪些依赖时,我们可以在ExtenalLibrary中查看到,也可以通过AS直接查看.dex文件,这两者是相同的,但是在展示内容上,.dex文件实际上是存在提示的。下面给大家看下具体的实例,以一个随意生成的demo为例,默认会引用android系统依赖:androidx。

 

implemention androidx.appcompat:appcompat:1.1.0

 

执行编译生成一个apk后,通过AS直接打开会发现在.dex文件中包含着一个同样的androidx文件夹,依赖的各级API都可以在文件夹中查询到。打开dex文件的效果如下图所示:

如果我把implemention替换成compileOnly再执行编译,很遗憾没编译成功。出现了各种类似下方的限定:

Android dependency 'androidx.lifecycle:lifecycle-livedata:2.0.0' is set to compileOnly/provided which is not supported

如果换一个第三方依赖,比如jsoup。implemention 'org.jsoup:jsoup:1.13.1',执行编译后,jsoup在.dex文件中的展示是这样的。

 

jsoup这个文件夹的字体是非斜体的,并且内部子文件夹的名字以及类文件都是非斜体。此时若把implemention替换成compileOnly再执行编译:compileOnly 'org.jsoup:jsoup:1.13.1'

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值