【译】Android构建配置

原文地址:https://developer.android.com/studio/build/index.html
译文作者:Shane

Android构建系统编译app资源和源码文件,然后将它们打包进你可以测试,部署,签名和分发的APK。Android Studio使用Gradle(一个高级构建工具)来自动化管理构建过程,允许你定义灵活的构建配置。每个构建配置可以定义自己所属的代码和资源,当重用所有app版本公有的那部分的时候。Gradle的Android插件(Android Plugin for Gradle)和Gradle一起协同工作,提供处理和具体构建以及测试Android应用相关的配置设置。

Gradle及其Android插件独立于Android Studio运行。这意味着,你可以通过Android Studio,从自己机器上的命令行,或者是从别的没有安装Android Studio的机器上构建应用。如果你没有使用Android Studio,你可以学习 从命令行构建和运行你的app。构建的输出都是一样的,无论你是通过命令行构建,还是从远程机器,或者是使用Android Studio构建。

注意:因为Gradle及其Android插件独立于Android Studio运行,你需要单独更新构建工具。阅读发布摘要来学习如何 更新Gradle及其Android插件.

Android构建系统的灵活性是你能够实现自定义构建配置文件而无需修改你的app的核心源码。这一节帮助你理解Android构建系统如何工作,以及如何帮助你定制以及自动化多个构建配置。如果你仅仅想要学习更多关于部署你的app,参见Building and Running from Android Studio。立即开始使用Android Studio创建自定义构建配置,参见Configuring Build Variants.

构建过程 The Build Process


构建过程包括许多工具,以及将工程转换为APK的过程。构建过程很灵活,因此理解一些内部流程将会非常有用。

图1 一个典型的App模块构建过程

一个典型的App模块构建过程,如图1所示,跟随这些通用步骤:

  1. 编译器将你的源码转换到DEX文件中,其中包括Android设备上运行的字节码,和其他一切编译后的资源。
  2. APK打包器将DEX文件和编译后的资源一起打包到一个单独的APK。然而,在你的app能被安装和部署到Android设备上之前,APK还需要执行签名。
  3. APK打包器使用debug或者release版本的密钥库(keystore)对你的APK进行签名:
    a. 如果你准备构建一个debug版本的app,也就是仅用于测试和分析的版本,打包器会使用debug keystore对APK进行签名。Android Studio会自动为每个新的工程配置debug keystore。
    b. 如果你准备构建一个打算对外发布的release版本的app,打包器会使用release keystore对你的app进行签名。要创建一个release keystore,参见Signing your app in Android Studio
  4. 在生成最终的APK之前,打包器使用zipalign 工具对你的app进行优化,使得运行时使用更少内存。

在构建过程最后,你要么得到一个debug版本的APK要么得到一个release版本的APK,可用于部署,测试,或者对外发布。

定制构建配置 Custom Build Configurations


Gradle及其插件帮助你配置以下几个构建方面:

  • 构建类型 Build Type
    构建类型定义了构建和打包过程Gradle使用的几个属性,通常需要为开发生命周期的不同阶段定义配置属性。比如,debug构建类型开启debug选项,使用debug key签名APK,而release构建类型可能会压缩、混淆APK,并且用一个用于发布的release key签名APK。为了构建你的app,你必须定义至少一个构建类型——Android Studio默认创建debug和release构建类型。开始为你的app定制打包设置,学习如何Configure build types
  • 产品喜好 Product Flavors
    Product Flavors表示你可能发布给用户的不同版本的app,比如免费版和付费版。你可以定制Product Flavors来使用不同的代码和资源,而重用那些所有版本公有的部分。Product Flavors是可选的,你必须手动创建。开始创建不同版本的app,学习如何Configure product flavors
  • 构建变种 Build Variants
    构建类型(Build Type)和产品喜好(Product Flavors)结合起来就是一个构建变种(Build Variant)。构建变种代表了Gradle使用的构建你的app的配置文件。尽管你不能直接配置构建变种,你可以通过配置构建类型和产品喜好来打造一个变种。学习如何创建和管理构建变种,阅读 Configure build variants
  • 清单条目 Manifest Entries
    你可以在构建变种的配置中指明AndroidManifest.xml中定义的一些属性。这些配置项将会重写存在于AndroidManifest.xml中的存在项。如果你想针对你的app生成多个APK,每个APK有不同的应用程序名,最小SDK版本或者是目标SDK版本,这时候就会很有用。当多个清单文件存在时,Gradle将会 合并清单设置.
  • 依赖管理 Dependencies
    构建系统管理本地和远程仓库的工程依赖。可以让你免于手动搜索、下载,然后将二进制依赖包拷贝到工程目录这个过程。查看更多信息,学习如何声明依赖
  • 签名 Signing
    你可以在构建配置中指明签名相关设置,在构建过程中将会自动为你的APK签名。构建系统用默认密钥和已知凭据的默认证书签名debug版本,避免在构建时候提示输入密码。构建系统不会签名release版本,除非你显式定义一个签名配置。如果你还没有一个release密钥,你可以按照《Signing your applications》描述的方法生成一个。
  • ProGuard
    构建系统允许为每个构建变种指明一个不同的ProGuard 规则文件。在构建过程中,构建系统运行ProGuard来压缩和混淆类文件。

构建配置文件 Build Configuration Files


创建自定义的构建配置需要你更改一个或多个构建配置文件,或者build.gradle文件。这些纯文本文件使用领域特定语言(DSL)声明和操控构建逻辑。在这里的DSL指的是Groovy,一种基于JVM的动态语言。你不需要知道Groovy就可以开始配置构建,因为Gradle的Android插件引入了你需要的大部分DSL元素。学习更多关于Android Plugin DLS,阅读 DSL reference documentation

当开始一个新工程时,Android Studio自动为你创建了一些文件,如图2所示,并且基于合理的默认值做了一些修改。

图2 一个Android App模块的默认工程结构

对于一个Android应用来说,这里有一些Gradle构建配置文件是标准工程结构的一部分。在开始配置之前,理解这些文件的使用范围和目的,以及它们定义基本的DSL元素是非常重要的。

Gradle设置文件

位于工程根目录下的gradle.setting文件,告诉Gradle当构建app的时候需要包含哪些模块。对大多数工程来说,这个文件比较简单,仅仅包含下面的:

include ':app'

然而,对于包含多个模块的工程,需要指明放到最终build里面的每个模块。

顶层build文件

顶层build文件是位于工程根目录下的build.gradle文件,定义了对于工程所有Module都有效的构建配置文件。默认,顶层build文件使用buildScript {}块来定义Gradle仓库以及对于工程所有Module都通用的依赖。下面样例代码描述了默认设置,以及你可以在一个新创建的工程的顶层build文件中找到的DSL元素。

/**
  * buildscript { } 配置块是配置Gradle仓库以及Gradle本身依赖的地方。
  * 也就意味着,你不应该把自己的模块依赖放到这个位置。比如,这个配置 
  * 块包含了Gradle的Android插件作为一个依赖,因为它提供了Gradle需
  * 要的额外的指令来构建Android应用模块。
  */
buildscript {   
     /**
      * repositories { } 配置块配置了Gradle使用的用来搜索和下载依赖的仓
      * 库。Gradle预配置支持远程仓库,比如JCenter,Maven Central还有
      * Ivy。你也可以使用本地仓库或者定义自己的远程仓库。下面的代码
      * 定义JCenter作为Gradle用来查找依赖的仓库
      */
     repositories {        
          jcenter()    
     }    
     /**
      * dependencies { } 配置块 定义了Gradle用来构建工程所需的依赖条件。
      * 下面这一行,添加Gradle的Android插件v2.0.0作为一个classpath依赖。
      *
      */
    dependencies {        
          classpath 'com.android.tools.build:gradle:2.0.0' 
      }
}
/**
  * allprojects { } 配置块 是配置你的工程中所有模块都使用的仓库和依赖
  * 的地方,比如第三方插件或者库。不被所有模块都共用的依赖应该配置
  * 在模块级别的build.gradle文件中。对于新建的工程,Android Studio
  * 配置JCenter作为默认仓库,但不会配置任何依赖。
  */
allprojects {   
      repositories {       
          jcenter()   
      }
}

模块级别的Build文件

模块级别的build.gradle文件位于每个<工程>/<模块>目录下,可以让你为每个模块单独配置build设置项。配置项允许你提供自定义打包选项,比如额外的构建类型(build type)和产品喜好(product flavor),以及重写在main/目录下的应用manifest清单或者是顶层build.gradle文件。
下面这个app模块build.gradle文件样例总结了一些你应该知道的基本DSL元素和设置。

/**
 * 在这个配置文件的第一行,将Gradle的Android插件应用到这个构建中。
 * 使得后面的android配置块可用来指明android相关的构建选项。
 */
apply plugin: 'com.android.application'

android {
    /**
      *  compileSdkVersion指明Gradle准备使用的Android API等级来编译app。
      * 这意味着你的app可以使用包含在这个API等级及以下的API特性。
      * 
      *  buildToolsVersion 指明了Gradel将会使用的SDK build工具,命令行工具
      * 编译器的版本。你应用使用SDK Manager来下载build工具。
      */
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    /**
      * defaultConfig { } 配置块封装了所有build变种都会使用到的默认设置和
      * 入口信息, 并且可以从构建系统中动态重写main/AnroidManifest.xml中的一些属性。
      * 你可以配置product flavors来重写这些值,基于不同版本的app。
      */
    defaultConfig {
        
        /***
         * applicationId唯一标识发布的包。
         * 但是,你的源码应该仍然引用定义在main/AndroidManifest.xml文件
         * 中的包属性。
         */
        applicationId 'com.example.myapp'
        
        // 定义用来运行app的最小API等级
        minSdkVersion 14
        
        // 指明用来测试app的API等级
        targetSdkVersion 23
         
        // 定义你的app版本号
        versionCode 1
        
        // 定义一个友好的版本名
        versionName "1.0"
    }
    
    /**
      * buildTypes { } 配置块是你可以配置多个build types的地方。
      * 默认,构建系统定义两个build types: debug和release。
      * debug build type 不会显式的展现在默认构建配置中,但是它
      * 包含了调试工具,并且用debug密钥进行签名。release build type
      * 应用Proguard(混淆)设置,并且不会签名默认密钥。
      */
    buildTypes {
         
        /**
          * 默认,Android Studio 配置release build type 使用minifyEnabled来开启代码压缩,并且还会指明Proguard设置文件。
          */
        release  {
            minifyEnabled true // 为release build type开启代码压缩
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
        /**
          * productFlavors { } 配置块是你可以配置多个product flavors的地方。
          * 这样你可以让你创建不同版本的app,通过重写defaultConfig {}设置项。
          * Product flavors是可选的,构建系统默认不会创建他们。这个例子
          * 创建了一个免费版和付费版的product flavor。每个product flavor指明
          * 自己的application ID,以便于它们可以共存于Google Play Store或同一个Android设备中。
          */
    productFlavors {
       free {
            applicationId 'com.example.myapp.free'
        }
             
        paid {
            applicationId 'com.example.myapp.paid'
         }     
    } 

}

/**
  * dependencies { } 配置块位于模块build配置文件的顶层。
  * 仅仅指明需要build模块本身的一些依赖条件。
  */
dependencies {
      compile project(":lib")    
      compile 'com.android.support:appcompat-v7:22.0.1'    
      compile fileTree(dir: 'libs', include: ['*.jar'])
}

Gradle属性文件

Gradle也包含两个属性文件,位于工程根目录,用来指明Gradle构建工具箱自身的一些设置。

gradle.properties
  这是配置工程范围内的Gradle设置的地方,比如Gradle daemon的最大堆大小。更多信息,请查看Configuring the build environment

local.properties
  为构建系统配置本地环境属性,比如SDK安装路径。因为这个文件内容是由Android Studio自动生成,并且与本地开发者环境相关,你最好不要手动修改这个文件,或者从你的版本控制系统中check出来。

同步工程和Gradle文件(Syncigng Project with Gradle Files)

当你改变了工程中的构建配置文件后,Android Studio会要求你同步工程文件,以便于它能够导入你修改的配置信息,然后运行一些检查来确保你的配置不会创建构建错误。

要同步工程文件,点击当你改变配置文件后会出现在通知栏上的Sync Now,或者点击菜单栏上的Sync Project。如果Android Studio通知了任何配置错误,比如,你的源码使用的API特性仅仅在比你的compiledSdkVersion更高的API版本才可用,Message窗口将会出现描述这个问题。

图3. 同步工程

源集(Source Sets)

Android Studio会为每个模块将源代码和资源文件组成一个逻辑上的源集。每个模块的main/ 源集包括所有构建变种都使用的源码和资源。其他的源集目录是可选的,Android Studio不会自动为你创建他们当你配置新的构建变种的时候。但是,构建具体的app版本的时候,创建与main/类似的源集,可以帮助组织Gradle应该使用的文件和资源。

src/main/
  包括所有构建变种都通用的代码和资源的源集。

src/<buildType>/
  创建这个源集来包括仅仅为一个具体的build type使用的代码和资源。

src/<productFlavor>/
  创建这个源集来包括仅仅为一个具体的product flavor使用的代码和资源。

src/<productFlavorBuildType>/
  创建这个源集来包括仅仅为一个具体的构建变种使用的代码和资源。

比如,生成这个fullDebug版本的app,构建系统合并下面这些源集的代码和资源:

  • src/fullDebug/(构建变种源集)
  • src/debug/(构建类型build type源集)
  • src/full/ (product flavor源集)
  • src/main/(main源集)

注意:当你在Android Studio中创建一个新的文件或者目录时,使用File->New菜单项,你可以为一个具体的源集创建它。你可以选择的这些源集是基于你的构建配置的,并且Android Studio自动创建需要的目录,如果它们不存在的话。

如果不同的源集包含同一个文件的不同版本,当决定哪个文件使用的时候Gradle使用下面的优先级顺序。(在左边的源集会重写右边的源集文件和设置)。

build variant > build type > product flavor > main source set > library dependencies

这可以让Gradle在构建的时候使用与具体构建变种相关的文件,当重用activity,应用逻辑,以及和其他版本通用的资源的时候。当merging multiple manifests的时候,Gradle使用同样的优先级顺序,因此每个构建变种可以定义不同的组件或者权限在最终的manifest文件中。学习更多关于创建自定义源集,点击Create source sets for build variants

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,311评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,339评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,671评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,252评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,253评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,031评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,340评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,973评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,466评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,937评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,039评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,701评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,254评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,259评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,497评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,786评论 2 345

推荐阅读更多精彩内容