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')
只剩下实现类了,妈妈再也不怕类冲突了。