Eclipse + Gradle实现APK分包

Eclipse + Gradle 实现APK分包

一、环境搭建

1、解压Gradle(gradle-2.2.1-all.zip)并配置环境变量:

 

091436_wFhC_1779342.png

091436_SKrY_1779342.png

 

 

配置好环境变量后,打开命令行,输入gradle -version查看如下:

091554_ARNa_1779342.png 

2、Eclipse安装Gradle离线插件:

 

解压后,把featuresplugins目录下的文件分别复制到Eclipse安装路径下对应的featuresplugins两个目录下,然后重启Eclipse即可

 

二、生成工程配置文件

右键需要打包的工程-->Export-->Android-->Generate Gradle build files

091653_uONZ_1779342.png 

勾选需要生成配置文件的工程:

091712_e1sW_1779342.png 

说明:在工程的父目录下会生成两个文件,build.gradlesettings.gradle

build.gradle中,需要更换gradle版本号,如下图所示:

091749_noBX_1779342.png 

settings.gradle的内容是将要打包的主工程和依赖工程

091758_iJvu_1779342.png 

三、修改主工程的编译配置文件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以上;升级后,就可以得到:

091938_bTFr_1779342.png 

3.2 为主工程引入android-support-multidex.jar包:

 

注意:不能直接把这个jar放到项目的libs目录下,而是需要通过以下操作步骤引用:

091956_RjVA_1779342.png092017_2Ii0_1779342.png 

 

3.3 如果工程有自定义的Application,则在自定义的Application中覆写attachBaseContext方法,然后实现如下:

092028_5jQC_1779342.png 

 

如果项目中没有自定义的Application,则需要在AndroidManifest.xml中声明MultiDexApplication。

 

四、开始编译工程

打开命令行窗口:

cd到主工程所在目录,并输入gradle build --info 

说明: --info是让输出编译过程的详细信息,方便查看编译进度和出错信息。第一次编译需下载编译环境所依赖的各种pom文件和jar包,时间会稍长。

092039_4yDw_1779342.png 

顺利的话,最终会看到BUILD SUCCESS,恭喜你,编译成功。

回到Eclipse,刷新主工程,可以看到生成了一个目录build,其中ouptup/apk目录下是最终编译生成的各个版本的APK:

 

 

 

五、可能遇到的问题:

1、提示非法字符,这是由于编码UTF-8 BOM ( Byte Order Mark ) 引起的,需要把UTF-BOM转成UTF-8

 092126_1qFF_1779342.png

使用以下这个工具可以批量去除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(注:aRassembleRelease的简称)

Debug版本的命令是:gradlew assembleDebug

 

4、为避免OOM,可在主工程的build.gradle配置文件下增加:

 dexOptions {      

        incremental true

        javaMaxHeapSize "4g"

       } 

 

 

 

 

 

转载于:https://my.oschina.net/kbgcs/blog/593846

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值