真的是慢一步,步步慢哇,15年的时候,公司有个同事就开始给我们普及多渠道打包,因为当时我就是看他不顺眼,所以也木有学。。想想有点后悔噻。。后来因为app上传的市场比较固定,都是一个一个打包的,多渠道打包出来那么久了,我竟然木有用过,昨天下午抽空了解下,感觉还处在皮毛,好多东西都是知其然,不知其所以然,昨天有童鞋推荐了美团的walle,网上搜集下资料,感觉还不错,好可惜,我们项目里面不让用。。。。
网上看的都不全,走了不少坑,虽然大家都说授人以鱼不如授人以渔,但是我想说,在着急实现功能的情况下,还是先给鱼比较好。。。
1.AndroidManifest.xml里面设置动态渠道变量:
<meta-data android:name="CLM_CHANNEL_ID" android:value="${CLM_CHANNEL}" />
2.app下完整的build.gradle
网上看的都不全,走了不少坑,虽然大家都说授人以鱼不如授人以渔,但是我想说,在着急实现功能的情况下,还是先给鱼比较好。。。
1.AndroidManifest.xml里面设置动态渠道变量:
<meta-data android:name="CLM_CHANNEL_ID" android:value="${CLM_CHANNEL}" />
2.app下完整的build.gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 27
defaultConfig {
applicationId "app.clm.com.demoapp"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
flavorDimensions "1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
//启用混淆代码的功能
minifyEnabled true
//压缩对齐生成的apk包
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//移除无用的资源文件
shrinkResources true
//启用multidex的支持
multiDexEnabled true
}
}
productFlavors{
xiaomi{ }
google{}
wandoujia{}
baidu{}
anzhi{}
QQ{}
}
//输出渠道包的名字,例如 xx.apk(个人还木有完全理解这块为什么这么写??)
android.applicationVariants.all{ variant ->
variant.outputs.all{ output ->
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith(".apk")){
//自定义想要生成的apk格式
def fileName = "${variant.productFlavors[0].name}_${publishTime()}" + ".apk"
outputFileName = fileName
} } }
//批量处理
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CLM_CHANNEL: name]
}
}
//渠道
compileSdkVersion 27
defaultConfig {
applicationId "app.clm.com.demoapp"
minSdkVersion 15
targetSdkVersion 27
versionCode 1
versionName "1.0"
flavorDimensions "1"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
//启用混淆代码的功能
minifyEnabled true
//压缩对齐生成的apk包
zipAlignEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//移除无用的资源文件
shrinkResources true
//启用multidex的支持
multiDexEnabled true
}
}
productFlavors{
xiaomi{ }
google{}
wandoujia{}
baidu{}
anzhi{}
QQ{}
}
//输出渠道包的名字,例如 xx.apk(个人还木有完全理解这块为什么这么写??)
android.applicationVariants.all{ variant ->
variant.outputs.all{ output ->
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith(".apk")){
//自定义想要生成的apk格式
def fileName = "${variant.productFlavors[0].name}_${publishTime()}" + ".apk"
outputFileName = fileName
} } }
//批量处理
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [CLM_CHANNEL: name]
}
}
//渠道
def publishTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
3.如果同一个apk不同渠道要添加不同的包名可以在productFlavors里面实现,ForExample:
xiaomi{
applicationId "com.clm.cn"
}
4.如果同一个apk不同渠道要添加不同的icon,资源可以这么实现:
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.0'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
3.如果同一个apk不同渠道要添加不同的包名可以在productFlavors里面实现,ForExample:
xiaomi{
applicationId "com.clm.cn"
}
4.如果同一个apk不同渠道要添加不同的icon,资源可以这么实现:
在main的同级目录创建相同项目结构的不同渠道,然后把不同渠道的资源或icon替换掉(别人是这么说的,我还木有来得及测试)
可能这里面还存在很多我不知道的问题,如果您觉得有问题,欢迎吐槽~