Android Studio Gradle Pre Build Step

时间:2015-05-25 13:23:40

标签: java android android-studio gradle pre-build-event

我只想在Gradle开始构建进度之前运行一个单独的应用程序(exe)。我的目标是让我的exe(已经编写)自动生成一个包含内部版本号的依赖文件,我在UI中显示。以上所有内容都很简单,但我对Gradle几乎一无所知。

这个问题已被提出,但答案是Gradle的简洁片段,使用Gradle任务,并没有解释太多。

我想在不同的项目中使用相同的exe,因此需要一个命令参数来指定auto-gen文件的位置;

“buildnum.exe /someworkspace/someproject/somefolder/version.java”

如何让它运行?我正在使用典型的build.gradle脚本;

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.1.0'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

3 个答案:

答案 0 :(得分:3)

您可以使用Exec任务:

task buildNum(type: Exec, description: 'My Build num exe') {
    commandLine 'buildnum.exe',
            '/someworkspace/someproject/somefolder/version.java'
}

tasks.withType(JavaCompile) {
    compileTask -> compileTask.dependsOn buildNum
}

答案 1 :(得分:1)

运行某些控制台命令的示例:


    task cleanApks(type: Delete) {
        sdkUpdate()    
    }

    def sdkUpdate() {
        println executeSdkCommand('javac -version')
        println executeSdkCommand('android list sdk --all')
    }

    String executeSdkCommand(String cmd) {
        new ByteArrayOutputStream().withStream { os ->
            ExecResult result = exec {
                executable = 'cmd'
                workingDir = "${System.getenv("ANDROID_HOME")}/tools"
                args = ['/c', cmd]
                standardOutput = os
            }
            return os.toString()

        }
    }

    dependencies {
        cleanApks.dependsOn 'clean'
        compile fileTree(dir: 'libs', include: ['*.jar'])    
    }

答案 2 :(得分:1)

对于那些不熟悉Gradle的人(像我一样),底部是我的模块的完整build.gradle脚本,这样你就可以看到工具的集成位置和方式,我们刚刚给出了片段。 Exec命令在与build.grade文件相同的文件夹中运行exe,因此请使用工具和源的相对路径。

这是VersionUtils.java,我的模块中的源文件,其中包含模块的BuildNum。

package ca.mmist;

public class VersionUtils
{
    public static final int nSkyUtilsCRC = 1078887142;
    public static final int nSkyUtilsBuild = 228;
}

我真正想要的是BuildNum仅在需要构建的依赖性发生变化时才会增加。因此,我修改了BuildNum.exe以找到VersionUtils.java中的'src'文件夹,然后递归扫描每个子文件夹,查找 .java; .xml; .jar; .lib并使用每个源文件的FileWriteTime和FileSize生成CRC32。因此,当我重新编写VersionUtils.java(首先进入VersionUtils .~java)来增加BuildNo时,我比较了它们,如果它们是相同的,我可以简单地丢弃临时文件。否则我交换(删除并重命名)文件,从而导致使用新的BuildNo重建我的模块。 (听起来比在一小时内编码更痛苦。)

无论如何,现在QA很高兴他们可以准确地验证软件的构建版本,而不依赖于人来记住修改Manifest中的Version标签。

apply plugin: 'com.android.library'

android {
    compileSdkVersion 16
    buildToolsVersion "19.1.0"

    task buildNum(type: Exec, description: 'BuildNum.exe') {
        commandLine '../../../Tools/Bin/buildnum.exe', 'src/main/java/ca/mmist/VersionUtils.java'
    }

    tasks.withType(JavaCompile) {
        compileTask -> compileTask.dependsOn buildNum
    }

    defaultConfig {
        minSdkVersion 10
        targetSdkVersion 16
    }

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

dependencies {
    compile 'com.android.support:support-v4:18.+'
    compile files('libs/maplink.jar')
}