学徒浅析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文件的效果如下图所示:

学徒浅析Android——斜体、依赖、NoClassDefFoundError_第1张图片

如果我把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文件中的展示是这样的。

学徒浅析Android——斜体、依赖、NoClassDefFoundError_第2张图片

 

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

你可能感兴趣的:(Android开发,android,DefFoundError,NoClassDef,斜体)