Android for Gradle 学习笔记 #1 概念篇
New Build System for Android Project #1 About concept
前言
Google 推出了一个基于Gradle的全新的构建系统来构建Android项目。并且发布了能开发Android,Google TV,Google Wear 还有 Google Glass项目的官方IDE工具-Android Studio(基于 IntelliJ IDEA 工具研发)。好奇之下下载了AndroidStudio并新建项目一看,发现新的项目构造跟之前的熟悉的构造(Eclipse项目)完全不一样。既然Google推荐这个新构建系统,下定决心学习官方文档级视频。后发现在项目管理方面,AndroidStudio比Eclipse方便多了(纯属个人想法, but it worth to try~)。以下是我对这些topic的理解。
背景
在之前的Android项目没有定义基本的构建系统及方法。有的项目是用Ant来构建,有的是用Maven来构建,还有有些则用NDK来构建那些需在项目里添加C++,C 等代码的或者针对不同的CPU机型的项目。这些构建方式降低了构建系统间的互换性和代码的可重用性(reusability)。为了解决这些问题,Google计划定义一个能满足所有Android开发者需求的灵活的构建系统。即能管理依赖(dependency management), 而且能进行项目测试(run test),并且可以发布(deploy)。最终,Google 决定在Gradle的基础上研发一个新的构建系统。
Gradle 简介
为什么是Gradle? 根据AndroidSDK研发者在2013年Google I/O Session里声明:”因为Gradle 是由一个很强大并实用的声明性语法(declarative syntax)构成的,并且用户可以根据自己的需求来编辑。Gradle有能整合IDE的工具API,这说明能定制针对android项目需求的DSL(Domain Specific Language)”[3]。Gradle 是由Gradleware[1] 开发的开源项目(Apache OpenSource)[1]。
Gradle Android Plugin
Google和Gradleware 合作研发了Android插件(gradle android plugin)。在Gradle的基础上添加了针对Android项目的实用功能:Manifast管理,版本管理等等。开发者只需在构建文件(build.gradle)里填写dependency, build type 或 product flavor 等信息就可以通过gradle构建命令来构建项目。个人认为它的强大之处在于机动性(flexibility),在构建文件里添加静态值(例如: targetSdkVersion 15)也可以用代码来设定值(例:targetSdkVersion getMinSdkVersion()+5)。
build.gradle 例子
apply plugin: 'com.android.application'
def version = 15
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
defaultConfig {
applicationId "net.jinkook.hellogradle"
minSdkVersion version
targetSdkVersion getMinSdkVersion()+5
versionCode 1
versionName "1.0"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
新Android项目构造
下面来看一下用AndroidStudio新建的项目构造。主要有3个View:Project,Package,Module。通过鼠标点击来互换模式。[如图1]
在Project View下,可以浏览整个项目构造及全局变量。可以设置Gradle版本(在gradle-wrapper. properties里设置),可以在External Libraries的文件夹里浏览整个项目所依赖的jar包信息。
在Package View下,可以方便的浏览指定Module的包。通常方便添加/修改layout或 image。
在Module View下,开发者们方便管理各个模块和对应的build.gradle。什么是Module? Google为了增强已有code的可重用性,导入了Module的概念。Module里即包括Application(可以是 Andorid Application, Android TV Module, Wear Module, Glass Module, Cloud Module:App Engine back-end service),也可以是Lib集合包(Android Library, 已有的Gradle项目,Java Library等)。如图所示, 该HelloGradle项目有4个module。分别是app, lib, myapplication, mylibrary。其中app和myapplication是Android Application Module, lib 是 java library module, mylibrary 是 android library module.
下面来看一下比较重要的几个Keywords:
gradle wrapper:设定gradle的信息,包括路径,版本等。 gradle wrapper 一共有4个文件: 一个jar包,一个gradle-wrapper.property, 一个linux shell文件和 一个window shell 文件。gradle wrapper的配置适用于整个project。当修改property里的gradle版本路径的时候,IDE会自动到该路径下载指定Gradle版本文件。(注:在修改Gradle路径的时候,最好使用官方路径。以免下载含有恶性代码的文件)
build.gradle(Project:[Project_name]):这个Gradle文件是用来指定该项目要使用的repository地址(可以是jcenter,meavenCentral 或 第3方repository的路径)。
settings.gradle(Project Settings): 这个文件是用来声明该项目里的Module信息。通过添加Module文件包名来声明。
build.gradle(Module:): 这个文件是用来管理该Module的构建信息。一般包括以下内容。
- apply plugin : 声明Module的类型(Identity)。根据不同的类型,在build.gradle 文件的最上方 添加响应的plug-in。
具体代码如下:
apply plugin: 'com.android.application' // 如果是Android Application
apply plugin: 'com.android.library' //如果是Android Library
apply plugin: 'java' //如果是Java Library
- buildToolsVersion: Google 把BuildTool 从SDK里分离出来了。在该栏里填写要使用了BuildTool 版本。如果声明版本为20,在构建过程中该模块则用20版本的BuildTool来构建,如果声明为21.1.2, 则用21.1.2版本来构建。说明一个项目可以由需要不同版本的BuildTool的模块们组成,并构建。
android {
compileSdkVersion 21
buildToolsVersion "21.1.2"
}
- defaultConfig: 基本配置信息。一般包括最低SDK版本,目标SDK版本,ApplicationID 以及Module版本。
android {
defaultConfig {
applicationId "net.jinkook.myapplication"
minSdkVersion 21
targetSdkVersion 21
versionCode 1
versionName "1.0"
}
}
- buildTypes:可以配置构建方式。一般有Debug&Release模式,开发者可以根据自己的需求来添加心得构建方式。还可以按照CPU来配置构建模式:x86,arm 等。共有 n(CPU)*n(BuildMode)*n(ProductFlaver)种构建方式。假设没有ProductFlaver的情况下,有x86-Debug,x86-Release,arm-Debug,arm-Release 方式。这些方式可以在AndroidStudio左下侧BuildVariants 里可以选择。
android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
mydebug {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
- Product Flaver: 可以按照App的需求来设定多种模式。例如一个App有商业版本和测试版本,各模式使用不同的数据库和方法。在这种情况下,可以设置Commercial和Local 两个Flavor 而且配置包名后在各个包里开发。在构建阶段,指定要构建模式(例如:Local-x86-Debug),系统则合并指定的包文件个main文件来构建项目。
android {
productFlavors{
commercial{
setApplicationId(getApplicationId()+".commercial");
// applicationId "net.jinkook.sampleapplication3.commercial"
}
local{
setApplicationId(getApplicationId()+".local");
}
}
}
关于选择构建模式,可以通过点击AndroidStudio 界面左下角BuildVariants来打开界面(如图),通过点击来选择所需要的构建方法。(关于具体方法,计划在下次的学习笔记里详细说明~)
- Dependencies:类似于Meaven,添加该模块参照的lib包名。系统会根据配置的路径来下载lib包
android {
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.0.0'
compile 'com.squareup.picasso:picasso:2.5.2'
}
}
结尾
大致的概念就到这里了,改天再整理实习篇来分享具体Implement方案。
老实说,第一次下载AndroidStudio后新建项目的时候,看到陌生的构造,我有了直接卸载AndroidStudio的冲动。但通过回放n次来学习Google I/O13里的关于NewBuildSystem Session和gradleware里提供的AndroidGradle讲堂,我渐渐开始理解了该构建系统的便利之处。下一步打算学习Gradle 里使用的语言–Groove 来更灵活的配置build.gradle文件。
最后感谢 Miko Matsumura,Rooz Mohazzabi 提供 AndroidGradle讲堂。
参考文献:
[1] Gradleware Homepage: http://www.gradleware.com/
[2] Gradle for Android : http://commonsware.com/presos/Gradleware-Intro.pdf
[3] New Build System(Google I/O 2013): http://tools.android.com/tech-docs/new-build-system
[4] Gradle Android Plugin, Google Code : https://code.google.com/p/gradle-android-plugin/
[5] Android Plug-in for gradle : https://developer.android.com/tools/building/plugin-for-gradle.html