android studio下导出jar(java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unex)

来源:互联网 发布:linux yum命令找不到 编辑:程序博客网 时间:2024/06/06 12:15

eclipse导出jar很简单,可以选择某个文件或者所有文件导出jar包。
这里写图片描述
android studio就比较尴尬了,需要在相应库工程module的build.gradle中配置gradle脚本。

1. 配置gradle环境变量

如果windows命令下执行gradle -v时提示’gradle’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。那么就表示你没有配置过gradle环境变量。
这里写图片描述

首先找到你的gradle在哪里?可以在android studio安装目录:
这里写图片描述

也可以在as下载gradle的目录:
这里写图片描述
或者,你下载个gradle,然后解压下。

接着就是创建gradle环境变量啦,变量名“GRADLE_HOME”,变量值就是上面的gradle目录的路径。
这里写图片描述

将此路径加入到Path变量中
这里写图片描述

再试下gradle -v命令,安装OK
这里写图片描述

2. as下所有类导出jar

这里我建了一个library简单工程,只有两个类:接口类和实现类。
这里写图片描述

如果我把整个工程的所有类导出jar的话,只需要在module的build.gradle下配置配置下gradle脚本
这里写图片描述
箭头所指就是需要修改的文件,红框内就是添加的脚本,每行的注释也很清楚。

task clearJar(type: Delete) {    delete 'libs/sdk.jar'}task makeJar(type:org.gradle.api.tasks.bundling.Jar) {    //指定生成的jar名    baseName 'sdk'    //从哪里打包class文件    from('build/intermediates/classes/debug/fota/adups/myapplication/')    //打包到jar后的目录结构    into('fota/adups/myapplication/')    //去掉不需要打包的目录和文件    //exclude('test/', 'BuildConfig.class', 'R.class','ILoader.class')    //去掉R$开头的文件    exclude{ it.name.startsWith('R$');}}makeJar.dependsOn(clearJar, build)

class文件路径from('build/intermediates/classes/debug/fota/adups/myapplication/'),这个路径其实就是下面的路径
这里写图片描述

jar包路径into('fota/adups/myapplication/')是为了兼容后面的类对应关系的,如果我写成into('build/gaga/')呢,那打出jar的目录结构是这样的
这里写图片描述
细心的应该看到了,这里的路径会决定后面生成的jar里面的包名,所以为了兼容后续使用,就把路径写成包名了。否则在使用dx --dex --output=test.jar dynamic.jar命令转化dex时会出现不兼容错误:
class name (fota/adups/myapplication/BuildConfig) does not match path (build/gaga/BuildConfig.class)
这里写图片描述
搞成这样就不会报错啦,不信你看
这里写图片描述
这里写图片描述

3. as下指定某个或某几个类导出jar

按照上面的包名做路径把所有类导出为jar,dex转换也成功了,但是实际使用时出问题了,直接把宿主搞挂了java.lang.IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation
这里写图片描述
网上提示说jar不需要带上接口文件,那就去掉吧,只留下JarLoader.class得了。
加上这句过滤就完美了

//去掉不需要打包的目录和文件    exclude('test/', 'BuildConfig.class', 'R.class','ILoader.class')    

这里写图片描述
只剩下实现类了,妈妈再也不怕类冲突了。

阅读全文
0 0