flx*_*flx 2 android gradle android-studio
我有一个应用程序,具有不同的包名称,用于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"
}
}
Run Code Online (Sandbox Code Playgroud)
所以有包名称:
com.example.app.flavor1 com.example.app.flavor1.debug com.example.app.flavor2 com.example.app.flavor2.debug
代码一切都很好.但是因为在合并清单时修改后的包名称搞砸了,我需要手动为每个有效包设置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'
]
Run Code Online (Sandbox Code Playgroud)
其次,告诉gradle在processManifest任务中使用新的AndroidManifest.xml.现在问题是:sourceSet.manifest.srcFile是只读的,我们不能只是在运行时替换它.由于我们为每种风格使用单独的资源(调试和发布),我们可以将新的AndroidManifest.xml复制到origin flavor文件夹,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
}
}
}
Run Code Online (Sandbox Code Playgroud)
对于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>
Run Code Online (Sandbox Code Playgroud)
您可以在此处获取示例代码:https://github.com/shakalaca/learning_gradle_android/tree/master/07_tricks
它同时支持Google Maps API v2和GCM案例,但我认为在轻微更改代码后也很容易支持内容提供商.
| 归档时间: |
|
| 查看次数: |
4592 次 |
| 最近记录: |