Android Gradle 项目结构简介

Gradle

首先介绍一下 Gradle
Gradle 是一个基于JVM的构建工具,这种工具使用的语言是 Groovy,即 build.gradle 里使用的语言。Gradle 能够配置一些编译的选项,也能添加一些开源库的引用。

扔一段维基的介绍:

Gradle 是一个基于 Apache AntApache Maven 概念的项目自动化建构工具。它使用一种基于 Groovy特定领域语言来声明项目设置,而不是传统的XML。
当前其支持的语言限于JavaGroovyScala,计划未来将支持更多的语言。

Gradle Files 分析

当我们要创建一个android项目时,我们会打开Android Studio,新建一个 Project,然后会看到如下的目录结构:

项目结构图

黄色框住的区域是gradle相关的配置文件,本文就简单介绍一下剩下的 Gradle 相关的内容。

Gradle 有几个重要的文件,顶层的setting.gradlebuild.gradle文件、每个 Module 自己的build.gradle文件,gradle.properties文件,local.properties文件,gradle目录。

为了以后的和谐相处,下面依次认识一下这几位 Gradle 家族成员:

1. setting.gradle:

include ':app'

这个 setting 文件定义了哪些 module 应该被加入到编译过程,对于 multi module 的项目我们需要这个文件,它告诉 gradle 要加载哪些 module。
对于一个新建的纯净项目,里面只定义了默认的 appmodule,后续有新的 module 的话都会自动在此处添加,当然也可以手动删掉。

* setting.gradle里也可以用 Groovy 语言写一些方法,这些方法在初始化项目时就被执行,做一些编译前的处理。

2. 顶层的build.gradle:

buildscript {
    repositories {
        jcenter()
        maven { url 'https://dl.google.com/dl/android/maven2/' }
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
  • buildscript:repositories 引用了一些代码仓库,比如jcenter()就是一个著名的 Maven 仓库,也可以用自定义的 url 来引用一些其他的仓库。dependencies引用了一些 Android 插件,此处是 gradle 插件。
  • allprojects:其中定义的属性会被应用到所有的 module 中。

3. module里的的build.gradle:

apply plugin: 'com.android.application'
#apply plugin: 'com.android.library'
android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
        applicationId "com.morning.android.glory"
        minSdkVersion 21
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    testCompile 'junit:junit:4.12'
}
  • apply plugin: 这一行代码应用了一些 android 应用的插件,此处的'com.android.application'表示这个 module 是主工程,对于子工程,对应要用'com.android.library'
  • android 代码块:这里有对此 module 的所有配置,例如版本号,应用id,编译配置等。
    • defaultConfig:就是程序的默认配置,注意,如果在AndroidMainfest.xml里面定义了与这里相同的属性,会以这里的为主。
      特别说明一下,applicationId定义了包名,这里的定义只作为程序的唯一识别 ID。而 AndroidManifest.xml中定义的package="com.morning.android.glory"才会影响 R文件的路径名。
    • buildTypes:定义了编译类型,针对每个类型我们可以有不同的编译配置。默认的有debug、release 的类型。
  • dependencies:属于gradle 的依赖配置。它定义了当前项目需要依赖的其他库。一般我们在 github 上遇到喜欢的库想用到项目中,就可以在这里添加引用了。
    这里特别说一下引用库的版本号,一般不要用26.+这种版本号的写法,因为‘+‘号会导致每次编译时都会查询有没有更新版本,导致编译速度变慢,而且会用到一些不稳定的 beta 版。对于公司的正经项目,就还是不要去冒这个险了,需要升级的话手动升级就可以。

4. gradle.properties:

org.gradle.parallel=true
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4608m -XX:MaxPermSize=1g -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 -XX:-UseParNewGC -XX:-UseConcMarkSweepGC -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC

COMPILE_SDK_VERSION=26
BUILD_TOOLS_VERSION=26.0.1
SUPPORT_LIBS_VERSION=26.0.1

这个里面可以配置参数,然后在其他build.gradle中引用

5. local.properties:

sdk.dir=/Users/zhouying/Library/Android/sdk

这里主要定义了sdk和ndk的路径,这个文件一般不会提交到公共仓库中,可以保留一些本地的配置。

6. gradle 目录

在讲 gradle 目录之前,我们需要先了解一下 Gradle Wrapper 的概念。如下。

Gradle Wrapper

Gradle 可以在没有安装 Gradle 的情况下使用,这时候就需要 Gradle Wrapper 了。Gradle Wrapper 其实就是一个脚本文件,它会在没有安装 Gradle 的情况下为我们下载Gradle,之后我们就可以使用 gradlew 命令了。

创建 Gradle Wrapper 文件

使用 gradle wrapper 来创建一组 Wrapper 文件。Gradle 官方建议我们在所有 Gradle 项目中都创建 Wrapper 文件,方便没有安装 Gradle 的用户使用。创建完毕之后,会发现我们的项目中多了如下一些文件:

gradlew (Unix Shell 脚本)
gradlew.bat (Windows批处理文件)
gradle/wrapper/gradle-wrapper.jar (Wrapper JAR文件)
gradle/wrapper/gradle-wrapper.properties (Wrapper属性文件)
然后,我们就可以像使用 gradle 命令一样使用 gradlew 了。Gradle Wrapper会自动为我们下载合适的 Gradle 版本。

Andorid Studio 创建项目时,已经替我们做了这一步,即生成了最上图黄色框中的 6. gradle 目录,所以我们不需要自己运行命令来创建 graldle wrapper 文件。

设置 Wrapper版本

使用 gradle wrapper --gradle-version 3.2.1 来设置Wrapper的版本。或者也可以直接编辑 gradle/wrapper/gradle-wrapper.properties 文件来修改版本。

文件内容如下,可以修改最后面的 "gradle-3.5-bin.zip" 来配置版本。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.5-bin.zip

小结

Gradle 的存在就是为了构建。我们知道 java 代码需要经过编译生成 ·class 文件,然后打包成 dex,最后得到一个可以安装的 apk 包。Gradle 就是执行这一过程的构建工具。
除了构建,Gradle 还有一些其他“副业”,比如对于项目各种打包选项的配置,是生成 debug 包还是 release 包,对于各 Module 的管理,使用一些 jcentermaven 的开源项目等。这些功能都使 Gradle 变得更加丰富,也为开发者提供了更多便利。

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

推荐阅读更多精彩内容