Android 中的 flavorDimensions、productFlavors 和 buildType

1,065 阅读2分钟

在 Android 开发中,Gradle 构建系统提供了强大的配置选项,使得开发者能够根据不同的需求生成多个不同的应用变体(Variants)。一共有三个配置选项:flavorDimensionsproductFlavorsbuildType

1. flavorDimensions

flavorDimensions 用来定义 flavor 的维度。通过定义维度,你可以将 flavor 分组,以便在构建过程中组合不同的 flavor 。例如,如果你的应用需要根据不同的用户类型和市场发布不同的版本,你可以定义两个维度:typemarket

注:有的文章将 productFlavors 翻译成产品风味,笔者认为翻译得不是很好,因为读起来有些奇怪,故本文采用原词。

android {
    flavorDimensions "type", "market"
    // 创建产品变体
    productFlavors {
        free {
            dimension "type"
        }
        paid {
            dimension "type"
        }
        us {
            dimension "market"
        }
        cn {
            dimension "market"
        }
    }
}

在这个例子中,flavorDimensions 定义了两个维度:typemarket。然后,productFlavors 中的每个 flavor 都指定了对应的维度。

2. productFlavors

productFlavors 用来定义具体的 flavor,这些 flavor 定义了应用的不同版本,比如免费版、付费版、不同地区的版本等。每个 flavor 可以有自己的配置,比如版本名称后缀、应用ID后缀、资源文件、ProGuard规则等。

productFlavors {
    free {
        dimension "type"
        applicationIdSuffix ".free"
        versionNameSuffix "-free"
    }
    paid {
        dimension "type"
        applicationIdSuffix ".paid"
        versionNameSuffix "--paid"
    }
    us {
        dimension "market"
        applicationIdSuffix ".us"
        versionNameSuffix ".us"
    }
    cn {
        dimension "market"
        applicationIdSuffix ".cn"
        versionNameSuffix ".cn"
    }
}

在这个配置中,我们定义了两个 flavorfreepaid,并且为它们分配了不同的 dimension 和配置。

3. buildType

buildType 用来定义应用的构建类型,比如 debugrelease。每个构建类型可以有自己的配置,比如是否启用 ProGuard、是否生成 APK 的映射文件等。

buildTypes {
    debug {
        applicationIdSuffix ".debug"
        versionNameSuffix "-debug"
    }
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

在这个配置中,debugrelease 构建类型被定义,并且为它们配置了不同的属性。

通过上述配置,Gradle会自动为你创建以下变体:

  • freeCnDebug:中国市场的免费版,调试模式。
  • freeCnRelease:中国市场的免费版,发布模式。
  • freeUsDebug:美国市场的免费版,调试模式。
  • freeUsRelease:美国市场的免费版,发布模式。
  • paidCnDebug:中国市场的付费版,调试模式。
  • paidCnRelease:中国市场的付费版,发布模式。
  • paidUsDebug:美国市场的付费版,调试模式。
  • paidUsRelease:美国市场的付费版,发布模式。

可以看出,不同维度的 flavor 和不同的 buildType 可以互相组合,生成多种 variant

总结

通过使用 flavorDimensionsproductFlavors,可以灵活地为不同的市场、不同用户、不同设备类型或不同功能配置生成不同的应用版本。而 buildType 则允许你为不同的构建场景(如调试和发布)定义不同的构建配置。这三个工具的结合使用,使得 Android 应用的构建过程更加灵活和强大,可以通过一次构建,生成多个渠道包。