Android Gradle 多渠道打包、动态配置AppName

一、简介

因为国内Android应用分发市场的现状,我们在发布APP时,一般需要生成多个渠道包,上传到不同的应用市场。这些渠道包需要包含不同的渠道信息,在APP和后台交互或者数据上报时,会带上各自的渠道信息。这样,我们就能统计到每个分发市场的下载数、用户数等关键数据。

二、Gradle多渠道打包

1、普通做法

通常情况下的做法是在 AndroidManifest 中增加渠道号:

<meta-data android:name="SDK_CHANNEL" android:value="Channel ID" />

如需更改则手动设置,然后再次打包。如此一来,重复的工作量大大增加。于是就有了AndroidStudio上的多渠道打包。

2、Gradle多渠道打包

对于这种情况,Android Gradle提供了非常便捷的方法让我们来替换AndroidManifest文件中的内容,他就是 manifestPlaceholderManifest 占位符。

ManifestPlaceholdersProductFlavor 的一个属性,是一个Map类型,所以我们可以同时配置很多个占位符。下面我们就通过这个配置渠道号的例子来演示manifestPlaceholders的用法。

build.gradle 中的 android 标签内增加如下代码:

android {
	...

	productFlavors{
        google{
            manifestPlaceholders = [
                    SDKChannel: "google",
                    app_name : "@string/app_name",
            ]
        }
        baidu{
            manifestPlaceholders = [
                    SDKChannel: "baidu",
                    app_name : "@string/app_name",
            ]
        }
    }
}

AndroidManifest.xml 文件中代码如下:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sdk">
	<application ...
			android:label="${app_name}">

		<meta-data
            android:name="SDKChannel"
            android:value="${SDKChannel}" />

		...
	</application>
</manifest>

接下来我们就来看看打包效果了。
在这里插入图片描述在这里插入图片描述
如果,一个App的渠道号很多的话,我们总不能一个个配置吧,太多也太累,维护也麻烦,我们还可以通过迭代productFlavors批量的方式进行修改。

android {
	...

	productFlavors{
        google{
        }
        baidu{
        }
    }

	productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [SDKChannel: name, app_name : "@string/app_name"]
    }
}

我们通过all函数遍历每一个ProductFlavor,然后把它们的name作为渠道名,非常方便。这里不止可以做这一个事情,在遍历ProductFlavor的时候,你可以做很多你想做的事情,这就是Gradle的灵活之处,把脚本当程序写。

Android Gradle提供的manifestPlaceholders占位符的应用方式,让我们可以替换AndroidManifest文件中任何${Var}格式的占位符。所以他的使用场景不限于渠道名这一个,比如还有ContentProvider的auth的授权,或者其他动态配置meta信息等。灵活运用它能帮助我们做很多事情,让我们的构建更灵活,更方便。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章