2.基础自定义构建

章节主题:

  • 理解Gradle files
  • 开始构建任务
  • 自定义构建

一,理解Gradle files

在AS里创建新工程,产生默认gradle文件, settings.gradle和build.gradle在project顶级目录,另一个build.gradle在app module目录下。

1.The settings.gradle

在新建的project下只包含一个Android App,settings.gradle一般只包含一句:
include ':app'
settings file在initialization阶段被执行,在文件里应该声明包含哪些modules,如上个例子,app module包含在内,单独module项目settings.file 是不必要的,但是在多module下,必须指定project包含的module。
在执行的时候,Gradle为每个settings file都创建一个settings对象,执行里面必要的方法。

2.顶层build.gradle

buildscript block是实际构建的配置位置,将repositories配置为JCenter,repositories是配置依赖关系的存储库位置的。 JCenter是一个著名的Maven仓库。

dependencies block用来配置构建过程本身需要的依赖,这意味着您不应该在顶级构建文件中包含您的应用程序或库所需的依赖关系。默认定义的唯一依赖项是Gradle的Android插件。这是每个Android模块所必需的,因为这个插件可以执行与Android有关的任务。

allprojects block用来配置所有module需要的属性。

最后一个clean任务用来清除build目录下构建所产生的文件。

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

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

3.module层build.gradle

当前project只包含一个Android app module。

apply plugin: 'com.android.application'
android {
    compileSdkVersion 23           //编译app的Android API版本
    buildToolsVersion "23.0.1"     //构建工具和编译器的版本(如aapt,zipalign,dx和renderscript等工具)

    //defaultConfig块配置应用程序的核心属性。此块中的属性将覆盖AndroidManifest.xml清单文件中的相应条目
    defaultConfig { 
        applicationId "com.my.test" //应用的唯一标识
        minSdkVersion 15  //运行APP需要的最小API 版本
        targetSdkVersion 23 //目标版本,告诉系统在此版本上APP已经通过测试,不需要特别的兼容行为。和compileSdkVersion无关
        versionCode 1 //版本code
        versionName "1.0"  //版本友好名
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
}

该层的build.gradle主要包含3个block

1)plugin

在第一行声明了 Android application plugin,和顶层的build.gradle配置了依赖关系。 Android application plugin是由Google Android Tools team开发维护,提供了Android applications and libraries的构建,测试和打包需要的所有Task。

2)android

applicationId和AndroidManifest.xml中package name的区别:
applicationId与packageName的区别

3)buildTypes

给App构建或打包不同的版本类型,见第4章Creating Build Variants

4)dependencies

dependencies block是 Gradle 配置的标准块,所以没在Android block下。dependencies 配置了app或者library需要的所有依赖。详情见3章Managing Dependencies

二,开始构建任务

在控制台输入gradlew tasks查看所有任务,在Android project下包含 Android tasks, build tasks, build setup tasks, help tasks, install tasks,verification tasks and other tasks。说过你想查看他们之间的依赖,你可以运行 gradlew tasks --all。

1.Base tasks

base plugin定义 assemble和clean,Java base plugin定义check和build。这些任务不在基本插件中实现,不执行任何操作,它们用于定义插件执行实际任务的约定:

  • assemble:组装项目输出
  • clean: 清空项目输出
  • check :运行所有check。比如unit test, instrumentation tests等
  • build :assemble+check

2.Android tasks

Android plugin继承了base tasks并实现了这些操作:

  • assemble:为每个类型产生APK
  • clean: 清空build产出物,如APK file
  • check :执行Lint检查,如有问题可中止运行
  • build :assemble+check

assemble默认依赖于assembleDebug和assembleRelease,如果你添加了多种build types,assemble会触发所有的build type。
Android新添Tasks
connectedCheck 在一个连接的设备上运行测试
deviceCheck 其他插件在远程设备上运行测试的占位符Task
installDebug and installRelease 安装特定版本应用
uninstall卸载

运行check task会产生一个包含警告和错误的Lint 报告, 在app/build/outputs目录下。
当组装发布版时,Lint发现错误时会引起APP的crash,可以根据控制台输出或输出的文档的错误信息做相应的修复。
在Android Studio中可以双击任务名运行任务


Gradle任务面板.png

三,自定义构建

在 Android Studio中更改settings.gradle or build.gradle后会触发 Sync Project with Gradle Files 按钮, Android Studio Sync实际运行了generateDebugSources task。

1.可操作属性

  • testApplicationId (the instrument test APK application ID)
  • testInstrumentationRunner (6章,Running Tests)
  • signingConfig (4章, Creating Build Variants)
  • proguardFile and proguardFiles (9章, Advanced Build Customization)

2.BuildConfig and resources

在SDK 17后,build tools会产生一个BuildConfig类,包含一些默认常量。对debugging时很有作用。

public final class BuildConfig {
  public static final boolean DEBUG = Boolean.parseBoolean("true");
  public static final String APPLICATION_ID = "com.my.test";
  public static final String BUILD_TYPE = "debug";
  public static final String FLAVOR = "";
  public static final int VERSION_CODE = 1;
  public static final String VERSION_NAME = "1.0";
}

自己也可以在配置文件里配置需要的字段。比如配置测试和正式服务器地址。也可配置res的值

android {
 buildTypes {
 debug {
           buildConfigField "String", "API_URL", "\"http://test.example.com/api\""
           buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
           resValue "string", "app_name", "Example DEBUG"   //res值配置
 }

 release {
            buildConfigField "String", "API_URL", "\"http://example.com/api\""
            buildConfigField "boolean", "LOG_HTTP_CALLS", "false"
            resValue "string", "app_name", "Example"  //res值配置
     }
   }
}

3. Project-wide settings

可以在project目录配置自定义属性,使用ext block。在module层可以使用该配置

ext {
 compileSdkVersion = 22
 buildToolsVersion = "22.0.1"
}

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

推荐阅读更多精彩内容