Gradle:如何对APK文件执行一些逻辑?

时间:2018-07-03 20:52:46

标签: android android-studio gradle

对于我使用Gradle构建的每个APK文件,我需要做2件事(依次):

  1. 生成描述应用程序的外部工具使用的XML文件
  2. 将生成的XML和相应的APK文件压缩到存档中

我在名为produce_artifacts.gradle的所有项目/模块的中央位置创建了文件,内容如下:

def getBuildDate() {
   def date = new Date()
   return date.format('yyyyMMdd')
}

def getBuildCommit() {
    return ['git', 'rev-parse', 'HEAD'].execute().text.trim()
}

def getVcsBranchName() {
    return ['git', 'rev-parse', '--abbrev-ref', 'HEAD'].execute().text.trim()
}

task produceArtifacts {
    group 'Package Configuration'
    description 'Create a CMS-consumable ZIP file for a built APK'
    dependsOn "$project.path" + ":assembleFullRelease"

    def buildCommit = getBuildCommit()
    def buildBranch = getVcsBranchName()
    def buildDescription = buildBranch + '-' + buildCommit
    def buildDate = getBuildDate()

    android.applicationVariants.all { variant ->
        def taskPackage = tasks.create("package_${variant.name}", Exec) {
            workingDir buildscript.sourceFile.parent
            def apk = variant.outputs[0].outputFile
            def apkDir = apk.getParent();
            def inputConfig = '' + project.projectDir + File.separator +
                packageConfigXmlFile
            def outputConfig = apkDir + File.separator + 'PackageConfig.xml'

            commandLine 'python', 'setup-package-config.py', versions.version, inputConfig,
                outputConfig, apk, buildDescription
        }

        def taskZip = tasks.create("zip_${variant.name}", Zip) {
            from variant.outputs[0].outputFile.parent
            include '*.apk'
            include '*.xml'
            baseName project.name
            destinationDir file(variant.outputs[0].outputFile.parent)
        }

        produceArtifacts.dependsOn(taskZip)
        taskZip.dependsOn(taskPackage)
    }
}

在每个构建APK的项目的build.gradle中,我将其添加到最底端(位于android {}块之外):

ext.packageConfigXmlFile = 'Sync_PackageConfig.xml'
apply from: '../../Core/Build/produce_artifacts.gradle'

然后在我的构建服务器上,运行以下命令:

$ ./gradlew --parallel --max-workers=3 produceArtifacts

我希望发生的事情是:

  1. assembleFullRelease应该由produceArtifacts调用以构建应用程序及其APK
  2. package_${variant.name}被调用,其中${variant.name}是许多正在处理的当前变量。这样会生成XML文件,并依赖于执行python脚本之前存在的APK文件。
  3. zip_${variant.name}被调用,其中${variant.name}是许多正在处理的当前变量。这需要XML和APK文件存在。

我在#2处发现,它在APK真正放入磁盘之前执行得很好。我不确定为什么要这么早执行。由于我已设置依赖项,因此它应等待assembleFullRelease任务完成,其中应包含APK输出。

这对我来说很混乱,任何人都可以帮助我按我期望的顺序进行这项工作吗?

我正在运行Android Studio / Gradle Build Tools v3.2 Beta 2和Gradle版本4.8.1。

0 个答案:

没有答案