Android studio 将 Module 打包成 Jar 包
Posted Now,DayBreak
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android studio 将 Module 打包成 Jar 包相关的知识,希望对你有一定的参考价值。
整理记录 androidStudio 把一个 module 项目打包成 jar 包。
一、默认自动生成的 jar 包
众所周知 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\')
二、自定义生成 jar 包
首先,需要将待打包 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包了,有两种方式:
对于以上配置 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 } ... }
最后注意:
将被嵌入的应用打包成 jar 包,但是这样的方式有局限性,无法将被嵌入的应用所使用的资源性文件一起打包。下面介绍 aar 打包方式。
三、直接使用 aar 包
如果Project 中 Module 是一个应用,则在 Module 的 build.gradle 文件中定义属性为:apply plugin: \'com.android.application\';而如果 Mudule 是一个被引用的依赖 lib 库的话,则在 Module 的 build.gradle 文件中定义属性为: apply plugin: \'com.android.library;所以当我们将应用 Module 打包出 aar 文件的时候,需要修改类型属性。正常情况下,直接重新编译 Module,生成的 aar 包在 Module 根目录的/build/outputs/aar/,如下图:
A 在 android 中加入,如下:
repositories { flatDir { dirs \'libs\' } }
B 在 dependencies 中加入 compile(name:lib-zxing-release\', ext:\'aar\')
完整 build.gradle 文件如下:
apply plugin: \'com.android.application\' android { ... repositories { flatDir { dirs \'libs\' } } } dependencies { ... compile(name:\'lib-zxing-release\', ext:\'aar\') }
最后,重新编译 Rebuild 的以下工程。
以上是关于Android studio 将 Module 打包成 Jar 包的主要内容,如果未能解决你的问题,请参考以下文章
Android studio 将 Module 打包成 Jar 包
Android Studio将Eclipse的项目作为module的依赖库
android studio 导入外部库文件,以及将项目中module变成library引用依赖
在 Android Studio 和 Gradle 的 Android App Module 中使用不同构建类型的 Library Module