当传统的手工打包方式遇上同一应用,多渠道/多包名及多种引导页/icon等等差异时,就变成了苦不堪言的纯体力活了。 但有了Gradle这一切不再是问题了,Gradle使得这一切变的so easy。
本遍主要介绍eclipse中使用Gradle打包解决多渠道问题,其它的问题基本差不多。在eclipse中使用Gradle只需要以下三板斧:
第一斧、生成Gradle相应文件
1.1 选中相应的项目,鼠标右键Export-GenerateGradle build files,然后一路next下去。
1.2 一路next下去后,finish后,即可生成以下目录及文件
在生成的文件中,有两个需要后续配置修改gradle-wrapper.properties及build.gradle文件,其它文件可以不动即可。
第二斧、下载gradle及配置相应的环境变量
2.1 双击打开gradle-wrapper.properties,复制出http://services.gradle.org/distributions的地址,访问此网站
2.2 下载相应的gradle版本,个人下载了2.1版本,找到且下载gradle-2.1-all.zip,修改上面的distributionUrl为
distributionUrl=http\://services.gradle.org/distributions/gradle-2.1-all.zip
2.3 配置gradle环境变化,将刚下载的zip包解压出gradle-2.1,分别配置GRADLE_HOME及在Path后追加路径
GRADLE_HOME配,指到gradle-2.1目录即可,这里为D:\Program Files\Android\gradle-2.1
Path指到bin目录中,这里为D:\Program Files\Android\gradle-2.1\bin
另外还需要配置ANDROID_HOME环境,在eclipse-preferences-Android中,找到SDK LOCATION
在环境配置中添加ANDROID_HOME的变量名,并指向与eclipse中的SDK LOCATION的路径一样即可.
配置好了,cmd检查下grade是否配置成了,输入gradle -w命令检查下。
第三斧、Gradle配置及打包命令生成
3.1 Gradle打包过程是比较慢,且比较耗内存特别是多版本多N渠道一起打包时也许可能出现OOM。可以通过在gradle-wrapper.properties文件中,添加org.gradle.jvmargs=-Xmx2048m-XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError
3.2 修改build.gradle------比较关键的配置文件,对多渠道/多包名及各种差异下的配置都在build.gradle文件下配置。
这里先上下个人demo项目中的配置,最后再对关键的地方进行解释。
----------------------------------------build.gradle文件开始-----------------------------------------
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath'com.android.tools.build:gradle:0.14.+'
}
tasks.withType(JavaCompile){ options.encoding = "UTF-8" }
}
apply plugin: 'android'
dependencies {
compile fileTree(dir:'libs', include: '*.jar')
}
android {
compileSdkVersion 21
buildToolsVersion"21.1.2"
defaultConfig {
applicationId"com.test.drawdemo"
minSdkVersion10
targetSdkVersion 12
versionCode200
versionName"v2.0.5"
testApplicationId "com.test.drawdemo"
testInstrumentationRunner "android.test.InstrumentationTestRunner"
// 默认是offical的渠道,即官方的版本
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "offical"]
}
//app 签名文件
signingConfigs {
release {
storeFile file("demo.keystore")
storePassword "123456"
keyAlias "demo.keystore"
keyPassword "123456"
}
}
buildTypes {
release {
signingConfigsigningConfigs.release
// 不显示Log
buildConfigField "boolean", "LOG_DEBUG","false"
minifyEnabled true
proguardFiles 'proguard-project.txt'
}
}
// 移除lint检查的error
lintOptions {
abortOnError false
ignoreWarnings true
}
// 友盟多渠道打包
productFlavors {
offical {}
appchina {}
anzhi {}
mumayi {}
lenovo {}
qq {}
huawei {}
xiaomi {}
baidu {}
meizu {}
taobao {}
huijia360 {}
hiapk {}
}
productFlavors.all { flavor->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
//------------加载 so库开始------------
task copyNativeLibs(type:Copy) {
from(new File('libs')){ include '**/*.so' }
into newFile(buildDir, 'native-libs')
}
tasks.withType(JavaCompile) {compileTask -> compileTask.dependsOn copyNativeLibs }
clean.dependsOn'cleanCopyNativeLibs'
tasks.withType(com.android.build.gradle.tasks.PackageApplication){
pkgTask -> pkgTask.jniFolders =new HashSet<File>()
pkgTask.jniFolders.add(newFile(buildDir,'native-libs'))
}
//---------------加载 so库结束---------
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
}
}
----------------------------------------build.gradle文件结束-----------------------------------------
3.3 执行gradlewclean。打开cmd,cd到项目目录中,先输入gradlew clean。 这里的gradlew 是对gradle命令的包装,gradlew clean后可以使gradle会自成同步下载Gradle相应的依赖,并可以把上次打包的清掉重新打,会删除掉build目录及build目录下所有文件。
3.4 执行gradlew build命令,即可完成整个打包过程了。
接下来可以看到项目下产生了build目录,在这里的build-->outputs-->apk里就生成了各渠道的包了.
可以看到生成了一堆的包,有release及debug版本,签名版的及未签名。若不想要debugt版本的apk,可以在打包时输入 gradlew aR命令即可。aR是assembleRelease的简写。当然也可以只生成debug版本的(gradlew assembleDebug)
大功造成,怎么样是不是很easy啊,呵呵了。。。下面对build.gradle简单的介绍下。
补充说明--关于build.gradle配置
1. buildscript元素
除了dependencies-classpath中的gradle版本需要改下,基本上不需要修改。
1.1 dependencies {
classpath'com.android.tools.build:gradle:0.12.+'
}
gradle:0.12.+修改成gradle:0.14.+,对应的gradle 2.1 采用新的gradle版本,比较关键。
1.2 tasks.withType(JavaCompile) { options.encoding = "UTF-8" } ,这里老版本gradle是Compile,需要修改成JavaCompile
2、applyplugin: 'android'
-----不做修改
3、dependencies元素
dependencies{
compilefileTree(dir: 'libs', include: '*.jar')
} 指定项目中相应的jar包依赖,注意 :
3.1 这里配置指令了,会和proguard混淆配置中-libraryjars libs/xxxx.jar冲突重新配置了依赖jar包。可以将proguard混淆文件中的-libraryjars 配置注释掉 加#-libraryjars ...
3.2 dependencies只指令了jar包依赖了,并没有指令so库依赖,so库的依赖得单独配置...,后面有介绍。。但有个变态的方法就是可以把所的so库文件,全部用zip压缩到一个文件中比如so.zip,再把so.zip改名成so.jar这样就不需要指令so库了,比较变态吧。呵呵....
4. android元素
这里是重重之重,配置比较繁琐,
4.1 defaultConfig元素
applicationId 指令包名,老版本是packageName指令
其它可配置版本信息
4.2 signingConfigs 元素
可以配置签名文件信息,文件位置别名命令等
4.3 buildTypes 元素
生成的apk有两种type类型,debug与release版本,可以分别对其配置,配置使用哪个签名配置(signingConfigs)、是否混淆等等
minifyEnabled 是新版本的元素,老版本runProguard已经废弃了。
proguardFiles 'proguard-project.txt' 指令使用与build.gradle同一目录中的proguard-project.txt混淆文件.
4.4 lintOptions元素
配置下,忽略lint相应的警告...
4.5 Flavors机制,,
主要是靠,这个机制进行 多渠道,多包名的打包....,
剩下的加载 so库,直接复制下,不用改,拿好,不谢。
版权声明:本文为博主原创文章,未经博主允许不得转载。