【问题标题】:Android Studio Gradle Pre Build StepAndroid Studio Gradle 预构建步骤
【发布时间】:2015-05-25 13:23:40
【问题描述】:

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

这个问题有人问过,不过答案是Gradle的简洁sn-ps,使用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()
    }
}

【问题讨论】:

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


    【解决方案1】:

    您可以使用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
    }
    

    【讨论】:

    • 好的,太好了,经过几次尝试后,我确定了要将条目添加到哪个脚本以及在哪里。但是,我搞砸了,这并不完全符合我的意图(尽管它回答了我提出的问题)我真正需要的是仅在 Gradle 确定模块 需要 编译 ie 时才运行 exe。修改过的sme源或资源
    • 执行所有这些来注入版本号并不是真正必要的。你的 exe 选择数字的方式有什么特别之处?
    • QA 部门需要一个可追溯的内部版本号以用于发布目的。我的应用程序由多个单独维护的模块组成,因此每个模块都有一个内部版本号,每次我们重新编译它时都会递增。这就是我们软件的其余部分(非 Droid)的跟踪方式。
    • 这会破坏“增量构建”支持。这将导致 java 每次都构建您的项目,即使版本没有更改。您应该向任务添加输入和输出
    【解决方案2】:

    对于那些不熟悉 Gradle 的人(比如我),底部是我的模块的完整 build.gradle 脚本,因此您可以看到该工具的集成位置和方式,就像我们刚刚获得的 sn-ps 一样。 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 时,我比较了 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')
    }
    

    【讨论】:

    • 如果您使用 git 之类的版本控制系统,您可以在 buildconfig 中捕获当前提交的 SHA,从而允许您从应用程序代码中访问它。 U2020 示例应用程序的 build.gradle 是这样做的:github.com/JakeWharton/u2020/blob/master/build.gradle
    【解决方案3】:

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

    任务 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']) }

    【讨论】:

      猜你喜欢
      • 2016-02-04
      • 1970-01-01
      • 2018-10-20
      • 1970-01-01
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 2023-03-05
      • 2017-01-25
      相关资源
      最近更新 更多