如何用Android Studio查看build.gradle clean build源码

Android Studio中Gradle使用详解
转自:/p/02cb9a0eb2a0
一)基本配置
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
Android脚本
apply plugin: 'com.android.application'
Android配置
compileSdkVersion 22
buildToolsVersion "22.0.1"
├── build.gradle
├── settings.gradle
└── app
├── build.gradle
├── build
├── libs
└── src
└── main
├── java
└── com.package.myapp
└── res
├── drawable
├── layout
└── etc.
Gradle Wrapper结构(这些新建项目时都添加给了用户,不需要重新添加)
├── gradlew
├── gradlew.bat
└── gradle/wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
运行build任务 - 列出所有可用任务
$ ./gradlew tasks
生成App-debug.apk任务
$ ./gradlew assembleDebug
# Apk路径: MyApp/app/build/ outputs/apk
手动导入Eclipse-Android项目(自动导入请连续点“下一步”)
在项目路径下创建build.gradle文件:
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
apply plugin: 'com.android.application'
compileSdkVersion 22
buildToolsVersion "22.0.1"
sourceSets {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
androidTest.setRoot('tests')
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
PS 也可以复制粘贴Eclipse-Android项目的源代码到Android Studio的项目里
二)自定义配置
Gradle所有文件结构
├── build.gradle
├── settings.gradle
└── app
└── build.gradle
settings.gradle
include ':app'
MyApp/build.gradle
buildscript {
repositories {
dependencies {
classpath 'com.android.tools.build:gradle:1.2.3'
allprojects {
repositories {
MyApp/app/build.gradle
apply plugin: 'com.android.application'
compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
buildTypes {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
$ ./gradlew assemble -为所有构建类型创建apk
$ ./gradlew check 运行所有的检查,比如说Android Lint,如果发现问题可终止任务
$ ./gradlew build 运行以上两个任务
$ ./gradlew clean -清除生成的apk
$ ./gradlew connectedCheck - 在设备上运行测试
$ ./gradlew deviceCheck - 远程设备运行测试
$ ./gradlew installDebug/installRelease - 在设备商安装指定版本
$ ./gradlew uninstall - 卸载
Build Types不同版本的参数设置 - BuildConfig/Resource Value
buildTypes {
buildConfigField "String", "API_URL","\"/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
resValue "string", "app_name", "Example DEBUG"
buildConfigField "String", "API_URL", "\"/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "false"
resValue "string", "app_name", "Example"
全局设置(项目根目录的build.gradle)
allprojects {
apply plugin: 'com.android.application'
compileSdkVersion 22
buildToolsVersion "22.0.1"
设置全局参数
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
在MyApp/app/build.gradle里面使用参数
compileSdkVersion pileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
默认任务(MyApp/build.gradle)
defaultTasks 'clean', 'assembleDebug'
三) 依赖管理
预设配置仓库
repositories {
mavenCentral()
mavenLocal()
repositories {
url "/maven2"
credentials {
username 'user'
password 'secretpassword'
url "/repo"
repositories {
url "../repo"
项目文件依赖
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
原生库结构与配置
├── AndroidManifest.xml
└── jniLibs
├── armeabi
└── nativelib.so
├── armeabi-v7a
└── nativelib.so
├── mips
└── nativelib.so
└── x86
└── nativelib.so
sourceSets.main {
jniLibs.srcDir 'src/main/libs'
Libray项目
# 修改Android插件:
apply plugin: 'com.android.library'
# settings.gradle新增libray项目:
include ':app', ':library'
# app内引用library项目:
dependencies {
compile project(':library')
Android Studio内添加依赖
四)构建变体
五)多模块构建管理
在gradle.properties里面添加:
org.gradle.parallel=true
└─── src
├─── main
│ ├─── java
└─── com.example.app
└───res
└─── test
└─── java
└─── com.example.app
dependencies {
testCompile 'junit:junit:4.12'
使用Robolectric
apply plugin: 'org.robolectric'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
testCompile 'junit:junit:4.12'
testCompile'org.robolectric:robolectric:3.0'
testCompile'org.robolectric:shadows-support:3.0'
@RunWith(RobolectricTestRunner.class)
@Config(manifest = "app/src/main/AndroidManifest.xml", sdk = 18)
public class MainActivityTest {
public void clickingButtonShouldChangeText() {
AppCompatActivity activity = Robolectric.buildActivity(MainActivity.class).create().get();
Button button = (Button) activity.findViewById(R.id.button);
TextView textView = (TextView) activity.findViewById(R.id.label);
button.performClick();
assertThat(textView.getText().toString(), equalTo(activity.getString(R.string.hello_robolectric)));
使用Espresso
测试覆盖度
使用Jacoco
七)创建任务与插件
八)配置CI
九)自定义配置 - 进阶
缩减apk文件大小
使用ProGuard
buildTypes {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
收缩资源文件 - 自动 (&手动待续&)
buildTypes {
minifyEnabled true
shrinkResources true
org.gradle.parallel=true # 并行构建
org.gradle.daemon=true # 开启Gradle守护进程
org.gradle.jvmargs=-Xms256m -Xmx1024m # 配置JVM&参照下图&
使用Profiling
使用Jack(Java Android Compiler Kit) and Jill(Jack Intermediate Library Linker)
lintOptions {
abortOnError false
app打包 - 进阶
enable true
exclude 'ldpi', 'mdpi'
compatibleScreens 'normal', 'large', 'xlarge'
生成结果:
app-hdpi-release.apk
app-universal-release.apk
app-xhdpi-release.apk
app-xxhdpi-release.apk
app-xxxhdpi-release.apk
《Gradle for Android》如何在Android Studio中使用Gradle发布项目至Jcenter仓库 | XycZero's Blog
目前非常流行将开源库上传至Jcenter仓库中,使用起来非常方便且易于维护,特别是在Android Studio环境中,只需几步配置就可以轻松实现上传和发布。
Library的转换和引用
博主的一个开源项目之前是在Ecplise环境下进行开发且把控件代码和Demo写在了一个Project中,所以在发布开源库前首先是将原项目中的Demo代码提取出来单独新建一个项目,并将原项目转换为一个Library。
在Android Studio中转换成Library一般有两种方法。第一种方法是在Android Studio新建一个Project后,在该Project中再新建一个Library Module,方法很简单,就是在新建Module时选中Android Library即可,详见下图蓝色区域。
另一种方法是,在Android Studio中新建一个Project后会默认创建一个app module,我们打开这个app module 的bulid.gradle文件会发现它的默认属性是application,所以我们需要将文件中的:
apply plugin: ‘com.android.application’ 替换为apply plugin: ‘com.android.library’,并把defaultConfig中的applicationId 删除即可。
在Project转换Library时需要特别注意的是Library的。 如果代码中你在switch-case语句中使用到了相关的资源ID属性,例如:
public void onClick(View v) {
switch (v.getId()) {
case R.id.undo_dialog_btn:
if (mUndoActionListener != null)
mUndoActionListener.executeUndoAction();
dismiss();
这是Android Studio就会报错,因为case分支后面跟的参数必须是常数,所以我们暂且只能使用if-else语句来完成相应的逻辑判断操作,例如:
public void onClick(View v) {
if(v.getId()==R.id.undo_dialog_btn){
if (mUndoActionListener != null){
mUndoActionListener.executeUndoAction();
dismiss();
添加全局插件
为了能使得项目能自动的打包发布至jcenter仓库中,我们首先需要在Project的bulid.gradle文件中添加两个插件依赖,具体如下:
dependencies {
classpath 'com.android.tools.build:gradle:1.0.1'
//自动化maven打包插件
classpath 'com.github.dcendents:android-maven-plugin:1.2'
//自动上传至Bintray平台插件
classpath "com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0"
// NOTE: Do not place your applicati they belong
// in the individual module build.gradle files
Library配置
这里的Library即是你需要发布的项目Module。
apply plugin: 'com.android.library'
apply plugin: 'com.github.dcendents.android-maven'
apply plugin: 'com.jfrog.bintray'
version = "1.0.0"
compileSdkVersion 21
buildToolsVersion "21.1.2"
resourcePrefix "customswipelistview_"
//这个没搞清什么作用,暂时随意填。
defaultConfig {
minSdkVersion 16
targetSdkVersion 21
versionCode 1
versionName version
buildTypes {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
def siteUrl = "/xyczero/custom-swipelistview"
def gitUrl = "/xyczero/custom-swipelistview.git"
//填写唯一包名
group = "com.xyczero"
repositories.mavenInstaller {
// This generates POM.xml with proper paramters
packaging 'aar'
//添加项目描述
name 'CustomSwipeListview for Android'
url siteUrl
//设置开源证书信息
licenses {
name 'The Apache Software License, Version 2.0'
url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
//添加开发者信息
developers {
developer {
id 'xyczero'
name 'xiayuncheng'
connection gitUrl
developerConnection gitUrl
url siteUrl
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
task javadoc(type: Javadoc) {
source = android.sourceSets.main.java.srcDirs
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
artifacts {
archives javadocJar
archives sourcesJar
Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())
//配置上传Bintray相关信息
//读取Bintray帐号和apiKey。
//一般的为了保密和安全性,在项目的local.properties文件中添加两行句话即可:
//bintray.user=username
//bintray.apikey=apikey
user = properties.getProperty("bintray.user")
key = properties.getProperty("bintray.apikey")
configurations = ['archives']
repo = "maven"//上传的中央仓库名称
name = "CustomSwipeListview"//上传的项目的名字
websiteUrl = siteUrl
vcsUrl = gitUrl
licenses = ["Apache-2.0"]
publish = true
//是否发布
执行打包并发布
上述文件配置完成后,先Rebuild一下项目,然后在AS的Terminal运行 gradlew install 命令。
此时你会发现在项目的.idea文件夹下有一个gradle.xml文件,此文件就是该项目相应的gradle格式配置,同时在所要发布的xxx-module/build/outputs/aar文件夹下有已生成aar文件以及在xxx-module/build/poms文件夹下的pom-default.xml(对应maven格式)。
在完成上述步骤1后,所有必须的文件已在本地生成完毕,然后接着执行 gradlew bintrayUpload 命令上将项目上传到Bintray平台上。
等待上传结束后,你可以在上找到你发布的项目,此时你只需要发送一个Request给管理员并耐心等待审批通过即可(博主当时是凌晨发送请求,早上8点多收到的审批通过邮件)。
至于找到发送请求的途径有很多,可以进入该点击include package输入你的项目名字并点击匹配到的项目,也可以直接在首页搜索你的项目名字并在右下角的Link To点击加入jcenter的申请。
如果看完上述教程有什么不明白之处欢迎留言讨论。
相关文章:
Written with .1312人阅读
本文出自于:/article/bea41d4389bdc3b4c51be6be.html,http://my.oschina.net/u/1471093/blog/341990
,/html/topnews/9974.htm,
apply plugin: 'com.android.application'//说明module的类型,com.android.application为程序,com.android.library为库
& & compileSdkVersion 22//编译的SDK版本
& & buildToolsVersion &22.0.1&//编译的Tools版本
& & defaultConfig {//默认配置
& & & & applicationId &com.nd.famlink&//应用程序的包名
& & & & minSdkVersion 8//支持的最低版本
& & & & targetSdkVersion 19//支持的目标版本
& & & & versionCode 52//版本号
& & & & versionName &3.0.1&//版本名
& & sourceSets {//目录指向配置
& & & & main {
& & & & & & manifest.srcFile 'AndroidManifest.xml'//指定AndroidManifest文件
& & & & & & java.srcDirs = ['src']//指定source目录
& & & & & & resources.srcDirs = ['src']//指定source目录
& & & & & & aidl.srcDirs = ['src']//指定source目录
& & & & & & renderscript.srcDirs = ['src']//指定source目录
& & & & & & res.srcDirs = ['res']//指定资源目录
& & & & & & assets.srcDirs = ['assets']//指定assets目录
& & & & & & jniLibs.srcDirs = ['libs']//指定lib库目录
& & & & debug.setRoot('build-types/debug')//指定debug模式的路径
& & & & release.setRoot('build-types/release')//指定release模式的路径
& & signingConfigs {//签名配置
& & & & release {//发布版签名配置
& & & & & & storeFile file(&fk.keystore&)//密钥文件路径
& & & & & & storePassword &123&//密钥文件密码
& & & & & & keyAlias &fk&//key别名
& & & & & & keyPassword &123&//key密码
& & & & debug {//debug版签名配置
& & & & & & storeFile file(&fk.keystore&)
& & & & & & storePassword &123&
& & & & & & keyAlias &fk&
& & & & & & keyPassword &123&
& & buildTypes {//build类型
& & & & release {//发布
& & & & & & minifyEnabled true//混淆开启
& & & & & & proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'//指定混淆规则文件
& & & & & & signingConfig signingConfigs.release//设置签名信息
& & & & debug {//调试
& & & & & & signingConfig signingConfigs.release
& & packagingOptions {
& & & & exclude 'META-INF/ASL2.0'
& & & & exclude 'META-INF/LICENSE'
& & & & exclude 'META-INF/NOTICE'
& & & & exclude 'META-INF/MANIFEST.MF'
& & lintOptions {
& & & & abortOnError false//lint时候终止错误上报,防止编译的时候莫名的失败
dependencies {
& & compile fileTree(dir: 'libs', exclude: ['android-support*.jar'], include: ['*.jar']) & //编译lib目录下的.jar文件
& & compile project(':Easylink')//编译附加的项目
& & compile project(':ImageLibrary')
& & compile project(':ImageResLibrary')
& & compile project(':Ofdmtransport')
& & compile project(':PullToRefreshLibrary')
& & compile project(':RecorderLibrary')
& & compile project(':WebSocket')
& & compile project(':WidgetLibrary')
& & compile 'com.nostra13.universalimageloader:universal-image-loader:1.9.3'//编译来自Jcenter的第三方开源库
Gradle 基本概念
首先我们学习几个gradle 的脚本语法,掌握了这几个语法,你就能非常简单的用gradle构建打包android项目了。 首先,我们来看下一个最简单android&build.gradle。
build.gradle
&&&&buildscript&{
&repositories&{
&&&&&&&&&&&&mavenCentral()
&&&&&&&&dependencies&{
&&&&&&&&&&&&classpath&'com.android.tools.build:gradle:0.4'
&&&&apply&plugin:&'android'
&&&&android&{
&&&&&&&&compileSdkVersion&17
&&&&&&&&buildToolsVersion&&17&
&&&&&&&&defaultConfig&{
&&&&&&&&&&&&minSdkVersion&8
&&&&&&&&&&&&targetSdkVersion&17
&&&&&&&&sourceSets&{
&&&&&&&&&&&&main&{
&&&&&&&&&&&&&&&&manifest.srcFile&'AndroidManifest.xml'
&&&&&&&&&&&&&&&&java.srcDirs&=&['src']
&&&&&&&&&&&&&&&&resources.srcDirs&=&['src']
&&&&&&&&&&&&&&&&aidl.srcDirs&=&['src']
&&&&&&&&&&&&&&&&renderscript.srcDirs&=&['src']
&&&&&&&&&&&&&&&&res.srcDirs&=&['res']
&&&&&&&&&&&&&&&&assets.srcDirs&=&['assets']
&&&&&&&&&&&&}
&&&&&&&&&&&&
&&&&&&&&&&&&instrumentTest.setRoot('tests')
&&&&&&&&lintOptions&{
&&&&&&&&&&&&abortOnError&false
&&&&&&&&signingConfigs&{
&&&&&&&&&&&&myConfigs&{
&&&&&&&&&&&&&&&&storeFile&file(&签名文件地址&)
&&&&&&&&&&&&&&&&keyAlias&&...&
&&&&&&&&&&&&&&&&keyPassword&&...&
&&&&&&&&&&&&&&&&storePassword&&...&
&&&&&&&&&&&&}
&&&&&&&&buildTypes&{
&&&&&&&&&&&&release&{
&&&&&&&&&&&&&&&&signingConfig&signingConfigs.myConfigs
&&&&&&&&&&&&&&&&runProguard&true
&&&&&&&&&&&&&&&&proguardFiles&getDefaultProguardFile('proguard-android.txt'),&'proguard-rules.pro'
&&&&&&&&&&&&}
&&&&&&&&productFlavors&{
&&&&&&&&&&&&qqqq&{
&&&&&&&&&&&&&&&&applicationId&=&'包名'
&&&&&&&&&&&&}
&&&&&&&&&&&&hhhhh&{
&&&&&&&&&&&&&&&&applicationId='包名'
&&&&&&&&&&&&}
&&&&task&copyNativeLibs(type:&Copy)&{
&&&&&&&&from&fileTree(dir:&'libs',&include:&'armeabi/*.so')&into&'build/lib'
&&&&tasks.withType(Compile)&{
&&&&&&&&options.encoding&=&&UTF-8&
&&&&tasks.withType(Compile)&{
&&&&&&&&compileTask&-&&compileTask.dependsOn&copyNativeLibs
&&&&clean.dependsOn&'cleanCopyNativeLibs'
&&&&tasks.withType(com.android.build.gradle.tasks.PackageApplication)&{&pkgTask&-&
&&&&&&&&pkgTask.jniFolders&=&[new&File(buildDir,&'lib')]
&&&&dependencies&{
&&&&compile&fileTree(dir:&'libs',&include:&['*.jar'])
gradle 作为构建工具,能够很方便的使用本地jar包,以下为使用的代码块。
&('libs/android-support-v4.jar')
&(dir:&'libs',&include:&'*.jar')
gradle 同时支持maven,ivy,由于ivy我没用过,所以用maven 作为例子,以下为代码块:
repositories&{
mavenCentral()
url&&file://F:/githubrepo/releases&
url&&远程库地址&
dependencies&{
compile&'com.google.android:support-v4:r13'}
android library 依赖
对于项目依赖 android library的话,就不是依赖一个jar,那么简单了,在这里需要使用gradle mulit project 机制。在过去,android library并没有一个很好的包管理方式,简单来说,在gradle出现以前,官方并没有一种用于管理android library 依赖包的方式,一般我们都是直接下载别人的android library project 源码进行集成,而对于第三方的android-maven-plugin 用的是apklib
格式。
而现在,官方终于推出一种android library的打包格式,扩展名为*.aar。前面提到,目前android gradle插件并不支持本地直接使用*.aar文件,不过,支持包管理库的引用方式,下面,我为大家说一下,怎么对android library 发布使用。
打包android library
对android library 进行打包直接在library项目下面使用gradle build&即可,然后,你就会在 build/libs 目录下看到两个*.aar文件,一个debug包用的,一个是release 下用的,看个人需求使用,这里我们用的是release 版本的 .aar
引用脚本跟前面讲的依赖库相似
dependencies&{
&&&&compile(name:&'pulltorefresh',&ext:&'aar')
最后,分享个maven库地址:和gradle版本地址:
另外,gradle文件配置部分更新:
在此添加,最新grad了配置地址为:
The dependency, mother of all dependencies
开始之前,这里有一个重要的工具可以让你处理依赖更简单方便:SDK Manager Plugin,它会自动下载和更新你的一些依赖(例如:API,support library,emulator),非常好用,尤其是当你下载了别人的代码项目时,什么也干不了,这时只需打开项目,等待下载或更新依赖,然后你可以启动应用程序了!
使用这个插件,只需要在你Project的根目录的build.gradle加上一行就可以了
dependencies {
classpath 'com.android.tools.build:gradle:1.3.0'
classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.0' //添加该行
更多该插件相关信息&
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:37551次
排名:千里之外
原创:13篇
转载:59篇
(1)(7)(10)(2)(1)(3)(7)(8)(6)(1)(4)(5)(14)(3)匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。Android Studio 中build.gradle文件的详细解析
在由Eclipse转到 Studio之后,第一个让我感到困惑的是build.gradle这个文件了,实在话,当时我并不知道这么写是几个意思。
apply plugin: 'com.android.application'
compileSdkVersion 21
buildToolsVersion &21.1.2&
defaultConfig {
applicationId &com.example.test&
minSdkVersion 17
targetSdkVersion 21
versionCode 1
versionName &1.0&
buildTypes {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
如上就是建立一个as工程生成的基本构建文件了,暂且不需要知道他底层怎么实现,至少要知道这么写是几个意思,为何要这么写,我们需要一步一步来揭穿它。
一:Gradle 是基于Groovy语言来构建的,第一点就得了解什么是Groovy语言,以及它的语法。
Groovy是一种动态语言,是从语言进化而来,可以说是Java的加强,它能运行于JVM上,具体的一些介绍可以自行谷歌了解,这里只是为了简单的看懂Groovy和基本使用。
开发环境:
Eclipse Groovy开发插件 http://dist.springsource.org/release/GRECLIPSE/e4.4 后边的e4.x要自己对照自己的eclipse版本,否则可能出现无法安装的问题,我的是4.4。
第一个Groovy程序:
右键,新建一个Groovy工程,添加一个groovy资源包(只是为了区分),然后在src下先新建一个JavaTest.java类,勾选main方法,关在方法里写下一行代码打印一个字符串 Hello groovy!
public class JavaTest { public static void main(String[] args) { System.out.println(&Hello groovy!&); } }
上面是一个很简单的Java类,运行之后将会在控制台输出Hello groovy!
然后同理,我们在groovy资源包下新建一个GroovyTest.groovy 选择新建-other-Grooovy Class
class GroovyTest {
static main(args) {
println &Hello groovy!&
右键使用Groovy运行后,也会在控制台上打印出 Hello groovy!
相比于JavaTest.java我们发现,GroovyTest.groovy。似乎和JavaTest.java长得很像,只不过是将JavaTest.java去掉了一些内容,如class的修饰符public ,打印的System.out ,参数args的类型String[]。下面我们对GroovyTest.groovy做一些改动:
class GroovyTest {
static main(args) {
System.out.println &Hello groovy!&
运行之后发现一样能输入Hello groovy!, 有意思,有意思,那我们再给args加上String[]的类型能,
class GroovyTest {
static main(String[] args) {
System.out.println.println &Hello groovy!&
发现一样能运行,并且同样输入Hello groovy! ,有趣了,是不是说我把java里面的代码都拷过来也能运行呢,这时变成这样:
public class GroovyTest {
public static void main(String[] args) {
System.out.println(&Hello groovy!&);
和你想的结果一样,他也准确无语的输出了Hello groovy!,哦,原来和我们看到的一些说明是正确的,groovy和java代码是一样的,它只不过是对java代码进行简化了。
不是说简化吗,假如我把GroovyTest类的代码简化成这样:
println &Hello groovy!&
运行后,发现居然可以输出来Hello groovy!
下面是一些说明:
Groovy类和java类一样,完全可以用标准java bean的语法定义一个Groovy类。但作为另一种语言,可以使用更Groovy的方式定义类,这样的好处是,可以少写一半以上的javabean代码。 (1)不需public修饰符 如前面所言,Groovy的默认访问修饰符就是public,如果Groovy类成员需要public修饰,则根本不用写它。 (2)不需要类型说明 同样前面也说过,Groovy也不关心变量和方法参数的具体类型。 (3)不需要getter/setter方法 在很多(如)早就可以为程序员自动产生getter/setter方法了,在Groovy中,不需要getter/setter方法--所有类成员(如果是默认的public)根本不用通过getter/setter方法引用它们(当然,如果一定要通过getter/setter方法访问成员属性,Groovy也提供了它们)。 (4)不需要构造函数 不再需要程序员声明任何构造函数,因为实际上只需要两个构造函数(1个不带参数的默认构造函数,1个只带一个map参数的--由于是map类型,通过这个参数可以构造对象时任意初始化它的成员变量)。 (5)不需要 Groovy中,方法不需要return来。 (6)不需要() Groovy中方法调用可以省略()(构造函数除外)。
语法说明(有一些为个人见解,因为本人也没有深入研究,只是为了去理解AS的build.gradle,如有错误,请大家指正):
因为groovy是动态语言,就跟js一样,Groovy对于类型的定义都用def这个关键字来声明,它在底层会自动判断当前的变量是一个什么类型:
我们在上面也看到GroovyTest.groovy文件中,只写了一个println &Hello groovy!& 也是可以正常运行的,所以以下我们都用最简化直接在文件中输入这些代码。
定义一个字符串
def aa=&Hello&
println aa
假如把打印跟定义换个位置,将会报错
println aa
def aa=&Hello&
由此看来,groovy也是由上到下来运行的,看起来像是把这些都放到main之中去运行。
//先定义再赋值
println str
定义一个整形
def num=10
println num
定义一个整形数组集合
def colum=[2,3,4,5]
println colum[0]
因为groovy已经重载了&&所以我们可以用&&来向集合加入一个值
def strArry=[&jin&,&mu&,&shui&]
strArry.add(&huo&)
strArry && &tu&
println strArry
//输出:[jin, mu, shui, huo, tu]
定义一个Map类型
def map=[key:&name&,value:&mjk&]
println map[&key&]
println map[&value&]
只要看到是 key:value都是map类型,因为key会自动转换成string,所以你可以写成def map=[&key&:&name&,&value&:&mjk&]也可以写成def map=[key:&name&,value:&mjk&]
如果想知道当前这个变量是一个什么类型可以用 .class来打印
def str=&I am string&
println str.class
输出:class java.lang.String
循环的使用:
def arry=[&a&,&b&,&c&,&d&]
for(a in arry){
定义一个方法,接收两个参数,输出它们的和
def num=10
def method(a,b){
println a+b
method num,9
当然使用method(num,9)是一样的,只是去掉了括号,参数之间用逗号隔开
在定义一个map类型的时候,一定要加[],如果不加会报错,而在方法调用时,可以不加[],如果方法调用的map参数要加[],则必须在外部加()
//打印 map值
def printMap(map){
println map[&key&]
printMap key:&name&
输出:name
//定义一个方法,打印接收到的值
def printStr(str){
println str
printStr &Hello groovy!&
定义闭包:
闭包是Groovy里面一个很重要的特性,这里要着重讲,
先看一个groovy对集合本身的实现了的一个包含闭包的方法each
def acoll = [&妈妈&, &爸爸&, &我&]
acoll.each{
println it
acoll是一个字符串的集合,这个集合里面有一个方法叫each,接收一个参数,这个参数是一个闭包,因为闭包也是一种类型,所以它也能像变量一样当参数传递给方法使用。我们这里简单的理解,闭包是一个用花括号{}括起来的代码块,这个代码块在被触发的时候调用。
上面each中的it是一个关键字,它保存了返回到这个闭包中的一个值。下面我们来用自己的方法实现这个each
//定义一个方法,这个方法接收一个集合参数跟一个闭包,当方法被调用时,遍历集合里面的值,并把值传回给闭包
def myEach(arry,block){
for(i in arry){
def arr=[&爸爸&,&妈妈&,&我&]//字符串集合
//调用myEach方法
myEach(arr,{
println it
原来流程是这样,当我们调用myEach方法时,要传入一个集合arr,和闭包。当方法,myEach在遍历集合的时候,每得到一个值 就会回调一下这个闭包并把值传给它,从这里看是不是觉得,这个闭包既像一个变量参数,又像一个方法呢。
定义一个闭包并调用它:
//因为闭包是一种类型,所以在定义的时候要用=来给它赋值,这是跟方法有本质的区别
def block={
println &调用block&
输出:调用block
定义一个闭包并传入一个参数
def block={
println &调用block&+it
block(&--并传入参数&)
输出:调用block--并传入参数
要是我们不想用it这个关键字,也是可以定义自己的关键字的,只是我们要使用-&来告诉它,是用我们自己定义的变量来接收值,而不用it
def block={param -&
println &调用block&+param
block(&--并传入参数&)
//两个参数
def block={param1,param2-&
println &调用block&+param1+param2
block(&--参数1&,&参数2&)
下面我们定义一个block,这个block是用来打印接收到的值,目的是去遍历给定的集合
def block={data-&
println &value=&+data
//定义一个方法,这个方法接收一个集合参数跟一个闭包,当方法被调用时,遍历集合里面的值,并把值传回给闭包
def myEach(arry,block){
for(i in arry){
def arr=[&爸爸&,&妈妈&,&我&]//字符串集合
//调用myEach方法
myEach(arr,block)
value=爸爸
value=妈妈
我们知道方法的括号是可以去掉的,如果上面调用方法时我们去掉括号就变成了:
//原来的是:myEach(arr,block)
myEach arr,block
而如果只是接收一个闭包的方法就可以写成:
myEach block
如果block是匿名的,那就成为:
所以我们可以知道,集合的each方法是怎么实现遍历的,当我们的这个集合已经知道了里面的值,调用each时,只需要传入一个闭包参数,就可以得到每一个值。
一般来说,如果有多个参数,而最后一个为闭包的时候,调用方法的时候习惯写成:
myEach(param1,param2,param3){
//定义一个方法,这个方法接收一个集合参数跟一个闭包,当方法被调用时,遍历集合里面的值,并把值传回给闭包
def myEach(arry,block){
for(i in arry){
def arr=[&爸爸&,&妈妈&,&我&]//字符串集合
//调用myEach方法,并传入一个集合跟一个匿名的闭包
myEach (arr){data-&
println &value=&+data
到此差不多把groovy里面的一些基本的语法说完了。下面讲一下gradle
二:gradle
Gradle是一个构建工具,感兴趣的可以去官网上了解,它的构建是基于一个一个的任务,task。我觉得把groovy弄懂了,对于gradle只是多去看一下开发指南就行,这里不再说明。
三:回到build.gradle
讲完了上面,这个时候可以把开篇的build.gradle贴到这里说了,直接在代码里面加解释:
//这一行,一看就知道调用了一个方法叫apply 传入一个map类型的参数,key是plugin ,plugin的值是&com.android.application&说明是一个android应用工程
//在gradle中有介绍把你自己的一组代码,构建做成一个plugin,如果把plugin的值改成&com.android.library&就说明这是一个库工程
apply plugin: 'com.android.application'
//android这个方法接收一个闭包,在闭包里,调用的compileSdkVersion,
buildToolsVersion等方法并给他们传值,并且还调用了defaultConfig这个方法来做一些配置,这个方法也是接收一个闭包,可以想象,通过闭包回调可以对值进行设置,当调用defaultConfig方法的时候,方法里面会先调用传入的这个闭包来初始化一些值,然后再进行别的其他操作。这也就是闭包的魅力所在。
compileSdkVersion 21
buildToolsVersion &21.1.2&
defaultConfig {
applicationId &com.example.test&
minSdkVersion 17
targetSdkVersion 21
versionCode 1
versionName &1.0&
buildTypes {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:21.0.3'
通过以上这些讲解,希望读者们能对build.gadle文件有一些认识,这样你也可以自己修改build.gadle文件来完成你自己想要的构建流程。
另外大家可以在这里找到关于Gradle一些内置的方法还有他们的功能,以及AS为android工程提供的一些方法:
http://google.github.io/android-gradle-dsl/current/

我要回帖

更多关于 build.gradle 的文章

 

随机推荐