Zane'Blog

Android多渠道打包

见识负责发现机遇,判断负责抓住机遇

一、在AndroidManifest.xml里配置PlaceHolder

1
2
3
4
<!--友盟多渠道打包-->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />

二、在build.gradle设置productFlavors

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
android {
...
defaultConfig {
....
// 默认是umeng的渠道
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
}
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}

三、在AS中的Terminal中执行如下命令:gradlew assembleRelease

这里写图片描述

四、assemble结合Build Variants来创建task

目前assemble这个命令,熟悉的有gradlew assembleDebug和gradlew assembleRelease,除此之外assemble还能和Product Flavor结合创建新的任务,其实assemble是和Build Variants一起结合使用的,而Build Variants = Build Type + Product Flavor,例如:

  • 如果只想打包wandoujia渠道的release版本,执行如下命令就好了:
    gradlew assembleWandoujiaRelease

  • 如果想打包wandoujia渠道的release和debug版本,则:
    gradlew assembleWandoujia

  • 如果想打包在build.gradle配置好的全部渠道的包,则可以:(这条命令会把Product Flavor下的所有渠道的Release版本都打出来)
    gradlew assembleRelease

总之:

  • assemble:允许直接构建一个Variant版本,例如assembleFlavor1Debug

  • assemble:允许构建指定Build Type的所有APK,例如assembleDebug将会构建Flavor1Debug和Flavor2Debug两个Variant版本

  • assemble:允许构建指定flavor的所有APK,例如assembleFlavor1将会构建Flavor1Debug和Flavor1Release两个Variant版本

五、完整的gradle脚本

build.gradle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
apply plugin: 'com.android.application'
apply plugin: 'android-apt'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
applicationId "io.github.zane.baidumapdev"
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode rootProject.ext.android.versionCode
versionName rootProject.ext.android.versionName
// dex突破65535的限制
multiDexEnabled true
// 默认是umeng的渠道
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
}
signingConfigs {
release {
storeFile file("../sign/baidumapdev.jks")
storePassword rootProject.ext.signingConfig.storePassword
keyAlias rootProject.ext.signingConfig.keyAlias
keyPassword rootProject.ext.signingConfig.keyPassword
}
}
buildTypes {
release {
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
//混淆编译
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为baidumapdev_v1.0_2017-04-01_xiaomi.apk
def fileName = "baidumapdev_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
sourceSets {
main {
/*百度JNI*/
jniLibs.srcDirs = ['libs']
}
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile rootProject.ext.deps.supportV7
testCompile rootProject.ext.deps.junit
compile files('libs/BaiduLBS_Android.jar')
compile rootProject.ext.deps.butterknife
apt rootProject.ext.deps.apt
}

config.gradle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
ext {
signingConfig = [
storePassword: "yongbutingzhi",
keyAlias: "baidumapdev",
keyPassword: "yongbutingzhi"
]
android = [
compileSdkVersion: 25,
buildToolsVersion: "25.0.2",
minSdkVersion: 15,
targetSdkVersion: 25,
versionCode: 1,
versionName: "1.0"
]
depsVersion = [
support: "25.1.1",
junit: "4.12",
okhttp3: "3.4.1",
gson: "2.7",
butterKnife: "8.4.0",
eventBus: "1.0.5.1",
refresh: "1.2.0",
loading : "2.1.3"
]
deps = [
supportV7: "com.android.support:appcompat-v7:${depsVersion.support}",
junit: "junit:junit:${depsVersion.junit}",
//----------第三方----------
gson: "com.google.code.gson:gson:${depsVersion.gson}",
okhttp3: "com.squareup.okhttp3:okhttp:${depsVersion.okhttp3}",
butterknife: "com.jakewharton:butterknife:${depsVersion.butterKnife}",
apt: "com.jakewharton:butterknife-compiler:${depsVersion.butterKnife}",
androideventbus: "org.simple:androideventbus:${depsVersion.eventBus}",
refresh: "com.miomin:shswiperefreshlayout:${depsVersion.refresh}",
recyclerview: "com.android.support:recyclerview-v7:${depsVersion.support}",
loading: "com.wang.avi:library:${depsVersion.loading}"
]
}

参考:http://stormzhang.com/devtools/2015/01/15/android-studio-tutorial6/

坚持原创技术分享,您的支持将鼓励我继续创作!