前言
国内Android应用市场
品种太多,血统不纯,每次上线App都打包打到手软,上传上到吐血
!好在我们有了Android studio和gradle,一条命令打包各种渠道版本App!
正文
Umeng多渠道
我们在项目中会使用统计SDK,用的最流行的当属umeng
了吧。这里我们就用友盟来说明。
用了友盟的App的清单文件AndroidManifest.xml
中都会写上meta-data
,来区分不同的渠道:
<meta-data
android:name="UMENG_CHANNEL"
android:value="Channel_ID" />
1.将Channel_ID
更改为${UMENG_CHANNEL_VALUE}
,如下:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
2.在app
的build.gradle
设置produceFlavors
:
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qihoo {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qihoo"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
qq {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq"]
}
}
3.来看看我在项目中使用的build.gradle
文件内容:
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
compileSdkVersion 23
buildToolsVersion "23.0.0"
defaultConfig {
// 这里的applicationId根据自己的替换
applicationId "com.sunjiajia.xxxxx"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "0.0.1"
multiDexEnabled true //dex突破65535限制
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
}
lintOptions {
disable 'MissingTranslation', 'ExtraTranslation'
abortOnError false
}
signingConfigs {
// /home/monkey/Projects/AndroidStudioProjects/debug.jks是签名文件所在全路径
// debug时打包用的签名
debug {
keyAlias 'debug'
keyPassword '123456'
storeFile file('/home/monkey/Projects/AndroidStudioProjects/debug.jks')
storePassword '123456'
}
// release时打包用的签名
release {
keyAlias 'monkey'
keyPassword '123123'
storeFile file('/home/monkey/Projects/AndroidStudioProjects/monkey.jks')
storePassword '123123'
}
}
buildTypes {
debug {
// 显示Log
buildConfigField "boolean", "LOG_DEBUG", "true"
versionNameSuffix "-debug"
minifyEnabled false
zipAlignEnabled false
shrinkResources false
signingConfig signingConfigs.debug
}
release {
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG", "false"
minifyEnabled true
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources 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名称为appname_v1.0_2015-09-15_09-57-58_wandoujia.apk
// 下面的appname改为你自己的app name
def fileName = "appname_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
}
packagingOptions {
exclude 'META-INF/DEPENDENCIES.txt'
exclude 'META-INF/LICENSE.txt'
exclude 'META-INF/NOTICE.txt'
exclude 'META-INF/NOTICE'
exclude 'META-INF/LICENSE'
exclude 'META-INF/DEPENDENCIES'
exclude 'META-INF/notice.txt'
exclude 'META-INF/license.txt'
exclude 'META-INF/dependencies.txt'
exclude 'META-INF/LGPL2.1'
}
// 友盟多渠道打包
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qihoo {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qihoo"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
qq {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qq"]
}
}
}
dependencies {
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.0.1'
compile 'com.android.support:design:23.0.1'
}
命令创建task
1.进入项目的根目录:
// 打包全部Debug版本
./gradlew assembleDebug
// 打包全部Release版本
./gradlew assembleRelease
2.assemble
和Product Flavor
结合创建指定渠道的任务版本。例如:
// 打包wandoujia渠道的Release版本和Debug版本
./gradlew assembleWandoujia
// 打包wandoujia渠道的Release版本
./gradlew assembleWandoujiaRelease