一、前提
从程序员角度来说,一个程序一个包不香么,可是运营打包推一波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
值
加一个读取application
中meta-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