版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/emdd2016/article/details/53292415
Gradle多渠道打包
- 多渠道打包基本实现
- 不同的渠道包显示不同的APP_NAME
- 不同的渠道包显示的res资源不一样
简单的多渠道打包
1.在AndroidMainfest.xml的application中配置自定义项
<meta-data
android:name="channel_key"
android:value="${CHANNEL_VALUE}" />
2.在主工程的build.gradle中添加下面的代码
productFlavors {
xiaomi {
manifestPlaceholders = [CHANNEL_VALUE: name]
// 可以通过下面的代码配置不同的包名【这样不同渠道的包可以同时安装】,正常情况下不需要
// applicationId "com.xx.xiaomi"
// packageName = "com.xx.xiaomi"
}
huawei {
manifestPlaceholders = [CHANNEL_VALUE: name]
// 可以通过下面的代码配置不同的包名【这样不同渠道的包可以同时安装】,正常情况下不需要
// applicationId "com.xx.huawei"
// packageName = "com.xx.huawei"
}
yingyongbao {
manifestPlaceholders = [CHANNEL_VALUE: name]
// 可以通过下面的代码配置不同的包名【这样不同渠道的包可以同时安装】,正常情况下不需要
// applicationId "com.xx.yingyongbao"
// packageName = "com.xx.yingyongbao"
}
}
//上面的可以简写成如下的形式(遍历获取channel_value)
productFlavors {
xiaomi {
}
huawei {
}
yingyongbao {
}
productFlavors.all {
flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
不同的渠道包显示不同的APP_NAME
- 修改AndroidMainfest.xml中application的label标签
android:label="${NNE_NAME}"
tools:replace="android:label" // 声明android:label是可以修改的。【这一句是非常关键的,如果没有在编译的时候会出错。】
2.配置build.gradle中的productFlavors不同的渠道设置不同的APP_NAME
productFlavors {
xiaomi {
manifestPlaceholders = [APP_NAME : "测试app-xiaomi",
CHANNEL_VALUE: "xiaomi"]
}
huawei {
manifestPlaceholders = [APP_NAME : "测试app-huawei",
CHANNEL_VALUE: "huawei"]
}
yingyongbao {
manifestPlaceholders = [APP_NAME : "测试app-yingyongbao",
CHANNEL_VALUE: "yingyongbao"]
}
}
扩展:配置不同包名需要的不同key可以如上在AndroidManifest.xml中先定义一个自定义的项,然后在productFlavors中对此做具体的配置来实现。
不同的渠道包使用不同的资源文件res
在main目录创建和渠道对应的文件夹,文件夹里边的目录结构和res下面的一直【细想一下,它是用来替换res下边的资源文件的,当然得一致】。 然后把需要替换的资源文件放到对应的目录就行。
–注意: 文件名和要替换的资源文件名要一样!!!–
- 切换到Project结构, 正常是 Android结构的目录
正常的目录为:
—app
——build
——gradle
——src
———main
————assets
————java
————res
—————drawable
—————drawable-xhdpi
————AndroidMainfest.xml
在main下面创建和productFlavors渠道对应的文件夹,如xiaomi, huawei, yingyongbao 等
—app
——build
——gradle
——src
———main
————assets
————java
————res
————xiaomi // 下面的资源文件夹和res下边的一样
————huawei // 下面的资源文件夹和res下边的一样
————yingyongbao // 下面的资源文件夹和res下边的一样
—————drawable
—————drawable-xhdpi
————AndroidMainfest.xml
用java代码判断渠道
try {
ApplicationInfo info = this.getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String value = info.metaData.getString("channel_key");
// 在下面的代码里写各个渠道不同的逻辑
switch (value) {
case "xiaomi":
// todo 小米
break;
case "huawei":
// todo 华为
break;
case "yingyongbao":
// todo 应用包
break;
default:
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
>> 错误的或不严谨的地方多多指教!