众所周知 android studio 会在library所依赖的 app运行 或 build 之后自动生成 jar 包,路径为 Module根目录/build/intermediates/bundles/debug or release/classes.jar,这样生成的jar是可以用的,但不是我们可以控制的,所以我们需要通过其他方式来解决这个问题。
注意:
若发现 Android Studio 项目 bundle 文件夹下没有 release 目录,可能是没有将 module 添加到主 module 依赖中。
方式1:主module右键 --> 倒数第二个Open Module Setting--> 上面最后一个选项Dependencies-->右边绿色加号-->Module dependency......然后确定
方式2:主Module的gradle的dependencies(平时添加第三方库的地方)中加上 compile project(':lib-zxing')
首先,需要将待打包 module 项目中的 build.gradld 文件进行修改,如下图:
其次,在 build.gradle 文件中加入如下代码:
方式一:
def _BASENAME = "TestJar";
def _VERSION = "_V1.0";
def _DestinationPath = "build"; //生成jar包的位置
def zipFile = file('build/intermediates/bundles/default/classes.jar'); //待打包文件位置
task deleteBuild(type:Delete){
delete _DestinationPath + _BASENAME + _VERSION + ".jar"
}
task makeJar(type:Jar){
from zipTree(zipFile)
from fileTree(dir:'src/main',includes:['assets/**']) //将assets目录打入jar包
baseName = _BASENAME + _VERSION
destinationDir = file(_DestinationPath)
}
makeJar.dependsOn(deleteBuild, build)
方式二:打包的 jar 只有源代码的.class 文件,不包含资源文件
task makeJar(type: Copy) {
delete 'build/TestJar_V1.0.jar' //删除之前的旧jar包
from('build/intermediates/bundles/default/') //从这个目录下取出默认jar包
into('build/') //将jar包输出到指定目录下
include('classes.jar')
rename('classes.jar', 'TestJar_V1.0.jar') //自定义jar包的名字
}
makeJar.dependsOn(build)
方式三:
task clearJar(type: Delete) {
delete 'build/TestJar_V1.0.jar' //jar包的名字,随便命名
}
task makeJar(type:org.gradle.api.tasks.bundling.Jar) {
//指定生成的jar名
baseName 'TestJar_V1.0'
//从哪里打包class文件
from('build/intermediates/bundles/default/')
//打包到jar后的目录结构
into('build/')
//去掉不需要打包的目录和文件
exclude('test/', 'BuildConfig.class', 'R.class')
//去掉R开头的文件
exclude{it.name.startsWith('R');}
}
makeJar.dependsOn(clearJar, build)
注意:
以上配置信息要与 android {…….} 配置的脚本成平级关系。
其中 _BASENAME = "TestJar"; _VERSION = "_V1.0"; 是定义生成 jar 包的名字为TestJar_V1.0.jar。
配置好以后就可以编译jar包了,有两种方式:
方式 A :点击 Android Studio 右侧(一般在这个位置)的 Gradle 面板,在项目或者该类库的目录中找到 Tasks -> other -> makeJar 命令,双击这个makeJar之后等一会就会编译好jar包。
打包成功后:在配置的指定目录下生成jar包
方式 B :通过 cmd 命令行,在项目根目录下,执行 gradlew makeJar 命令,看到编译完成的信息以后就OK了,也能生成一样的jar包,和直接使用①中的方式是等价的。
注意:使用此方式前要配置好 gradle 的“ 环境变量 ”,否则直接在项目根目录下找不到这个命令。使用 cmd 比较费劲,不推荐。
方式 C :在 Android Studio 终端窗口中输入 gradlew makeJar 命令。
打包成功如下图:
打包成功后:在配置的指定目录下生成jar包
注意:
问题1:
对于以上配置 form 默认 jar 包部分,在用目录是 from('build/intermediates/bundles/release/') ,注意粗体部分,最初我也是按照这个目录写的,确实没问题。但后来,也就是Android Studio 更新到2.3以后,发现这个目录没有了,取而代之的是 default 和 debug 目录,debug目录之前也是有的,没有变化,只是原来的release目录被现在的default目录代替了。这导致我后来生成jar包的时候始终没有找到jar包,报上图所示错误。
原因就是没有了 release 目录,找不到默认的 classes.jar 文件,所以也就没有生成自定义名字的jar包,改为 default 或者 debug 目录以后就能正常生成jar包了,要注意这点变化。
问题2
Execution failed for task ':mylibrary:lint'.
> Lint found errors in the project; aborting build.
解决在 build.gradle 文件中,加入下面的代码块(注意代码块所在的位置),重新执行 gradlew makeJar 命令。
android {
lintOptions {
abortOnError false
}
...
}