1

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

有人问过这个问题,但答案是 Gradle 的简洁片段,使用 Gradle 任务,并没有过多解释。

我想在不同的项目中使用相同的exe,所以它需要一个命令参数来指定自动生成文件的位置;

“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()
    }
}
4

3 回答 3

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
}
于 2015-05-25T13:37:07.840 回答
3

对于那些不熟悉 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;。罐; .lib 并使用每个源文件的 FileWriteTime 和 FileSize 生成 CRC32。因此,当我重新编写 VersionUtils.java(首先写入 VersionUtils.~java)以增加 BuildNo 时,我比较了 CRC,如果它们相同,我可以简单地丢弃临时文件。否则,我会交换(删除和重命名)文件,从而使用新的 BuildNo 重建我的模块。(听起来比在一个小时内编写代码更痛苦。)

无论如何,现在 QA 很高兴他们可以准确地验证所发布的软件版本,而无需依赖人来记住修改清单中的版本标签。

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')
}
于 2015-05-27T16:25:51.233 回答
1

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

    任务 cleanApks(类型:删除){
        sdkUpdate()    
    }

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

    字符串 executeSdkCommand(String cmd) {
        新的 ByteArrayOutputStream().withStream { os ->
            执行结果结果 = 执行 {
                可执行文件 = 'cmd'
                workingDir = "${System.getenv("ANDROID_HOME")}/tools"
                args = ['/c', cmd]
                标准输出 = 操作系统
            }
            返回 os.toString()

        }
    }

    依赖{
        cleanApks.dependsOn '干净'
        编译 fileTree(dir: 'libs', include: ['*.jar'])    
    }

于 2015-05-25T13:36:57.310 回答