Gradle多渠道打包

一、前提

从程序员角度来说,一个程序一个包不香么,可是运营打包推一波CPL渠道。每个包里的内容都是一样的,只是一个渠道标识不同。

二、分析

gradle有多渠道打包的productFlavors配置,然后我们可以在AndroidManifest.xml添加一个meta-data变量存储渠道值,通过productFlavors配置打不同包时把不同的参数传过去就行了,最后在java中读取对应的渠道值。

三、步骤

1、修改AndroidManifest.xml配置

打开工程目录的AndroidManifest.xml配置,在<application>标签内添加 CHANNEL属性。


<application
        android:allowBackup="true"
        android:label="@string/app_name"
        android:usesCleartextTraffic="true"
        android:icon="@mipmap/ic_launcher"
        android:networkSecurityConfig="@xml/network_security_config"
        android:extractNativeLibs="true"
        tools:targetApi="n">

        <meta-data android:name="android.app.lib_name"
                   android:value="cocos2djs" />

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

...
    </application>

2. 配置gradle

找开主工程中的build.gradle(cocos creator工程是app目录下的build.gradle)。在android {}添加productFlavors属性。最后将属性设置到AndroidManifest.xml中的CHANNEL_VALUE变量中。

android {
    ...
    productFlavors{
        common{}  // 官包
        xianwan{}  // 闲玩
        xiaozhuo{}  // 小啄
        zhuanke{}  // 赚客
        ...
    }
    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
    }
    ...
}

3. java中读取meta-data

加一个读取applicationmeta-data的方法

     /**
     * 获取app当前的渠道号或application中指定的meta-data * *
     * @return 如果没有获取成功(没有对应值,或者异常),则返回值为空
     */
    public static String getAppMetaData(Context context, String key) {
        if (context == null || TextUtils.isEmpty(key)) {
            return null;
        }
        String value= null;
        try {
            PackageManager packageManager = context.getPackageManager();
            if (packageManager != null) {
                ApplicationInfo applicationInfo = packageManager.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
                if (applicationInfo != null) {
                    if (applicationInfo.metaData != null) {
                        value= applicationInfo.metaData.getString(key);
                    }
                }
            }
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return value;
    }

在需要用到的时候。

getAppMetaData(appActivity,"CHANNEL")

4. 打包

可以直接用gradlew直接打包所有渠道的包

gradlew clean :assembleRelease
0%