关于Android Studio生成aar包libs下直接使用出现NoClassDefFoundError错误的总结
最近在做一个中间组件的开发,组件为完全独立的整个流程功能,其中引入了包含网络,数据等第三方jar包。在功能完成后生成aar包Demo测试过程中,运行到加载第三方jar库中代码块时总是崩溃。
开始一直以为是混淆过配置出现了问题导致使用类无法找到,然后查看官方文档的混淆配置,自定义添加保持okhttp3包下的所有类均不混淆,然而并没有解决任何问题。之后求教百度大神,但在查询的结果中基本上都大同小异,一个人的回答基本上复制的到处都是,基本都是说方法数超过,导致Android打包分包引起,需添加multiDex配置,尝试的结果是浪费了时间。
但是发现了问题还是要解决,之后转Google上搜索了一圈,发现无法找到准确的问题描述解答,只能通过相似问题寻求解决方案。在冷静一会后,感觉还是要从项目结构上总体查找问题去分析解决,然后从代码,配置,到AS的项目组成结构。
然而这次功夫不负有心人,细微发现在项目包结构中没有发现使用的okhttp3网络库包,抱着尝试下的心态重新在build.gradle文件中配置okhttp3的引入,然后运行发现这错误消失了,而崩溃提示NoClassDefFoundError: com.google.gson.Gson(),既然这样那就把gson包也重新引入了一次,运行------->完美!!!!!!问题解决了,总要总结下查找下产生问题的原因。经查询aar包生成发现,在library状态下module生成的aar包是不将引入的第三jar包一起打包的。
问题分析及解决方案:
AS下引入aar包是有两种方式:
1、一种是通过buil.gradle配置文件通过中央仓库或公司的私有仓库直接配置;
2、一种是将aar包放在libs文件夹下引入。
若采用第一种方式引入则gradle会自动下载依赖锁关联的所有jar配置,这样就不需要在重新配置所需依赖的库。而采用第二种方式直接放在libs下使用的话,则需要在关联中重新引入第三方jar包。