Android Studio的Android build system详解

Android build system in AS

Android Studio使用Gradle来管理和编译Android工程,而为了生成Android应用衍生出了Android build system。Android build system就是用来构建、测试、运行还有打包app的一套工具,这里我们将具体了解Android build system。

Build Process--构建的流程

首先我们要对Android build system的总体行为有所了解。在Android Studio中生成apk文件需要运行Gradle build任务,这时会完整走一遍Build(构建)流程,这个流程包含了很多工具和步骤,期间还会生成过渡文件。
下图可以说明一个完整的构建流程: 
Android Studio的Android build system详解
  可以归结为以下几步

  • Android Asset Packaging Tool,也就是常说的aapt把资源文件进行编译(例如AndroidManifest.xml和Activity用的xml文件),同时生成的还有R.java。R.java相当于资源文件的索引,在java代码中就是通过R.java引用资源文件的。
  • aidl tool将.aidl接口转化为java接口
  • 所有的Java代码,包括R.java和.aidl生成的java接口代码,都被编译成.class文件
  • dex tool将.class文件转化为Dalvik二进制代码.dex。所有的第三方库和.class文件也会被转化为.dex文件
  • 所有文件,包括未编译资源、编译资源、dex文件,都由apkbuilder tool包装到apk文件中。
  • apk生成后需要用debug key或 release key签名才能安装到设备中。
  • 如果要发布apk,还需要使用zipalign工具使apk文件对齐
*注意:build system会合并所有资源,资源的可能来自默认资源目录app/src/main/res和dependencies指向的库,也可能受product flavors和build types的影响。如果不同来源的资源重名,则根据以下优先级,使用优先级最高的资源:dependencies > product flavors > build types > 默认资源目录

 

Build Configuration--Build配置

我们已经对Build有了一个整体的了解,但如果想要对Build任务做些修改,例如添加一个库,该怎么做呢?这就需要学习Build的配置了。
Android Studio工程有一个主配置文件,而工程下属的module也都各自有配置文件,他们的名称都是build.gradle,大多数情况下我们只需要编辑module下的build.gradle。
假如我们有一个名为app的module,app的build.gradle文件如下:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.0"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile project(":lib")
    compile 'com.android.support:appcompat-v7:19.0.1'
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

我们一起来看看这份配置是怎么一回事:

  • apply plugin: 'com.android.application' 将名为com.android.application的插件应用到这个module。
    实际上,这相当于做了一个声明,com.android.application表明这是一个Android 应用的build,也可以使用com.android.library表示一个library,或者java表示一个java工程。有了这个声明,build system才能接受这个build,同时此build任务会被加入到主build任务,而接下来的 android {...} 元素中的Android相关build选项也才变得可用。
  • android {...} 元素能配置所有build选项
    • compileSdkVersion 指定编译应用的sdk版本
    • buildToolsVersion 指定build tools的版本(build tools的主版本号应该不低于compileSdkVersion以及targetSdk);
    • defaultConfig 会影响一些关键配置,以及manifest文件中的条目,出现在defaultConfig中的条目会覆盖manifest文件的;
    • buildTypes build类型元素控制应用的build和打包,默认情况下有debug和release两种build类型:debug类型的应用包带有debug标签,而且被签名为debug key;release build 类型没有默认签名,要想生成必须要有指定的key
  • dependencies 声明了此module的依赖关系,后面将单独用一个小结来说明dependencies

 

Dependencies

下面这段代码用到了所有三种依赖:

dependencies {
    // Module dependency
    compile project(":lib")

    // Remote binary dependency
    compile 'com.android.support:appcompat-v7:19.0.1'

    // Local binary dependency
    compile fileTree(dir: 'libs', include: ['*.jar'])
}

Module dependencies

第一个compile project(":lib")是模块依赖,表示模块app依赖于模块lib。当app被build时,build system会把lib也包含进来。

Remote binary dependencies

接下来的是远程库依赖,compile 'com.android.support:appcompat-v7:19.0.1' 表示模块app依赖Maven库中版本为19.0.1的Android Support Library。默认情况下,远程库指向Maven中心库(Maven Central Repository)。

Local binary dependencies

最后的compile fileTree(dir: 'libs', include: ['.jar']) 表示本地库依赖。 一般而言,我们把本地库的jar文件放到模块的 libs 文件夹里,然后用compile fileTree(dir: 'libs', include: ['.jar'])告诉build system所有在libs下的jar文件都要被编译并且被包含进应用中。

相关推荐