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

5,245 阅读1分钟

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

注意:本例子在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