PRELOADER

Dinghow的个人博客

Current post : 《使用Android Studio打包aar与jar》

9/15/2020 —— 

1. jar与aar

从维基百科摘一段:

JAR文件(Java归档,英语:Java ARchive)是一种软件包文件格式,通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便分发Java平台应用软件

AAR(Android Archive)包是一个Android库项目的二进制归档文件,与jar文件相比,aar文件可以包含Android资源和一个清单文件,除了java的方法外,还可以捆绑布局和可绘制对象等共享资源

*.jar与*.aar的文件均是以ZIP文件格式以基础,我们可以将文件后缀名改为.zip并解压查看文件结构:

jar:

This is an example image

aar:

This is an example image

2. Module的导入

  • 直接导入现有的Module: File ➡ New ➡ Import Module
  • 新建Module: File ➡ New ➡ New Module, 选择Android Library,在Android视图下对新添加的Module添加你所需要加的Activity和资源文件等:
This is an example image

3. jar的打包

对于需要导入的jar包,将其添加到Project视图的libs文件夹下,并添加依赖:

File ➡ Project Structure ➡ 选择对应module的dependencies ➡ 点击+号 ➡ Jar dependency ➡ 选择对应*.jar文件,确认

This is an example image

随后在该Module的build.gradle文件中添加以下代码:

//task to delete the old jar
task deleteOldJar(type: Delete) {
    delete 'release/Test.jar'
}

//task to export contents as jar
task exportJar(type: Copy) {
    from('build/intermediates/bundles/default/')
    into('release/')
    include('classes.jar')
    rename('classes.jar', 'Test.jar')
}

exportJar.dependsOn(deleteOldJar, build)

其中from的目录为原jar包的位置,选中该Module,build ➡ Make Module xxx后可以在build/intermediates/bundles/default/,如果没有bundles目录,可以在buile/intermediates/packaged-classes中找到jar包,设置目录为该位置即可

添加完后更新gradle,在右侧Gradle菜单中打开该Module ➡ other ➡ exportJar,双击执行,运行完后在release可以找到生成的jar包

This is an example image

需要注意的是这样生成的jar包只包含源代码的.class文件,并没有包含资源文件,若要包含资源文件的话,build.gradle中添加的代码修改如下:

//task to delete the old jar
task deleteOldJar(type: Delete) {
    delete 'release/Test.jar'
}

//task to export contents as jar
task exportJar(type: Jar) {
    from zipTree(file('build/intermediates/bundles/default/classes.jar'))
    from fileTree(dir:'src/main',includes:['assets/**'])  //包含assets目录中的资源文件
    baseName = "Test.jar"
    destinationDir = file('release')
}

exportJar.dependsOn(deleteOldJar, build)

4. aar的打包

使用Android Studio可以直接打包aar,相较于jar打包更方便,而且也能够包含资源文件,其实在上一步的Make Module后,在build/outputs/aar目录下就可以找到aar包了

This is an example image