Jem*_*rov 9 android gradle kotlin gradle-kotlin-dsl
我正在尝试为应用程序变体设置signingConfig, manifestPlaceholders, 。buildConfigField我可以为每个构建类型设置它们或者!ProductFlavor 独立,但我需要的是根据 ProductFlavor和!构建类型。
buildTypes{
getByName("debug"){}
getByName("release"){}
create("staging"){}
}
productFlavors {
create("global"){}
create("local"){}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,有 3 种不同的 buildType 和 2 种不同的 ProductFlavors。这意味着总共有 6 个 APK 变体。对于每个APK(globalRelease、globalStaging、globalDebug、localRelease、localStaging、localDebug),我想使用不同的signingConfig。我该如何设置?
尝试过:
Jem*_*rov 16
\n\n错误:“构建类型包含自定义 BuildConfig 字段,但该功能已禁用”
\n
需要启用buildConfigfor variant.buildConfigFields.set(),它的默认值是 true但现在是false:
android {\n buildFeatures {\n buildConfig = true\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n\n错误:“无法创建 com.android.build.api.variant.impl.LibraryVariantBuilderImpl 类型的实例...\n未指定命名空间。在模块的构建\n文件中指定命名空间”
\n
namespace现在在模块级构建脚本中是必需的。您需要为每个模块单独指定它,并且它应该与该模块的包名称相同 (而不是appId)。
这也和生成的R类有关,它会变成my.module.package.R. 另一个重大更改是您不能用于this.module.package.R引用您所依赖的另一个模块的资源(可绘制、字符串...),您必须使用my.another.module.R.drawable.login. 因为以前标志的默认值android.nonTransitiveRClass是false并且R包含您所依赖的每个模块的可绘制对象。现在它的默认值为true,因此R仅包含该模块的资源(缩短构建时间)。
此外,您需要package=""从每个模块的 AndroidManifest.xml 中删除。
我们现在使用外部块applicationVariants.all{}来代替。此代码应该适用于 Gradle 7.0.2 和 AGP 7.0.1: androidComponents { onVariants{ .. }}android{}
androidComponents {\n onVariants { variant ->\n variant.buildConfigFields.put("MY_CUSTOM_FIELD", BuildConfigField("String", "MyCustomValue", null))\n variant.manifestPlaceholders.put("MY_MANIFEST_FIELD", "MyManifestValue")\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n在 AGP 7.0.x 上,无法设置 signingConfig( mergedFlavorbuildType+flavor)。您可以单独设置 buildType 或flavor,但不能组合设置。
在 AGP 7.1.x 上,您可以做到。但它需要 AGP 7.1.0-alpha10、Gradle 7.2-rc-3、AndroidStudio BumbleBee 2021.1.1 alpha10:
\nandroidComponents {\n onVariants { variant ->\n variant.signingConfig?.setConfig(android.signingConfigs.getByName("buildTypeXFlavorA"))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\xe2\x80\x8e\xe2\x80\x8e\n\xe2\x80\x8e
\n要对不同变体(buildType+productFlavor)进行更改,我必须使用android.applicationVariants.all{}. 但是用不同的路径来实现多个signingConfig,,manifestPlaceholdersbuildConfigField
1) 清单占位符
\nandroidComponents {\n onVariants { variant ->\n variant.buildConfigFields.put("MY_CUSTOM_FIELD", BuildConfigField("String", "MyCustomValue", null))\n variant.manifestPlaceholders.put("MY_MANIFEST_FIELD", "MyManifestValue")\n }\n}\nRun Code Online (Sandbox Code Playgroud)\nmanifestPlaceholders对象没有 getter/setter variant。接下来,我们可以使其variant.mergedFlavor可变。设置manifestPlaceholders确实variant.mergedFlavor有效。
androidComponents {\n onVariants { variant ->\n variant.signingConfig?.setConfig(android.signingConfigs.getByName("buildTypeXFlavorA"))\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n2)构建配置字段
\n用同样的方法,打电话addBuildConfigField(ClassFieldImpl(type, name, value))也mutableMergedFlavor没有用。但相反,它可以直接设置在variant.
applicationVariants.all{\n val variant = this\n}\nRun Code Online (Sandbox Code Playgroud)\n3) 签名配置\nsigningConfig可以按上面所示进行设置mutableMergedFlavor,但变体除外debug。所有debug变体都使用默认签名选项,即使您将其设置为variant.mergedFlavor. 但如果您将默认值设置为 null,那么您也可以覆盖它。
import com.android.builder.core.DefaultProductFlavor\n\napplicationVariants.all{\n val manifestPlaceholders: Map<String, String>\n val variant = this\n val mutableMergedFlavor = variant.mergedFlavor as DefaultProductFlavor\n mutableMergedFlavor.addManifestPlaceholders(manifestPlaceholders)\n}\nRun Code Online (Sandbox Code Playgroud)\n将所有内容放在一起:
\nimport com.android.builder.internal.ClassFieldImpl\n\napplicationVariants.all{\n val buildConfigFields: List<ClassFieldImpl>\n val variant = this\n buildConfigFields.forEach { \n variant.buildConfigField(it.type, it.name, it.value) \n }\n}\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
3876 次 |
| 最近记录: |