Android打包AAR,并输出到指定目录

本文介绍了如何在Android开发中将独立功能模块打包成AAR文件,并详细讲解了在不同Android插件版本下的注意事项及具体操作步骤,包括编写打包脚本、在build.gradle中引入以及使用Terminal命令进行打包输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在模块化开发中,有时需要将独立功能模块打包输出。

注意:本例子在Android插件3.2.0上运行,在3.3+需要修改为Provider方式获取variant

  • 编写打包脚本,放在common.gradle文件中
// common.gradle

gradle.ext.dependencieInfo = []

/**
 * 获取时间 yyyyMMdd
 * @return 时间字符串
 */
static String releaseTime() {
    return new Date().format("yyyyMMdd", TimeZone.getDefault())
}

/**
 * 获取时间 yyyyMMdd
 * @return 时间字符串
 */
static String getFormatDate() {
    return new Date().format("yyyyMMdd_HHmmss", TimeZone.getDefault())
}

static def getGitHeadRefsSuffix() {
    try {
        // .git/HEAD描述当前目录所指向的分支信息,内容示例:"ref: refs/heads/master\n"
        def headFile = new File('.git/HEAD')
        if (headFile.exists()) {
            String[] strings = headFile.getText('UTF-8').split(" ")
            if (strings.size() > 1) {
                String refFilePath = '.git/' + strings[1]
                // 根据HEAD读取当前指向的hash值,路径示例为:".git/refs/heads/master"
                def refFile = new File(refFilePath.replace("\n", ""))
                // 索引文件内容为hash值+"\n",
                // 示例:"90312cd9157587d11779ed7be776e3220050b308\n"
                return refFile.getText('UTF-8').substring(0, 7)
            }
        }
    } catch (Exception e) {
        e.printStackTrace()
    }
    return ""
}

// 打包aar
void packagingAAR(project, android) {
    android.libraryVariants.all { variant ->
        if (variant.buildType.name == "release") {
            // 修改aar名称
            variant.outputs.all { output ->
                outputFileName = "${project.name}-V${android.defaultConfig.versionName}_${android.defaultConfig.versionCode}-${getGitHeadRefsSuffix}-${getFormatDate()}${isEmpty(variant.flavorName) ? "" : "-${variant.flavorName}"}-${variant.buildType.name}.aar"
            }
            // 复制aar到指定目录
            variant.assemble.doLast {
                variant.outputs.all { output ->
                    // 输出目录在:项目目录/build/outputs/aar/日期-gitCommit/
                    def outputPath = [project.rootDir.absolutePath, "build", "outputs", "aar", releaseTime() + "-" + getGitHeadRefsSuffix()].join(File.separator)
                    copy {
                        from output.outputFile
                        into outputPath
                    }
                    // 输入依赖语句
                    gradle.dependencieInfo.add("api(name: '${output.outputFile.name.replace('.aar', '')}', ext: 'aar')")
                    println("${gradle.dependencieInfo.join("\n")}")
                }
            }
        }
    }
}
ext {
    // yyyyMMdd 时间
    releaseTime = this.&releaseTime
    // yyyyMMdd_HHmmss 时间
    getFormatDate = this.&getFormatDate
    // 获取当前git commit点
    getGitHeadRefsSuffix = this.&getGitHeadRefsSuffix
    // 打包AAR
    packagingAAR = this.&packagingAAR
}

复制代码
  • 在项目build.gradle引入common.gradle

引入common.gradle后,可以在其他模块中使用common.gradle中的方法。

// 根目录build.gradle
apply from: "common.gradle"

buildscript {
    repositories {
        jcenter()
        mavenCentral()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.2.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
        google()
    }
}

复制代码

在lib模块build.gradle使用

apply plugin: 'com.android.library'

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion

    defaultConfig {
        minSdkVersion rootProject.ext.android.lowMinSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }

    packagingAAR(project, android)
}

dependencies {

}
复制代码
  • 使用

在Terminal中使用命令打包输出aar。

gradlew :xxxa:assembleRelease :xxxb:assembleRelease
复制代码

转载于:https://juejin.im/post/5ce6120ae51d45775f5169e3

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值