使用build.gradle动态修改AndroidManifest.xml的参数

一、前言

有时候我们会需要在AndroidManifest.xml中进行一些参数配置,如下:

<meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="ca-app-pub-3940256099942544~3347511713" />

但是基于以下两种情况使用build.gradle进行控制会更好一点:

  1. 将参数进行统一管理,便于维护,为了后期方便修改

  2. 有时候其中的参数往往有测试和线上两种版本。测试环境使用测试参数,线上环境使用线上环境。如果让人为去进行修改,倘若类似参数过多的话,容易发生疏漏和错误。

二、使用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}\"")
        }
    }
}

六、参考链接

  1. 管理清单文件  |  Android 开发者  |  Android Developers

  2. 配置 build 变体  |  Android 开发者  |  Android Developers

  3. Android多渠道打包 - 简书

  4. different VersionCode for Debug/Release android gradle build

  5. Android Gradle defaultConfig详解及实用技巧 - HappyCorn - 博客园

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值