gradle学习使用

翻译自Android Plug-in for Gradle
转载请注明出处gradle学习使用,如果有翻译错误还请斧正 :)

构建配置(Build configuration)

项目的构建配置定义在build.gradle中,它是一个可编辑的文本,在你的构建系统中使用gradle 和 android 插件的语法和选项可以配置如下的几个方面

  • 构建变种版本(build variants) 此构建系统可以对同一个模块生成不同生产和构建配置的多个apk。这是非常有用的,当你想要构建应用程序的不同版本,而不需要对不同版本单独创建一个项目或模块。

  • 依赖管理(Dependencies) 构建系统管理项目的依赖关系而且支持本地文件系统依赖和远程仓库依赖。因此你不用搜索、下载、复制你的二进制相关的依赖包到你的项目目录。

  • Manifest项(Manifest entries) 构建系统允许你在构建可变配置中指定一些manifest文件元素的值。这些构建值会覆盖manifest文件中已经存在的值。这个方法很有用当你想要生成多个apk文件而每个apk文件有不同的应用程序名、min sdk version、target sdk version。多个manifest按照构建类型、渠道打包,/mainmanifest 和 库文件以不同的优先级合并在一起来展示。

  • 签名(signing) 构建系统允许你在构建配置中指定签名设置,而且可以在构建过程中签名你的apk。

  • 混淆(ProGuard) 构建系统允许你对每个构建变种指定不同的ProGuard规则文件。构建系统可以在构建过程中模糊你的类。

  • 测试(Testing) 对于大多数模版,构建系统创建一个测试目录,androidTest 在你的项目中通过测试源码生成一个测试的apk。因此你不用单独创建一个测试项目。构建系统也可以在构建过程中运行你的测试代码。

按照惯例构建(Build by convention)

Android Stdio构建系统假设对于项目结构和其他构建选项有预设值。如果你项目遵守这些约定那么你的构建系统将会非常简单。当这些约定不试用于你的项目,构建系统的灵活性允许你修改几乎构建过程的各个方面。例如,如果你需要替换模块目录的默认源文件,你可以在模块的构建文件中配置一个新的目录结构。

项目和模块的构建设置(Projects and modules build settings)

一个项目在Android Studio中代表顶级的Android发开结构。Android Studio项目包括了项目文件 和一个或多个应用程序模块,一个模块是一个你的app可以独立构建、测试、debug的组件。模块包括了你app的源码和资源。Android Studio 项目可以包含多种模块:

  • Android应用模块包含了应用(手机,电视,手表,眼镜)代码,而且也行依赖于库模块。尽管许多Android app只是有一个应用模块组成。构建系统为应用模块生成apk包

  • Android 库模块包含了可复用Android特定代码和资源。构建系统为库模块生成一个 AAR(Android ARchive)包。

  • App引擎模块包含了用于APP引擎集成的代码和资源。

  • Java库模块包含了可以复用的代码,构建系统为java库模块生成一个JAR包。

Android Studio 项目包含了一个顶级的项目 Gradle 构建文件允许你为当前项目的所有的模块添加配置选项。每一个应用模块也有自己的build.gradle文件用来构建设置指定的那个模块。

项目构建文件(Project Build File)

默认的,项目级别的Gradle文件使用构建脚本(buildscript)来定义Gradle仓库(repositories)和依赖(dependencies)。这允许不同的项目使用不同的Gradle版本。支持的仓库包括JCenter,MavenCentral,Ivy。这个例子展示了构建脚本使用JCenter仓库和一个包含了Android Gradle版本1.0.1插件的类路径依赖生成器

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.0.1'

        // NOTE: Do not place your application dependencies here: they belong
        // in the individual module build.gradle files
    }
}

allprojects {
   repositories {
       jcenter()
   }
}

注意:AndroidStudio项目的SDK位置定义在sdk.dir设置中的local.properties文件或是通过ANDROID_HOME环境变量。

模块构建文件(Module Build File)

应用模块Gradle构建文件允许你配置模块构建设置,包括覆盖 src/main 清单设置和设置自定义包装选项。

  • android 设置(android settiongs)
    • compileSdkVersion
    • buildToolsVersion
  • 默认配置和多渠道打包(defaultConfig and productFlavors)
    • manifest 属性例如:applicationId,minSdkVersion,targetSdkVersion和测试信息
  • 构建类型(buildTypes)
    • 构建属性例如debuggable,ProGuard授权,debug签名,版本名后缀和测试信息

下面的例子使用了Android插件,使用默认的配置覆盖了一些manifest属性,创建了两个构建类型:release和debug,还有一些依赖。


apply plugin: 'com.android.application'

android {
    compileSdkVersion 20
    buildToolsVersion "20.0.0"

    defaultConfig {
        applicationId "com.mycompany.myapplication"
        minSdkVersion 13
        targetSdkVersion 20
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
         debug {
            debuggable true
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:20.0.0'
    compile project(path: ':app2, configuration: 'android-endpoints')
}

注意:你可以通过一个函数对一些属性注入自定义的构建逻辑然后让属性调用,例如:


def computeVersionName() {
  ...
}

android {
    defaultConfig {
        versionName computeVersionName()
        ...
    }
}

依赖(Dependencies)

Android Studio 构建系统管理项目依赖而且支持模块依赖,本地二进制依赖,远程项目依赖。

模块依赖(Module Dependencies)

<ul>应用程序模块在他的构建文件中可以包括一系列他所依赖的其他模块,当你构建这个模块,构建系统组装和包含它所需要的模块。</ul>

本地依赖(Local Dependencies)

<ul>如果你的模块依赖的二进制文档存在于本地文件系统中,例如JAR文件,你可以在构建文件中对那个模块声明这些依赖</ul>

远程依赖(Remote Dependencies)
<ul>当你的一些依赖需要用到远程仓库,你不用下载它们和复制它们到你的项目中,Android Studio构建系统支持从仓库中远程依赖,例如Maven,和依赖关系管理如Ivy
</ul>
<ul>许多流行的软件库和工具可以从公共的maven库中使用,对于这些依赖你必须指定他们的maven坐标,这些坐标在远程仓库中独一无二的标识着每一个元素。在构建系统中使用group:name:version的格式使用Maven坐标。例如使用Maven坐标标识Google的版本号为16.0.1的Guava库为com.google.guava:guava:16.0.1
</ul>
<ul> Maven Central Repository 是最被广泛使用分发库和工具的地方。</ul>

构建任务(Build tasks)

Android Studio 构建系统定义了一套分层的构建任务:顶部任务调用依赖任务来获取他们构建产生的结果,顶部任务如下:

收集(assemble)
<ul>构建项目结果</ul>
检查(check)
<ul>运行检查</ul>
构建(build)
<ul>运行收集和检查</ul>
清理(clean)
<ul>执行清理</ul>

Android插件提供了额外的任务连接检查(connectedCheck)和设备检查(deviceCheck)用来在真机连接、模拟器下、远程设备时检查。Gradle任务可以在点击右边边缘的Gradle面板用来显示。

studio-gradle-tab.png

运行一个顶部任务会运行它所依赖的所有任务。例如:收集任务依赖收集调试(assembleDebug)和收集发布(assembleRelease)用来调试和发布apk。收集任务依赖这些任务因此调用他构建所有的apk。这些任务也可以独立的调用以用来单独调试或发布apk。

你可以通过Android Studio或是命令行来显示有效的任务列表和调用任何任务Building and Running from Android StudioBuild the project from the command line有描述。

Gradle包装器(The Gradle wrapper)

Android Studio项目包含了Gradle包装器(Gradle wrapper) 它包含以下:

  • JAR文件

  • 属性文件

  • windows平台的shell脚本

  • mac和linux平台的shell脚本

注意:你应该在你的源码控制系统中提交所有的这些文件。

使用Gradle包装器(而不是本地安装的Gradle)时确保你总是运行在local.properties文件中定义的版本。在这里配置你的项目来使用新的Gradle版本、编辑属性文件、指定新版本。

Android Studio从你项目的Gradle包装器目录中读取属性文件然后从这个目录运行包装器,因此你可以在需要不同gradle版本的多个项目中无缝工作。

注意:Android Studio不使用shell脚本,因此当从IDE构建时任何你做出的任何改变都不会生效。你需要在Gradle构建文件中使用自己的自定义逻辑来替代。

你可以在没有安装Android Studio的你的开发机或其他机器通过命令行运行shell脚本来构建自己的项目。

警告:只有从可信任源使用Gradle包装器脚本和JAR来创建项目,例如那些通过Android Studio生成的项目。

构建变种(Build variants)

在构建系统中通过构建变种(build variant)你项目的每个版本会被表现出来。构建变种是多渠道和构建类型的组合。多渠道表现构建项目的不同版本,例如免费版和付费版。构建类型表现为每一个app包生成的构建打包的版本,例如调试版本(debug)和生产版本(release)。构建系统为每个生产渠道和构建类型的组合生成apk。

默认的,Android Studio在build.gradle文件中定义默认的配置设置defaultConfig和两个构建版本(debug and release)。这创造了两个构建变种,debug和release。而且构建系统为每个变种生成一个apk。

添加两个生产渠道,demofull 和默认构建类型debugrelease一起生成四个构建变种,每一个有自己的自定义配置:

  • demoDebug
  • demoRelease
  • fullDebug
  • fullRelease

通过多个Android应用程序源整合资源

  • 构建变种基于构建类型和构建变种构建设置
  • main来源集,一般位于src/main/res目录
  • 库项目依赖通过aar绑定的res入口来得到资源

优先的合并顺序从低到高是库/依赖->main src-> 多渠道打包->构建类型

一些项目有复杂的功能组合而不仅是一种规格,但是他们仍然表现为一个app。例如:
除了一个demo和full版本的app,一些游戏也许包含了一个特殊CPU/ABI的二进制细节。灵活的构建系统使生成如下项目的构建变种成为可能:

  • x86-demoDebug
  • x86-demoRelease
  • x86-fullDebug
  • x86-fullRelease
  • arm-demoDebug
  • arm-demoRelease
  • arm-fullDebug
  • arm-fullRelease
  • mips-demoDebug
  • mips-demoRelease
  • mips-fullDebug
  • mips-fullRelease

这个项目会有两个构建类型(debug和release),两个规格(dimensions)的多渠道打包,一个是app类型(demo 和 full) 一个是CPU/ABI(x86, ARM, or MIPS)。

源码位置(Source directories)
构建系统联合了源码和资源从如下位置构建你app的每个版本:

  • src/main/ -main源码目录(对所有变种的默认的配置)
  • src/<buildType>/ -源码目录
  • src/<productFlavor>/ -源码目录

注意:构建类型和多渠道打包源目录是可选的,作为Android Studio不会为你创建这些目录。你需要在构建配置文件中创建这些目录作为你的构建类型和多渠道打包。

项目不会定义任何渠道,构建系统使用默认配置(defaultConfig)设置,main app目录和默认的构建类型目录。例如:在项目中实现默认的debug和release构建变种而不用多渠道打包是这样的:

  • *src/main/ *(default configuration)
  • src/release/ (build type)
  • *src/debug/ *(build type)

项目定义一系列的多渠道打包,系统整合构建类型,多渠道打包,和main资源目录。
例如 实现一个full-debug 构建变种,构建系统整合建类型,多渠道打包,和main资源目录如下:

  • *src/main/ *(default configuration)
  • src/debug/ (build type)
  • *src/full/ *(flavor)

对于使用了渠道维度的项目,构建系统会为每个维度整合一个渠道。例如:
实现一个arm-demo-release构建变种,构建系统合并如下:

  • *src/main/ *(default configuration)
  • src/release/ (build type)
  • *src/demo/ *(flavor - app type dimension)
  • *src/arm/ *(flavor - ABI dimension)

一个构建变种会将这些目录下面的源代码整合到一起输出。你可以在不同的目录中使用相同名字的类只要这些目录不使用同一个变种。

构建系统同时整合所有的manifests成为一个manifest,因此在最终的manifest中构建变种可以定义不同的组件和权限。manifest合并的优先级从低到高是:库/依赖->-main src->渠道打包->构建类型

构建系统从所有的源码目录整合所有的资源。如果在一个构建变种中不同的目录包含相同名的资源,优先级的顺序是:构建类型资源覆盖渠道打包资源,渠道打包资源覆盖main源码目录资源,main源码资源覆盖库文件。

注意:构建变种允许你从不同版本的app中复用相同的activities,应用程序逻辑,资源。

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

推荐阅读更多精彩内容