众所周知安卓上架商店是很多的,有时候我们需要统计各个渠道的信息(不同渠道的下载量、用户活跃度等),如果每次打包都要修改一下不同的渠道标记然后分别打包的话是很浪费时间的,而且这样容易出问题,因此可以在gradle里稍加配置,做到一个打包可以输出携带不同渠道号的apk
一、配置清单文件AndroidManifest.xml
//在application节点里 跟activity同级
//name和value可以自己定义后面会用到
<meta-data
android:name="CHANNEL_N"
android:value="${CHANNEL_VALUE}" />
二、配置gradle
//注意是在application类型的gradle里配置
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion "30.0.2"
defaultConfig {
applicationId "****"
minSdkVersion 18
targetSdkVersion 28
versionCode 1
versionName "1.0"
//这一个要加上 不然添加了productFlavors后可能会报错
flavorDimensions "default"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
//写法一:CHANNEL_VALUE跟productFlavors里的名字不一致情况下
//这就是对应的渠道配置 CHANNEL_VALUE对应着meta-data里的value
productFlavors {
xiaomi {
manifestPlaceholders = [CHANNEL_VALUE: "xiaomi"]
}
baidu {
manifestPlaceholders = [CHANNEL_VALUE: "baidu"]
}
huawei {
manifestPlaceholders = [CHANNEL_VALUE: "huawei"]
}
}
//写法二:productFlavors里的渠道名字和CHANNEL_VALUE一致
productFlavors {
xiaomi {
}
baidu {
}
huawei{
}
productFlavors.all {
flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
}
android.applicationVariants.all {
variant ->
// 修改APK名称 按自己需要决定要不要加
variant.outputs.all {
def name = variant.buildType.name
if (name.contains("release")) {
outputFileName = "${variant.productFlavors[0].name}-v${variant.versionName}-Release.apk"
} else {
outputFileName = "${variant.productFlavors[0].name}-v${variant.versionName}-Debug.apk"
}
}
}
}
dependencies {
//忽略
}
三、渠道号的获取
public String getChannelId() {
try {
ApplicationInfo info = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
//CHANNEL_N对应着meta-data里的name 如果对应不上会抛空指针异常
return info.metaData.getString("CHANNEL_N");
} catch (Exception e) {
e.printStackTrace();
}
return "";
}
四、打包
在打包的时候选择多个渠道包就可以同时生成对应渠道的多个apk