整理记录 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包了,有两种方式:

  方式 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
}
...
}

  最后注意:

  将被嵌入的应用打包成 jar 包,但是这样的方式有局限性,无法将被嵌入的应用所使用的资源性文件一起打包。下面介绍 aar 打包方式。

三、直接使用 aar 包

  将被嵌入的应用打包成 aar 包,这也是 Android Studio 的一种新特性,可以将应用所使用的资源性文件一起打包。编译即可打包生成 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/,如下图:

  
  下面介绍将 aar 包添加到其他 Android 工程:
  首先,将 aar 包复制到 libs 目录下
  其次,配置build.gradle文件:

  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 包的更多相关文章

  1. 【Android端】代码打包成jar包/aar形式

    Android端代码打包成jar包和aar形式: 首先,jar包的形式和aar形式有什么区别? 1.打包之后生成的文件地址: *.jar:库/build/intermediates/bundles/d ...

  2. [JAR包] android引入JAR包,打包成JAR包,打包成Library项目,导入Library项目

    (1)项目导入JAR包:1.在项目目录里建立一个libs目录,将外部jar包拷贝在里面.2.右键点击项目,Bulid Path->Configure Build Path3.在设置Libraie ...

  3. 使用ANT将Android打包成Jar包

    本文主要实现使用ANT,将Android项目打包成jar,为方便其他项目使用. ANT可以去官网下载(http://ant.apache.org/) 先介绍打包的步骤,打包脚本下方贴出 步骤: 1,将 ...

  4. [Java] Java 打包成jar包 和 解压jar包

    解压jar包 jar xf xxx.jar 打包成jar包 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] ...

  5. 【spring boot】idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到(转)

    转自:https://www.cnblogs.com/sxdcgaq8080/p/7727249.html   接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p ...

  6. Android Studio将项目打包成apk

    Android Studio将项目打包成apk 第一种方法:适合自己调试用. (1)直接在项目中生成: (2)位置是在你的项目中 第二种方法:适合发布应用. (1)找到Generate Signed ...

  7. springboot打包成jar包后找不到xml,找不到主类的解决方法

    springboot打包成jar包后找不到xml,找不到主类的解决方法 请首先保证你的项目能正常运行(即不打包的时候运行无误),我们在打包时经常遇到如下问题: springboot打包成jar包后找不 ...

  8. maven把项目打包成jar包后找不到velocity模板的bug

    使用springmvc 开发时候要实现发送velcotiy模板邮件,在配置正常后,在本地测试正常后,使用maven打包成jar包后,报以下错误, Caused by: org.apache.veloc ...

  9. 【spring boot】6.idea下springboot打包成jar包和war包,并且可以在外部tomcat下运行访问到

    接着上一章走呗:http://www.cnblogs.com/sxdcgaq8080/p/7712874.html 然后声明一点,下面打包的过程中,scope一直都是使用默认的范围 <!--用于 ...

随机推荐

  1. AngularJS路由系列(5)-- UI-Router的路由约束、Resolve属性、路由附加数据、路由进入退出事件

    本系列探寻AngularJS的路由机制,在WebStorm下开发.主要包括: ● UI-Router约束路由参数● UI-Router的Resolve属性● UI-Router给路由附加数据● UI- ...

  2. Android 实时视频编码—H.264硬编码

    from://http://www.cnblogs.com/skyseraph/archive/2012/04/04/2431771.html 1  硬编码 & 软编码 硬编码:通过调用And ...

  3. Ora-01536:超出了表空间users的空间限量

      正在开会,同事跑过来说数据库有问题,通讯程序不能入库,赶快获取一条insert into a values()语句后在toad工具中手动插入,发现报错:Ora-01536:超出了表空间users的 ...

  4. 高效的找出两个List中的不同元素

    /* * TestList.java * Version 1.0.0 * Created on 2017年12月15日 * Copyright ReYo.Cn */ package reyo.sdk. ...

  5. 广告狂人第一至七季/全集Mad Men迅雷下载

    广告狂人 第一季 Mad Men Season 1 (2007) 本季看点:你是谁?你想要什么?你爱乾什么?这些都不重要,重要的是你怎么把东西卖出去.凡是了解纽约的人都知道,今天,在麦迪逊大道(Mad ...

  6. gradle新建工程,多项目依赖,聚合工程

    感谢gradle完全的文档.开始完全没想过新建项目会弄我一天时间,都说gradle构建项目简单,我现在回复他们呵呵. gradle是个非常复杂的工具,从他的完整包80M和72章官方文档就可以看出一二. ...

  7. Caffe的solver参数介绍

      版权声明:转载请注明出处,谢谢! https://blog.csdn.net/Quincuntial/article/details/59109447 1. Parameters solver.p ...

  8. Inferred type 'S' for type parameter 'S' is not within its bound; should extend

    在使用springboot 方法报错: Inferred type 'S' for type parameter 'S' is not within its bound; should extends ...

  9. eclipse.ini 内存设置

    Ubuntu 系统下,Eclipse 配置文件: vi ~/eclipse/eclipse.ini -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:Max ...

  10. 什么是L2 frame?

    The data link layer or layer 2 is the second layer of the seven-layer OSI model of computer networki ...