Android Flavor渠道控制

333 阅读4分钟

Android开发过程中,我们经常需要针对不同环境(如开发环境、测试环境、生产环境)或不同客户群体(如免费版、付费版)构建不同的应用版本。Gradle提供了强大的Product Flavors功能,帮助开发者轻松管理这些不同的版本,实现版本控制的自动化和高效化。

1. 什么是Product Flavors?

Product Flavors是Gradle构建系统中的一个功能,它允许你为Android项目定义多个不同的构建变种(Variants)。每个变种可以包含特定的源代码集(source sets)、资源(resources)、依赖库(dependencies)以及构建配置(BuildConfig fields)。通过Product Flavors,你可以为每个变种定义不同的配置,快速切换不同的版本或配置环境。

举个例子,假设你的应用有开发版(dev)、测试版(staging)和生产版(release)三个版本,你可以通过Product Flavors来区分这三个版本的API地址、密钥以及其他不同的资源或功能。

2. 为什么需要Flavor版本控制?

1. 环境隔离

开发、测试和生产环境通常需要不同的配置,如API密钥、后端URL、日志等级等。使用Product Flavors,你可以轻松管理这些不同环境的配置,避免手动修改代码中的配置,确保每个版本的环境正确。

例如:

  • 开发版使用开发环境的API和调试信息。
  • 测试版使用测试环境的API和日志级别。
  • 生产版使用正式环境的API和严格的安全设置。

2. 功能差异

不同的用户群体(如免费版和付费版)可能需要不同的功能集。通过Product Flavors,你可以定义不同的构建变种,并为每个变种定制不同的功能。例如,付费版可能需要启用额外的功能或移除广告,而免费版则可以保留广告和一些受限功能。

3. 快速构建

Product Flavors能够让你针对特定的目标快速构建版本,减少手动修改配置的时间。你可以在Gradle脚本中直接指定要构建的版本,Gradle会自动根据Flavor配置生成正确的版本。

3. 如何设置Flavor?

build.gradle.kts

android {
    // 设置编译SDK版本
    compileSdkVersion 33  // 使用的Android SDK版本(可以根据需要调整)

    defaultConfig {
        // 默认配置,适用于所有构建变种
        applicationId "com.example.myapp"  // 设置应用的包名
        minSdkVersion 21  // 设置最低支持的Android版本
        targetSdkVersion 33  // 设置目标SDK版本(即应用兼容的最新Android版本)
        versionCode 1  // 设置应用的版本号,必须是整数,每次发布新版本时递增
        versionName "1.0"  // 设置应用的版本名称,通常是字符串
    }

    // 定义多个Flavor维度
    flavorDimensions "version", "environment"
    // "version"维度用于区分免费版和付费版
    // "environment"维度用于区分开发、测试、生产环境

    // 定义具体的Product Flavors
    productFlavors {
        // 开发版配置
        dev {
            dimension "environment"  // 指定这个Flavor属于哪个维度
            applicationIdSuffix ".dev"  // 给开发版的包名加上后缀 ".dev"
            versionNameSuffix "-dev"  // 给版本名加上后缀 "-dev"
            buildConfigField "String", "BASE_URL", '"https://dev.api.example.com"'  // 在BuildConfig中定义API的URL
        }

        // 测试版配置
        staging {
            dimension "environment"  // 指定这个Flavor属于哪个维度
            applicationIdSuffix ".staging"  // 给测试版的包名加上后缀 ".staging"
            versionNameSuffix "-staging"  // 给版本名加上后缀 "-staging"
            buildConfigField "String", "BASE_URL", '"https://staging.api.example.com"'  // 定义测试环境的API URL
        }

        // 正式版配置
        release {
            dimension "environment"  // 指定这个Flavor属于哪个维度
            buildConfigField "String", "BASE_URL", '"https://api.example.com"'  // 正式环境的API URL
        }

        // 免费版配置
        free {
            dimension "version"  // 指定这个Flavor属于哪个维度
            buildConfigField "boolean", "IS_PAID", "false"  // 定义一个标志,指示该版本是否为付费版
        }

        // 付费版配置
        paid {
            dimension "version"  // 指定这个Flavor属于哪个维度
            buildConfigField "boolean", "IS_PAID", "true"  // 付费版的标志
        }
    }

    // 定义构建类型(如调试版、发布版等)
    buildTypes {
        release {
            // 配置发布版构建类型的设置
            minifyEnabled true  // 启用ProGuard混淆代码,减小APK体积,保护代码
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'  // 指定ProGuard配置文件
        }
    }
    
    // 可以根据不同的flavor选择不同的代码路径
    sourceSets {
        this["debug"].java.srcDirs("src/debug/java")
        //...
    }
}

目录结构

src/
  main/
    java/
      com/example/myapp/
        MainActivity.java  // 公共的Activity
        CommonLogic.java   // 公共逻辑
    res/                   // 公共的资源文件
    assets/                // 公共的assets文件
  debug/
    java/
      com/example/myapp/
        DebugActivity.java // 仅在debug版本中使用的Activity
    res/                   // debug 特有的资源文件
    assets/                // debug 特有的assets文件
  release/
    java/
      com/example/myapp/
        ReleaseActivity.java // 仅在release版本中使用的Activity
    res/                   // release 特有的资源文件
    assets/                // release 特有的assets文件