Gradle 系列第3讲-多渠道打包
Gradle的多渠道打包教程,网上已经一大堆了。为什么还要重新写一个呢?
原因有两个:1.那些教程不适合我的需求 2. 我要练习查阅google官方文档,去实现这个需求。
如果学会从官方文档上找到自己需要的知识, 这对于编程人员来说是一个很重要的技能。 能够摆托国内的那些低级论坛,自己主动的去解决问题!
我自己的多渠道打包的需求如下:
1.打出来不同渠道的包,apk包名不同。
2.打出来的渠道包,有自己不同的应用icon
通过查阅google的官网的gradle指导文档,理解发现,可以通过配置 ProductFlavor ,构建不同的版本。 然后通过配置源集,可以给不同版本的产品指定它对应的资源。
文档链接如下:
https://developer.android.com/studio/build/build-variants.html#sourceset-build
第一步:配置 不同版本ProductFlavor,这里我们配置了四个渠道版本分别是xiaomi ,tencent ,wandouja ,baidu 。
productFlavors {
xiaomi {
applicationIdSuffix ".xiaomi"
versionNameSuffix "-xiaomi"
}
tencent {
applicationIdSuffix ".tencent"
versionNameSuffix "-tencent"
}
wandouja {
applicationIdSuffix ".wandouja"
versionNameSuffix "-wandouja"
}
baidu {
applicationIdSuffix ".baidu"
versionNameSuffix "-baidu"
}
}
第二步:给每个版本配置不同的源集。
所谓的源集就是给不同的版本指定其所对应的资源文件(java代码,图片资源,清单文件等)。这样就可以达到不同的版本,对应不同的资源文件的目的。
那我们要做的是替换每个版本的icon。所以需要给每个版本指定其对应的icon图片。
这里 我找了4张图片,作为简单示例。
首先在src同级目录下,新建要替换4个不同的变体文件。文件夹的名称和productFlavors 中的产品名称相同即可。
微信截图_20170517143330.png然后给每个产品指定其特定的资源,这里资源的目录结构一定要和main目录下的相同。例:添加对应的icon图片。
微信截图_20170517143352.png然后执行 ./gradlew assembleRelease命令。 就可以看到我们打出来的符合需求的不同渠道包了。
![ ![微信截图_20170517144819.png](https://img.haomeiwen.com/i4129120/c72888836ee687d8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ](https://img.haomeiwen.com/i4129120/dfbbc787fb8afef6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)最后附上整个app模块的build.gradle文件。
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.simon.framework.memodule"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
//应用的签名,替换成你自己应用的就好
release {
storeFile file('E:/apks/uclasskey.keystore')
storePassword "*****"
keyAlias "*****"
keyPassword "*****"
}
}
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//配置输出apk的名称
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为boohee_v1.0_2015-01-15_wandoujia.apk
def fileName = "${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
productFlavors {
xiaomi {
applicationIdSuffix ".xiaomi"
versionNameSuffix "-xiaomi"
}
tencent {
applicationIdSuffix ".tencent"
versionNameSuffix "-tencent"
}
wandouja {
applicationIdSuffix ".wandouja"
versionNameSuffix "-wandouja"
}
baidu {
applicationIdSuffix ".baidu"
versionNameSuffix "-baidu"
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
}