赞
踩
有时候我们会需要在AndroidManifest.xml
中进行一些参数配置,如下:
<meta-data
android:name="com.google.android.gms.ads.APPLICATION_ID"
android:value="ca-app-pub-3940256099942544~3347511713" />
但是基于以下两种情况使用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}\"")
}
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。