Android打包方式也是很多的,使用工具或者脚本等,咱今主要看一看自带的Gradle多渠道打包,原理无非就是利用gradle通过manifestPlaceholder换渠道进行处理:
准备工作
前提:把你的各种debug、release环境密钥等等都配置好。
在AndroidManifest.xml修改,这里我们以友盟为例:
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
在build.gradle中这样处理:
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
/* 更简洁方式如下
xiaomi {}
_360 {}
baidu {}
wandoujia {}
*/
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
生成各种渠道包
1.Android studio下部的终端,terminal,如图所示:
2.输入assembleRelease,有时候没有反应,此时我们应该配置下gradle 的环境变量,找到gradle的bin目录,复制当前路径,添加到环境变量中,此时继续执行assembleRelease,就可以生成所有渠道的包
tips:gradles 环境变量目录:
C:\Users\hackangel\.gradle\wrapper\dists\gradle-2.14.1-all\8bnwg5hd3w55iofp58khbp6yv\gradle-2.14.1\bin
3.当然有时候遇到以下几个小问题:
*Exceptionis:org.gradle.api.tasks.TaskExecutionException:Executionfailedfortask’:app:compileXXXReleaseJavaWithJavac’.`这主要是javac 环境出问题了,javac环境配置如下:
系统变量->新建->变量名:JAVA_HOME 变量值:(C:\Program Files\Java\jdk1.7.0_03)(这只是我的JDK安装路径)
系统变量->编辑->变量名:Path 在变量值的最前面加上:(%JAVA_HOME%\bin;)
系统变量->新建->变量名:CLASSPATH 变量值:(.;%JAVA_HOME%\lib;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;)//tools.jar很关键,有时候会报这个错误
有时候我们输入assembleRelease后,可能会下载一些gradle包,稍微等一会就好了,没关系
更改输入名称
比如说我们要打包后,输出的名称为输出apk名称为testname_v1.0_2017-01-15_wandoujia.apk
我们就可以在build.gradle中配置一些设置如下:
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为testname_v1.0_2017-01-15_wandoujia.apk
def fileName = "testname_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
releaseTime()函数我们定义为:
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
在build.gradle中的完整配置如下:
apply plugin: 'com.android.application'
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android {
signingConfigs {
debug {
keyAlias 'key'
keyPassword '123456'
storeFile file('C:/AndroidStudioWorkSpace/appkey/keystore.jks')
storePassword '123456'
}
release {
keyAlias 'key'
keyPassword '123456'
storeFile file('C:/AndroidStudioWorkSpace/appkey/keystore.jks')
storePassword '123456'
}
}
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
applicationId "com.redluo.view_1"
minSdkVersion 15
targetSdkVersion 23
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "umeng"]
}
lintOptions {
abortOnError false
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
debuggable false
signingConfig signingConfigs.release
zipAlignEnabled true
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
// 输出apk名称为testname_v1.0_2015-01-15_wandoujia.apk
def fileName = "testname_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
debug {
debuggable true
signingConfig signingConfigs.debug
minifyEnabled false
zipAlignEnabled false
}
}
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
/* 更简洁
xiaomi {}
_360 {}
baidu {}
wandoujia {}
*/
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
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:23.4.0'
testCompile 'junit:junit:4.12'
}