Gradle入门

  • 作者:Moilk
  • 最后编辑:2016年01月29日
  • 标签: android gradle

Gradle是一个基于Ant和Maven概念的项目自动化建构工具。它使用一种基于Groovy的语言DSL来声明项目设置,抛弃了基于XML的各种繁琐配置。使用gradle使得资源和代码的重用变得更加简单。

安卓构建系统

安卓构建系统是用来构建、测试、运行以及打包app的工具箱,它可以在as菜单里边作为一个集成的工具使用,也可以在命令行中单独运行。其主要功能如下所示:

  • 定制、配置以及拓展构建过程
  • 在相同的项目和模块下,为app生成不同的apk
  • 代码和资源的跨源集复用

源集: 一组被一起编译一起执行的源文件,as中有两个标准源集:main和test。main源集包含产品源代码,也就是要编译打包成jar的部分。test源集包含单元测试源代码,编译后用JUnit 或TestNG执行。

构建过程涉及很多工具以及生成中间文件的操作,而且具有可配置和可拓展性,因此它的内部操作很难以理解。下图描绘了构建涉及的工具和操作:
build.png
构建系统将已配置好的产品特性、生成类型和依赖等资源合并,如果不同的文件夹包含同名或者同设置的资源,其重写优先级顺序为:依赖重写生成类型,生成类型重写产品特性,产品特性重写main源目录。

  • 安卓资源打包工具(AAPT)可以将资源文件(如AndroidMainfest.xml以及安卓活动的XML文件等)进行打包、编译,同时生成R.java文件,通过这个文件就可以在java代码中访问那些资源
  • AIDL(安卓接口定义语言)工具将所有.aidl接口转换成安卓接口
  • java编译器将所有的java代码,包括R.java和.aidl文件编译成.class文件
  • dex工具将.class文件以及module里边包含的第三方库文件和. class文件转换成Dalvik二进制码,即.dex文件,以便封装成最终的.apk文件
  • 所有未编译的资源(如图片),已编译的资源和.dex文件全部送到apkbuilder工具打包成一个.apk文件
  • .apk文件一旦生成,就必须打上debug或者release密钥的签名,这样它才能安装到设备上
  • 最后,如果应用程序是按release的模式签名的,就必须用zipalign工具对.apk文件进行调整,减少程序在设备上运行时的内存占用
    构建过程为每一个构建变量生成一个APK,在app/build/outputs/apk/下的包以’app--.apk'命名。

注意:APP有64k个方法的访问限制,如果app达到这个限制构建过程就会报出如下错误:

Unable to execute dex: method ID not in [0,0xffff]: 65536. 避免错误请参阅Building Apps with Over 65K Methods.

build基础配置

Android Studio项目包含一个顶级的build文件,同时每个module包含一个build文件,名字均为build.gradle。在大多数情况下,我们只需要编辑模块的build.gradle。如下所示为一个app module的build文件:

// 添加gradle插件,声明是application
apply plugin: 'com.android.application'

// 在
android {
    // 编译SDK的版本
    compileSdkVersion 23
    // build tools的版本
    buildToolsVersion "23.0.0"

    defaultConfig {
        // 应用的包名
        applicationId "com.moilk.calculator"
        minSdkVersion 15
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            // 是否进行混淆
            minifyEnabled false
            // 混淆文件的位置 默认混淆文件+用户混淆文件
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    // 编译libs目录下的所有jar包
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.1'
}