0

我最近从 Eclipse 迁移到 Android Studio,经过一番努力,应用程序启动并运行。现在我面临第二个障碍——生成应用程序的白标版本。我已经阅读了有关 Android Studio 中的 Flavor 机制的所有内容,我相信它会起作用,但我仍然有几个问题。

但首先让我解释一下我们使用 Ant 使用的当前白标机制(由于支持库的升级,我认为我不能再使用它了,因为它确实需要在 lib 文件夹中存在 Jar 文件?)。这个 Ant 脚本读取一个build.xml文件,我们在该文件中指定了新值(strings.xmlcolors.xml)的位置以及特定于白标的资源文件夹(图像等)。它基本上复制新文件(只有少数不同),然后运行构建,重命名 APK 并为其提供新的 App Id。因此,只需按一下按钮,我就可以一举制作超过 100 个白色标签。此构建中包含一个复制机制,它创建新 APK 的副本以及与之关联的版本,所以如果基本风格是MYAPP.apk我们在第 44 版上,它会复制它并制作一个44-MYAPP.apk我们保留的版本,以防我们需要为那些直接从我们的 S3 而不是从 GooglePlay 拉取的客户回滚 - 是的,这是其中一些客户的要求。

我想我可以用口味来模仿其中的大部分内容,但有以下问题:

  1. 我希望所有构建都具有相同的版本名称和版本代码。如果我将风味配置值留空,他们会从 AndroidManifest.xml 文件中获取版本吗?

  2. 是否可以让每个 APK 在生成时都有自己的应用程序名称,这样AppHeyYou.apk或者WhereIsThat.apk为了另一种风格?我看到的示例似乎在 APK 名称的末尾添加了一个后缀,我需要一个全新的 APK 名称(并且没有添加“ Release”)。

  3. 我可以让它构建风味,然后使用来自或默认配置的版本复制它并重命名它(例如MyApp.apk并复制到)?由于有接近 100 个,因此在每个版本中更改每个风味配置都不实用。44-MyApp.apkAndroidManifest.xml

  4. 有没有办法通过单次按下按钮来强制生成所有白色标签。同样,为每个人都这样做是不切实际的。

谢谢你的帮助!

更新

只是为了提供帮助,我想我会展示我最终得到的完整 gradle 脚本。这是它的作用:

  1. 定义口味
  2. 在构建它们时,给它们提供风味的名称,但在前面加上版本代码(因此版本代码为 44 的红色风味变为“44-Red.apk”)。

最后我的应用程序的 build.gradle 看起来像这样:

buildscript {
    repositories {
        maven { url 'https://maven.fabric.io/public' }
    }

    dependencies {
        classpath 'io.fabric.tools:gradle:1.+'
    }
}
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'

repositories {
    maven { url 'https://maven.fabric.io/public' }
}


android {
    compileSdkVersion 25
    buildToolsVersion '25.0.2'
    defaultConfig {
        applicationId "com.mycompany.ourapp"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 62
        versionName "1.0.62"
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_7
            targetCompatibility JavaVersion.VERSION_1_7
        }
        signingConfig signingConfigs.config
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    productFlavors {
        Red {
            setProperty("archivesBaseName", "red")
        }
        Blue {
            setProperty("archivesBaseName", "blue")
        }
    }


    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            def path = "C:/AndroidBuilds/MyCompany.Build/" + "/"
            def SEP = "-"
            def flavor = variant.productFlavors[0].name
            def version = variant.versionCode
            def newApkName = path + version + SEP + flavor
            def newApkNameNoVersion = path + flavor
            output.outputFile = new File(newApkName + ".apk")

    }
}

dependencies {
    }
}

当我让白色标签工作并为所有这些人自动运行时,我也会对此进行处理。

4

1 回答 1

1

我很抱歉不知道艺术的精确gradle术语,但是......

我希望所有构建都具有相同的版本名称和版本代码。如果我将风味配置值留空,他们会从 AndroidManifest.xml 文件中获取版本吗?

如果您未在块中指定或,versionCode则将应用您在块中定义的任何内容。versionNameproductFlavorsdefaultConfig

是否可以让每个 APK 在生成时都有自己的应用程序名称,例如 AppHeyYou.apk 和 WhereIsThat.apk 以获得另一种风格?我看到的示例似乎在 APK 名称的末尾添加了一个后缀,我需要一个全新的 APK 名称(并且没有添加“Release”)。

查看applicationVariants物业。它会让你写类似的东西

applicationVariants.all { variant ->
    variant.outputs.each { output ->
        def newName = [build your filename here]
        output.outputFile = new File(output.outputFile.parent, newName);
    }
}

我可以让它构建风味,然后使用 AndroidManifest.xml 中的版本或默认配置复制它并重命名它(例如 MyApp.apk 并复制到 44-MyApp.apk)?由于有接近 100 个,因此在每个版本中更改每个风味配置都不可行。

在上面的applicationVariants.all块中,您可以使用包含版本信息的文件名访问defaultConfig.versionCode和创建副本。.versionName

有没有办法通过单次按下按钮来强制生成所有白色标签。同样,为每个人都这样做是不切实际的。

我相信你可以运行命令gradlew assemble。运行gradlew tasks输出这个(以及许多其他任务):

Build tasks
-----------
assemble - Assembles all variants of all applications and secondary packages.
于 2017-08-11T00:25:43.003 回答