gpt4 book ai didi

android - 如何按 buildType AND flavor 拆分源代码

转载 作者:太空狗 更新时间:2023-10-29 16:40:27 25 4
gpt4 key购买 nike

我有一个针对 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com