1.基本概念

程序开发作为一种工程作业,不光是编写代码,还涉及到工程的各种管理(依赖,打包,部署,发布,各种渠道的差异管理.....).很多时候,我们反复的build,clean,签名,打包,发布,那么该过程能否像代码那样被描述出来,且能复用.例如,Android开发后期发布上线版本时,往往需要用到多渠道打包,另外可能需要针对不同(手机品牌,尺寸等各种硬件信息)的手机做一些特殊处理,此时Gradle可以用来针对不同情况单独建工程,还能通过一些变量来控制,像这样:if(isSamsung){do something} else if(isHuawei){do something}

由此,我们引入Google的官方打包工具Gradle,暂且把它看做是一个编程框架工具吧.

2.Gradle在AS中的使用

gradle通过解析build.gradle这个文件来运行

build.gradle 主要由task和一些配置组成,task之间有相互依赖关系 通过这些依赖关系和配置就能编译项目

可以通过 apply plugin 来加入一些默认的task 例如

apply plugin: 'java'

这是java的插件 他加入了许多编译java的task 如果你的目录结构正确 那么通过gradle 运行 task 就能编译java项目

编译过程

这是一个最简单的显示 hellowrold的 apk的文件结构

<img src="https://pic4.zhimg.com/3f5e405872c135aa7a9d3e79c22b1063_b.png" data-rawwidth="644" data-rawheight="502" class="origin_image zh-lightbox-thumb" width="644" data-original="https://pic4.zhimg.com/3f5e405872c135aa7a9d3e79c22b1063_r.png">

一个android项目实际上在gradle 的编译体系中属于 multi project build 每个使用gradle编译的android项目都有一个app文件夹 android项目源码就在这个文件夹下

gradle文件中放的是

<img src="https://pic3.zhimg.com/aeeab0fa2c98d604cd425420c851996e_b.png" data-rawwidth="257" data-rawheight="145" class="content_image" width="257">

一个jar包 当你的电脑中没有安装gradle 就会通过他来下载gradle 从而继续编译

build.gradle中的是

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
}
} allprojects {
repositories {
jcenter()
}
} task clean(type: Delete) {
delete rootProject.buildDir
}

他只是通过

dependencies {
classpath 'com.android.tools.build:gradle:2.1.3'
}

来描述插件的位置

gradle.properties 中是配置信息 在这里设置jvm的heapsize 什么的

settings.gradle 之前说了每个用gradle 的android 项目是一个multi project build 那么就需要指明有哪些project 这里我们就只有默认的app

<img src="https://pic2.zhimg.com/4c1a9684a03e2f882a8eb766adab0f1d_b.png" data-rawwidth="306" data-rawheight="88" class="content_image" width="306">

local.properties中配置的是sdk的位置

<img src="https://pic4.zhimg.com/b991a29c85b96736284291e235fa9deb_b.png" data-rawwidth="406" data-rawheight="107" class="content_image" width="406">

gradlew.bat 和gradlew 分别是在windows 和linux下的执行gradle 命令的程序 例如在windows下要编译apk 就 .\gradlew assemble

<img src="https://pic1.zhimg.com/642b021b1a94628861bf54554e1588d8_b.png" data-rawwidth="520" data-rawheight="163" class="origin_image zh-lightbox-thumb" width="520" data-original="https://pic1.zhimg.com/642b021b1a94628861bf54554e1588d8_r.png">

进入到app文件夹

<img src="https://pic3.zhimg.com/d9effc0ad8798f26be61da466a9fd92e_b.png" data-rawwidth="332" data-rawheight="459" class="content_image" width="332">

libs文件夹下放项目要用的jar包

src下就是正常的android 项目的源码了

build.gradle中是

// 声明是Android程序
apply plugin: 'com.android.application' android {
// 编译SDK的版本
compileSdkVersion 21
// build tools的版本
buildToolsVersion "21.1.1" defaultConfig {
// 应用的包名
applicationId "me.storm.ninegag"
minSdkVersion 14
targetSdkVersion 21
versionCode 1
versionName "1.0.0"
} // java版本
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
} buildTypes {
debug {
// debug模式
} release {
// 是否进行混淆
minifyEnabled false
// 混淆文件的位置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
} // 移除lint检查的error
lintOptions {
abortOnError false
}
} dependencies {
// 编译libs目录下的所有jar
compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:support-v4:21.0.2'
compile 'com.etsy.android.grid:library:1.0.5'
compile 'com.alexvasilkov:foldable-layout:1.0.1'
// 编译extras目录下的ShimmerAndroid模块
compile project(':extras:ShimmerAndroid')
}

这里需要说明几点:

  • buildToolsVersion这个需要本地安装该版本才行,很多人导入新的第三方库,失败的原因之一是build version的版本不对,这个可以手动更改成你本地已有的版本或者打开 SDK Manager 去下载对应版本。

  • applicationId代表应用的包名。

  • android 5.0开始默认安装jdk1.7才能编译.

  • proguardFiles,前一部分表示系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,目录在 **<sdk目录>/tools/proguard/proguard-android.txt** , 后一部分是自定义的混淆文件,目录就在 **app/proguard-rules.txt** ,具体混淆的语法暂且不去管它。最终混淆的结果是这两部分文件共同作用的。

  • compile project(‘:extras:ShimmerAndroid’)这一行是因为项目中存在其他Module, 可以理解成Android Library,由于Gradle的普及以及远程仓库的完善,这种依赖渐渐的会变得非常不常见,但是你需要知道有这种依赖的。

  • 以上文件里的内容只是基本配置,其实还有很多自定义部分,如自动打包debug,release,beta等环境,签名,多渠道打包等,后续有时间的话会进一步深入。

3.小结一下

多个工程在一起的话,要注意分清哪些是应用工程,哪些是依赖工程,各个工程的build.gradle里要统一gradle以及插件版本,像这样def gradleVersion = System.env.ANDROID_TOOL_BUILD_GRADLE != null ? System.env.ANDROID_TOOL_BUILD_GRADLE : '1+';以前,一个项目被创建以后,基本不会再去动这build.gradle了,一方面不太理解里面具体的含义懂了怕出错,另一方面没有这方面的需求就不会主动去了解这个东西.以上只是Gradle作为工具的基本用途,然而它的作用域远不止于此,后续会继续深入的了解和学习.

Gradle在Android中的基本使用的更多相关文章

  1. Gradle在Android中的简单使用

    Gradle在Android中简单的使用 还望支持个人博客站:http://www.enjoytoday.cn Android Studio 使用gradle进行工程构建,为了更好的了解整个andro ...

  2. Groovy与Gradle在Android中的应用

    大家都知道, Android Studio 的编译构建,是基于Gradle的, 而Gradle又是基于Groovy, Groovy又是基于Java的 Android Studio 的gradle 本身 ...

  3. Gradle 实现 Android 多渠道定制化打包

    Gradle 实现 Android 多渠道定制化打包 版权声明:本文为博主原创文章,未经博主允许不得转载. 最近在项目中遇到需要实现 Apk 多渠道.定制化打包, Google .百度查找了一些资料, ...

  4. 解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题

    解决Android中No resource found that matches android:TextAppearance.Material.Widget.Button.Inverse问题http ...

  5. CocosCreator反射在Android中的使用

    CocosCreator反射在Android中的使用 新建一个CocosCreator项目,然后点击构建 构建完成之后,即可用AndroidStudio打开构建的项目 使用AndroidStudio打 ...

  6. 在Android中使用Java 8的lambda表达式

    作为一名Java开发者,或许你时常因为缺乏闭包而产生许多的困扰.幸运的是:Java's 8th version introduced lambda functions给我们带来了好消息;然而,这咩有什 ...

  7. [转]使用Gradle发布Android开源项目到JCenter

      转自:http://blog.csdn.net/maosidiaoxian/article/details/43148643 使用Gradle发布Android开源项目到JCenter 分类: G ...

  8. 深入理解gradle编译-Android基础篇

    深入理解gradle编译-Android基础篇 导读 Gradle基于Groovy的特定领域语言(DSL)编写的一种自动化建构工具,Groovy作为一种高级语言由Java代码实现,本文将对Gradle ...

  9. 用Gradle 构建android程序

    前言 android gradle 的插件终于把混淆代码的task集成进去了,加上最近,android studio 用的是gradle 来构建项目, 下定决心把android gralde 构建项目 ...

随机推荐

  1. 转:Awesome Vulnerability Research

    转:https://github.com/re-pronin/Awesome-Vulnerability-Research Awesome Vulnerability Research 

  2. HDU 6070 Dirt Ratio(线段树)

    Dirt Ratio Time Limit: 18000/9000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Tot ...

  3. Linux基础系列-Day3

    Vim文本编辑器 •Linux设计的重要原则是信息存储在基于文本的文件中.  注:Linux“一切皆文件”是指包含文本文件和用户不可读的二进制文件(如block设备文件) •文本文件:无格式文件,作用 ...

  4. SqlHelper——只因为在人群中多看了你一眼

    对SQLHelper,还是有一点陌生的,但是大多数人都在使用,我就有一种想了解并使用的意愿,于是查了很多资料,发现一片不错的博客,放在下面,作为自己或读者使用的材料. 一.SqlHelper 出场 不 ...

  5. 「NOI2018」屠龙勇士

    「NOI2018」屠龙勇士 题目描述 小\(D\)最近在网上发现了一款小游戏.游戏的规则如下: 游戏的目标是按照编号\(1-n\)顺序杀掉\(n\) 条巨龙,每条巨龙拥有一个初始的生命 值ai .同时 ...

  6. hdu 1531 king(差分约束)

    King Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  7. ARC 080 - C 4-adjacent

    题面在这里! 把每个数替换成它在2上的指数,然后发现0只能和>=2的相邻,所以手玩一下就好啦. #include<bits/stdc++.h> #define ll long lon ...

  8. 【数形结合】Erratic Expansion

    [UVa12627]Erratic Expansion 算法入门经典第8章8-12(P245) 题目大意:起初有一个红球,每一次红球会分成三红一蓝,蓝球会分成四蓝(如图顺序),问K时的时候A~B行中有 ...

  9. BZOJ 3524 [Poi2014]Couriers(二分+蒙特卡罗)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=3524 [题目大意] 给一个长度为n的序列a.1≤a[i]≤n. m组询问,每次询问一个 ...

  10. 【二分】【线段树】hdu6070 Dirt Ratio

    size(l,r)表示区间l,r权值的种类数,让你求min{size(l,r)/(r-l+1)}(1<=l<=r<=n). last[r]表示a[r]上一次出现的位置, 就是二分验证 ...