封装产品的特性,只需配置 productFlavors {}
。productFlavors支持与 defaultConfig{}
相同的属性,这是因为 defaultConfig
实际上属于 ProductFlavor
类。这意味着,您可以在 defaultConfig {}
代码块中提供productFlavors的基本配置,productFlavors{}
里面的每种均可更改任何这些默认值,也可以指定不同的特性、设备需求、资源和应用程序ID,同时共享公共源代码和资源.
android {
...
defaultConfig {...}
buildTypes {...}
productFlavors {
demo {
applicationIdSuffix ".demo"
versionNameSuffix "-demo"
}
full {
applicationIdSuffix ".full"
versionNameSuffix "-full"
}
}
}
Gradle 会根据您的buildType{}和productFlavors自动创建构建变体,并按照 <product-flavor><Build-Type> 的格式命名这些变体。
下面是它的一些常用属性:
属性 | 描述 |
---|---|
applicationId | 应用的包名 |
versionCode | 版本号 |
versionName | 版本名 |
versionNameSuffix | 版本名后缀 |
map<String,Object> manifestPlaceholders | 定义Manifest变量占位符 |
applicationId
每个 Android 应用均有一个唯一的应用 ID,像 Java 软件包名称一样,如 com.example.myapp。 此 ID 可以在设备上和 Google Play 商店中对您的应用进行唯一标识。 如果您想要上传新版本的应用,应用 ID必须与原始 APK 相同 – 如果您更改应用 ID,Google Play 商店会将 APK 视为完全不同的应用。所以您发布应用后,绝不应更改应用 ID。
当您在 Android Studio 中创建新项目时,applicationId 会完全匹配您在设置时选择的 Java 风格软件包名称。 不过,除了这一点,应用 ID 和软件包名称彼此无关。您可以更改代码的软件包名称(代码命名空间),这不会影响应用 ID,反之亦然(但同样,您发布应用后不应再更改应用 ID)
尽管应用 ID 看起来像传统的 Java 软件包名称,但应用 ID 的命名规则有更多限制:
1.必须至少包含两段(一个或多个圆点)。
2.每段必须以字母开头。
3.所有字符必须为字母数字或下划线 [a-zA-Z0-9_]。
注意Context.getPackageName()
方法会返回您的应用 ID。 无论何时都不需要在应用代码以外分享代码真实的软件包名称。
ProductFlavor类里面的buildConfigField方法在配置中的使用:
buildConfigField("boolean", "LOG_DEBUG", "true")
buildConfigField "int", "VERSION_TYPE", "1"
这个方法接收三个非空的参数,第一个:确定值的类型,第二个:指定key的名字,第三个:传值。
上面的意思是:LOG_DEBUG = true ;VERSION_TYPE = 1
可以用在代码中:
if(BuildConfig.LOG_DEBUG){
//Debug,打印日志
Logger.init("AppPlusLog").setLogLevel(LogLevel.FULL);
}else{
//release,关闭日志
Logger.init("AppPlusLog").setLogLevel(LogLevel.None);
}
String versionType = BuildConfig.VERSION_TYPE;
将Build文件中声明的变量属性使用到Manifest中
比如:
1.配置主机ip地址,名称
android {
defaultConfig {
manifestPlaceholders = [hostName:"www.example.com",post:"8080"]
}
...
}
然后你可以把其中的key插入到Manifest文件属性值:
<intent-filter ... >
<data android:scheme="http" android:host="${hostName}" ... />
...
</intent-filter>
你还可以用这些属性值作为命名空间,比如定义action name
android {
defaultConfig {
applicationId "com.example.myapp"
}
productFlavors {
free {
applicationIdSuffix ".free"
}
pro {
applicationIdSuffix ".pro"
}
}
}
你可以将application ID插入到action name,如下:
<intent-filter ... >
<action android:name="${applicationId}.TRANSMOGRIFY" />
...
</intent-filter>
当你运行的是free版本的时候,它就类似于:
<intent-filter ... >
<action android:name="com.example.myapp.free.TRANSMOGRIFY" />
...
</intent-filter>
过滤变体
Gradle 会为您配置的产品风味与构建类型的每个可能的组合创建构建变体。不过,某些特定的构建变体在您的项目环境中并不必要,也可能没有意义。您可以在模块级 build.gradle
文件中创建一个变体过滤器,以移除某些构建变体配置。
以上一部分中的构建配置为例,假设您计划为演示版本的应用仅支持 API 级别 23 和更高级别。您可以使用 variantFilter {}
代码块过滤出组合了“minApi21”和“演示”产品风味的所有构建变体配置:
android {
...
buildTypes {...}
flavorDimensions "api", "mode"
productFlavors {
demo {...}
full {...}
minApi24 {...}
minApi23 {...}
minApi21 {...}
}
variantFilter { variant ->
def names = variant.flavors*.name
// To check for a certain build type, use variant.buildType.name == "<buildType>"
if (names.contains("minApi21") && names.contains("demo")) {
// Gradle ignores any variants that satisfy the conditions above.
setIgnore(true)
}
}
}
...
在您向构建配置添加变体过滤器并点击通知栏中的 Sync Now后,Gradle 将忽略满足您指定的条件的任何构建变体,在您点击菜单栏中的 Build > Select Build Variant(或工具窗口栏中的 Build Variants)时,这些构建变体将不会再显示在下拉菜单中。
https://developer.android.com/studio/build/manifest-build-variables.html