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();
}
>> 错误的或不严谨的地方多多指教!