- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个针对 buildTypes 调试/发布以及两个 productFlavors 具有不同包名称的应用程序。
我的 build.gradle 中有趣的部分如下所示:
android {
buildTypes {
debug {
packageNameSuffix ".debug"
}
release {
signingConfig signingConfigs.release
}
}
productFlavors {
flavor1 {
packageName "com.example.app.flavor1"
}
flavor2 {
packageName "com.example.app.flavor2"
}
}
所以有包名:
com.example.app.flavor1com.example.app.flavor1.debugcom.example.app.flavor2com.example.app.flavor2.debug
代码一切正常。但是因为修改后的包名称在合并 list 时弄乱了,我需要为每个有效包手动设置一些东西,比如 GCM 权限和内容提供者权限。
但是它是怎么做到的呢?无论我将 AndroidManifest.xml
放入 src/falvor{1,2}
还是放在 src/{debug,release}
中,我最终只有两种配置。我尝试了类似 flavor1Debug
的东西,但没有成功。
最佳答案
没有正式的方法来设置“flavorBuildType”(如 flavor1Debug)组合的资源文件,因此您必须在这里做一些修改。
首先定义AndroidManifest.xml的新路径:
project.ext.flavor1 = [
debugManifest: 'src/flavor1Debug/AndroidManifest.xml',
releaseManifest: 'src/flavor1Release/AndroidManifest.xml'
]
project.ext.flavor2 = [
debugManifest: 'src/flavor2Debug/AndroidManifest.xml',
releaseManifest: 'src/flavor2Release/AndroidManifest.xml'
]
其次,告诉 gradle 在 processManifest 任务中使用新的 AndroidManifest.xml。现在的问题是:sourceSet.manifest.srcFile 是只读的,我们不能即时替换它。由于我们为每种风格使用单独的资源(调试和发布),我们可以将新的 AndroidManifest.xml 复制到原始风格文件夹,gradle 将使用正确的设置构建 APK 文件。
android.applicationVariants.all { variant ->
variant.processManifest.doFirst {
if (project.ext.has(variant.productFlavors.name)) {
if (project.ext[variant.productFlavors.name].debugManifest != null &&
project.ext[variant.productFlavors.name].releaseManifest != null) {
def manifestDirectory = android.sourceSets[variant.productFlavors.name].manifest.srcFile.parentFile
if (variant.buildType.name.equals("debug")) {
copy {
from project.ext[variant.productFlavors.name].debugManifest
into manifestDirectory
}
} else if (variant.buildType.name.equals("release")) {
copy {
from project.ext[variant.productFlavors.name].releaseManifest
into manifestDirectory
}
}
}
}
}
variant.processManifest.doLast {
if (project.ext.has(variant.productFlavors.name)) {
project.delete android.sourceSets[variant.productFlavors.name].manifest.srcFile
}
}
}
对于 AndroidManifest.xml,只需将 GCM 相关设置留在那里:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.example.free.debug"
android:versionCode="1"
android:versionName="1.0" >
<permission
android:name="com.android.example.free.debug.permission.C2D_MESSAGE"
android:protectionLevel="signature" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="com.android.example.free.debug.permission.C2D_MESSAGE" />
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE" />
</manifest>
您可以在此处获取示例代码:https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks
它同时支持 Google Maps API v2 和 GCM 案例,但我认为在进行少量代码更改后也很容易支持内容提供商。
关于android - 如何按 buildType AND flavor 拆分源代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18606152/
我想在我的项目中配置第三个 BuildType,它继承另一个 BuildType 的所有配置。 我该怎么做? 最佳答案 只需在构建类型中使用 initWith 属性即可: uitesting {
我有两个 gradle 模块 :app (安卓应用) :data (安卓库):app取决于 :data .我创建了一个额外的 buildType对于两个名为 mock 的模块.当我构建 :app在 m
我创建了如下的自定义 buildType: buildTypes { releasefree.initWith(buildTypes.release) release
我的Android项目具有多种构建类型和productFlavors flavorDimensions "default" productFlavors { favor1
这是我的 build.gradle(Module: app) 的一部分 buildTypes { release { minifyEnabled false p
我正在使用 android 实验性插件 0.4 ( gradle 2.8 ) 并想修改与 buildType 关联的所有任务;在我的案例中进行调试。 目前,我正在使用以下“hack”: tasks.a
enter image description here 我正面临这个问题 Could not find method buildTypes() for arguments [build_3r52yu
我在buildTypes中有四个条目。它工作正常,我可以在linux终端上触发gradle build命令,在项目目录中创建8个apk文件,等等。在android studio中,我可以在构建版本之间
谁能解释buildTypes块如何在Gradle中工作? 据我所知,调试块在 Debug模式下运行,发布块在 Release模式下运行。 但是,如果我运行Gradle脚本,则这两个块都将运行! b
我无法创建使用不同 list 的两种不同构建类型。即使使用--rerun-tasks重新运行gradle并完全删除了构建目录后,apk中包含的AndroidManifest还是不正确的。例如,我运行a
我的项目gradle文件中出现此错误: 'buildTypes' cannot be applied to '(groovy.lang.Closure)' 我目前正在使用Android Studio
我正在使用以下配置: android { // a lot more of definitions... signingConfigs { // For advanced-artefacts,
BuildType 对象(Gradle Android 插件)的这两个属性有什么区别? applicationIdSuffix 和 packageNameSuffix? zipAlign 属性是什么意
我是 Gradle 构建工具的新手。我想在 Android 应用程序中创建常量 OPEN_WEATHER_MAP_API_KEY 但出现以下错误 构建.gradle `apply plugin:
我想通过以下方式区分发布和调试 buildTypes: buildTypes { release { minifyEnabled false signingC
我有三种构建类型,我试图让 staging 构建类型运行,但我收到以下错误: Error: The apk for your currently selected variant (app-stagi
我有一个 Android 应用程序,我想更改调试和其他 buildTypes 的应用程序标签。我没有任何口味! 这是我认为应该有效的设置: -src |-debug |-res
我想设置一个项目来构建两个可以安装在同一设备上的不同 apk - 其中一个是生产 apk,第二个是调试 apk。为此,我在 build.gradle 中定义了: buildTypes {
我有 2 种风格的应用程序,每种都有自己的 google maps (v1) key 用于调试和发布(意味着总共有 4 个 key )。所以我想知道我是否可以根据 buildType 和 produc
决定使用 Gradle 6.5 从 Android gradle plugin 3.5.x 切换到 gradle plugin 4.10 并坚持错误。 这是我的 build.gradle defaul
我是一名优秀的程序员,十分优秀!