Android 使用 Android Studio Flavors 的白标

Android White Labeling using Android Studio Flavors

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

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

我想我可以用 flavors 来模拟其中的大部分内容,问题如下:

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

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

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

  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 {
    }
}

当我让白色标签正常工作并为所有这些设置自动 运行 时,我也会将其添加到此。

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

I want all the builds to have the same version name and version code. If I leave the flavor config values empty, will they pick up the versions from the AndroidManifest.xml file?

如果您未在 productFlavors 块中指定 versionCodeversionName,则将应用您在 defaultConfig 块中定义的任何内容。

Is it possible to have each APK have it's own application name when generated, such AppHeyYou.apk and WhereIsThat.apk for another flavor? The examples I have seen seem to tack on a suffix to the end of APK name, I need a completely new APK name (and without the "Release" tacked on).

查看 applicationVariants 属性。它会让你写类似

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

Can I have it build the flavor, then copy it and rename it (such as MyApp.apk and copy to 44-MyApp.apk) using the version from the AndroidManifest.xml or the default config? Since there are close to a 100, changing this in each flavor config would be not be practical with each release.

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

Is there a way to force the generation of ALL the white labels with a single push of the button. Again, doing this for each would be impractical.

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

Build tasks
-----------
assemble - Assembles all variants of all applications and secondary packages.