一、前言
有时候我们会需要在AndroidManifest.xml
中进行一些参数配置,如下:
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713" />
但是基于以下两种情况使用build.gradle
进行控制会更好一点:
-
将参数进行统一管理,便于维护,为了后期方便修改
-
有时候其中的参数往往有测试和线上两种版本。测试环境使用测试参数,线上环境使用线上环境。如果让人为去进行修改,倘若类似参数过多的话,容易发生疏漏和错误。
二、使用build.gradle进行参数管理
为什么使用build.gradle
进行参数管理呢?因为只在官网中看到了这种方式。假若我们参数是不经常改的,可以使用以下方式进行更改:
```xml
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="${adMobId}" />
```
defaultConfig {
...
manifestPlaceholders["adMobId"] = "ca-app-pub-3940256099942544~3347511713"
or
manifestPlaceholders = [adMobId: "ca-app-pub-3940256099942544~3347511713"]//多参数
}
三、根据程序类型进行动态更改
上文可以看到虽然可以使用build.gradle
进行参数管理了,但是对于测试版本和线上版本仍然需要进行手动更改,所以将代码调整如下:
buildTypes {
release {
manifestPlaceholders["adMobId"] = "release"
}
debug {
manifestPlaceholders["adMobId"] = "debug"
}
}
可以看到是使用buildTypes
参数进行配置的。这个参数和多渠道打包使用的参数是一样的,简要代码如下:
productFlavors {
flavor1 {
manifestPlaceholders["adMobId"] = "flavor1"
}
flavor2 {
manifestPlaceholders["adMobId"] = "flavor2"
}
}
四、建立统一变量管理文件
上文可以看到基本上需求都已经完成了,但是随着程序的复杂,build.gradle
里面的代码也急剧膨胀,如果在里面进行更改变量无疑会容易出错,因此可以将所有变量抽离到一个文件中进行管理,这种方式也是很多程序使用的统一版本管理的方式。
首先在更目录建立一个gradle
文件。这里定义为configation.gradle
:
//这是一个配置文件
//因为groovy作用域的问题,变量需要依托于一个作用域才行,
// 如果直接定义的话 函数内和函数外不在一个作用域下面无法直接访问,
// 但是赋值给ext或者其它对象后可以通过间接方式访问
//测试环境的adMobId
ext.adMobIdDebug = "ca-app-pub-3940256099942544~3347511713"
//正式环境的adMobId
ext.adMobIdRelease = "ca-app-pub-4620354840217023~9818057418"
//通过修改isDebug来区分正式环境和测试环境,完美方式是通过环境获取,但是现在不知道怎么解决这个问题
def getAdMobId(boolean isDebug = true){
println "YM---->是否是debug:$isDebug"
def adMobId
if (isDebug){
adMobId = adMobIdDebug
}else {
adMobId = adMobIdRelease
}
return adMobId
}
ext.getAdMobId = this.&getAdMobId
在根目录的build.gradle
中引入这个文件:
buildscript {
apply from: 'configation.gradle'
repositories {
google()
mavenCentral()
maven { url 'https://jitpack.io' }
}
dependencies {
classpath "com.android.tools.build:gradle:7.0.4"
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
修改以上代码
buildTypes {
release {
manifestPlaceholders["adMobId"] = getAdMobId(false)
}
debug {
manifestPlaceholders["adMobId"] = getAdMobId(true)
}
}
五、配置代码参数
上文记录的都是配置AndroidManifest.xml
参数。但是有时候参数是在代码中使用的,那么根据以上思路,可以使用以下方式根据不同版本进行更改,示例如下:
buildTypes {
release {
...
buildConfigField "String", "Config", "\"release\""
}
debug {
...
buildConfigField("String", "Config", '"debug"')
}
}
另外还可以通过动态代码配置进行buildConfigField批量追加参数,如下(该方式未经测试):
allprojects {
...
afterEvaluate { project ->
def android = project.extensions.findByName("android")
if(android != null){
def defaultConfig = android["defaultConfig"]
defaultConfig.buildConfigField("String", "MODULE_NAME", "\"${project.name}\"")
}
}
}