Eclipse + Gradle 实现APK分包
一、环境搭建
1、解压Gradle(gradle-2.2.1-all.zip)并配置环境变量:
配置好环境变量后,打开命令行,输入gradle -version查看如下:
2、Eclipse安装Gradle离线插件:
解压后,把features和plugins目录下的文件分别复制到Eclipse安装路径下对应的features和plugins两个目录下,然后重启Eclipse即可
二、生成工程配置文件
右键需要打包的工程-->Export-->Android-->Generate Gradle build files
勾选需要生成配置文件的工程:
说明:在工程的父目录下会生成两个文件,build.gradle和settings.gradle
在build.gradle中,需要更换gradle版本号,如下图所示:
settings.gradle的内容是将要打包的主工程和依赖工程
三、修改主工程的编译配置文件build.gradle
主工程的完整配置文件如下:
buildscript {
// buildscript中的声明是gradle脚本自身需要使用的资源。
//可以声明的资源包括依赖项、第三方插件、maven仓库地址等
repositories {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:0.14.+'
}
}
apply plugin: 'android'
dependencies {
// 编译所依赖的第三方jar包
compile fileTree(dir: 'libs', include: '*.jar')
// 编译依赖工程
compile project(':txtw_green_one_lib')
}
android {
compileSdkVersion 21
buildToolsVersion "23.0.2"
dexOptions {
// 对于dex 的--multi-dex 选项设置与预编译的library工程有冲突,如果你的应 // // 用中包含引用的lirary工程,需要将预编译设置为false:
preDexLibraries = false
}
defaultConfig {
// Enabling multidex support.
multiDexEnabled true
}
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
// 打包依赖的so库文件
jniLibs.srcDirs = ['libs']
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java,
//build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/...
//which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied by a // similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
lintOptions {
abortOnError false
}
signingConfigs {
myConfig {
//签名所在路径,可以是相对路径,也可以是绝对路径
storeFile file("E:\\sign\\lwtx_zxk_keystore.keystore")
storePassword "xxx"
keyAlias “xxx”
keyPassword "xxx"
}
}
buildTypes{
release {
//minifyEnabled false表示工程打包时,不进行混淆
minifyEnabled false
//混淆配置文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
// 签名配置
signingConfig signingConfigs.myConfig
}
}
// 分包参数配置
afterEvaluate {
tasks.matching {
it.name.startsWith('dex')
}.each {
dx -> if (dx.additionalParameters == null)
{
dx.additionalParameters = ['--multi-dex']
}else {
dx.additionalParameters += '--multi-dex'
}
}
}
}
依赖工程的完整配置文件如下:
apply plugin: 'android-library'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
}
android {
compileSdkVersion 19
buildToolsVersion "18.0.1"
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
// 打包依赖的so库文件
jniLibs.srcDirs = ['libs']
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
}
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/<type>
// For instance, build-types/debug/java, //build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/<type>/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}
}
三、配置multidex
3.1 首先需要打开Android SDK Manager查看Android Support Repository 和 Android Support Library的版本为23以上;升级后,就可以得到:
3.2 为主工程引入android-support-multidex.jar包:
注意:不能直接把这个jar放到项目的libs目录下,而是需要通过以下操作步骤引用:
3.3 如果工程有自定义的Application,则在自定义的Application中覆写attachBaseContext方法,然后实现如下:
如果项目中没有自定义的Application,则需要在AndroidManifest.xml中声明MultiDexApplication。
四、开始编译工程
打开命令行窗口:
cd到主工程所在目录,并输入gradle build --info
说明: --info是让输出编译过程的详细信息,方便查看编译进度和出错信息。第一次编译需下载编译环境所依赖的各种pom文件和jar包,时间会稍长。
顺利的话,最终会看到BUILD SUCCESS,恭喜你,编译成功。
回到Eclipse,刷新主工程,可以看到生成了一个目录build,其中ouptup/apk目录下是最终编译生成的各个版本的APK:
五、可能遇到的问题:
1、提示非法字符,这是由于编码UTF-8 BOM ( Byte Order Mark ) 引起的,需要把UTF-BOM转成UTF-8:
使用以下这个工具可以批量去除BOM编码:BomChecker.zip
2、gradle编译过程中,由于多包多渠道打包,很可能发生OOM异常,这时候,可以修改参数,加大Gradle使用的JVM内存:在项目根目录下的gradle/wrapper/gradle-wrapper.properties中增加如下参数:
org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError
3、为避免OOM,也可以选择性打包,可以单独打包Debug版本或者Release版本:
Release版本的命令是:gradlew aR(注:aR是assembleRelease的简称)
Debug版本的命令是:gradlew assembleDebug
4、为避免OOM,可在主工程的build.gradle配置文件下增加:
dexOptions {
incremental true
javaMaxHeapSize "4g"
}