gradle基础讲解系列


gradle基础讲解系列

##一.目标

  1. 了解Android编译过程
  2. 了解gradle的原理和组成
  3. gradle如何管理Android构建过程

##二.Android的编译流程

在这里插入图片描述

步骤中提到的工具如下表:

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LqBwjQl7-1602670806526)(http://7xvzr8.com1.z0.glb.clouddn.com/QQ20170513-0@2x.png)]

总结为:编译–>DEX–>打包–>签名和对齐
理论上,只要知道android app的编译过程,我们大可以自己写一份用gradle编译app的插件,插件内将将整个流程用Task的依赖串联起来。现在我们看看gradle是怎么做的。

这个流程还是挺复杂的,那为什么我们没有感知到呢?

##三.gradle工作原理

###1.什么是gradle
Gradle是一个自动化构建工具,采用Groovy的Domain Specific Language(领域特定语言)来描述和控制构建逻辑.基于Intellij IDEA社区版本开发的Android Studio天生支持Gradle构建程序.
简单的说,Gradle是一个构建工具,它是用来帮助我们构建app的,构建包括编译、打包等过程。我们可以为Gradle指定构建规则,然后它就会根据我们的“命令”自动为我们构建app。Android Studio中默认就使用Gradle来完成应用的构建。有些同学可能会有疑问:”我用AS不记得给Gradle指定过什么构建规则呀,最后不还是能搞出来个apk。“ 实际上,app的构建过程是大同小异的,有一些过程是”通用“的,也就是每个app的构建都要经历一些公共步骤。因此,在我们在创建工程时,Android Studio自动帮我们生成了一些通用构建规则,很多时候我们甚至完全不用修改这些规则就能完成我们app的构建。
有些时候,我们会有一些个性化的构建需求,比如我们引入了第三方库,或者我们想要在通用构建过程中做一些其他的事情,这时我们就要自己在系统默认构建规则上做一些修改。这时候我们就要自己向Gradle”下命令“了,这时候我们就需要用Gradle能听懂的话了,也就是Groovy。Groovy是一种基于JVM的动态语言,关于它的具体介绍,感兴趣的同学可以文末参考”延伸阅读“部分给出的链接。
我们在开头处提到“Gradle是一种构建工具”。实际上,当我们想要更灵活的构建过程时,Gradle就成为了一个编程框架——我们可以通过编程让构建过程按我们的意愿进行。也就是说,当我们把Gradle作为构建工具使用时,我们只需要掌握它的配置脚本的基本写法就OK了;而当我们需要对构建流程进行高度定制时,就务必要掌握Groovy等相关知识了。

###2.Gradle的基本组成
Project与task

  1. Project与Task
    在Gradle中,每一个待构建的工程是一个Project,构建一个Project需要执行一系列Task,比如编译、打包这些构建过程的子过程都对应着一个Task。具体来说,一个apk文件的构建包含以下Task:Java源码编译、资源文件编译、Lint检查、打包以生成最终的apk文件等等。

2.插件
task容器,让task有序执行
Gradle只是提供了构建项目的一个框架,所有有用的特性都由Gradle插件提供,一个Gradle插件能够:
向项目中添加新任务.
为新加入的任务提供默认配置,这个默认配置会在项目中注入新的约定(如源文件位置).
项目代表要被构建的组件或整个项目,它为任务提供了执行的上下文,而插件用来向项目中添加属性和任务.一个任务可以读取和设置项目的属性以完成特定的操作.

插件的核心工作有两个:一是定义Task;而是执行Task。也就是说,我们想让Gradle能正常工作,完成整个构建流程中的一系列Task的执行,必须导入合适的插件,这些插件中定义了构建Project中的一系列Task,并且负责执行相应的Task。

##四.Gradle生命周期(Gradle的构建脚本步骤)

这里写图片描述

这里写图片描述

  1. Initialization -初始化阶段
  2. Configuration -配置阶段
  3. Execution -执行阶段

Initialization - 初始化阶段
初始化阶段会执行项目根目录下的settings.gradle文件,来分析哪些项目参与构建。

Configuration - 配置阶段
配置阶段会去加载所有参与构建的项目的build.gradle文件,会将每个build.gradle文件实例化为一个Gradle的project对象。然后分析project之间的依赖关系,下载依赖文件,分析project下的task之间的依赖关系。
他会先执行根目录下的build.gradle文件

Execution - 执行阶段
执行阶段来执行具体的task。
task是Gradle中的最小执行单元,我们所有的构建,编译,打包,debug,test等都是执行了某一个task,一个project可以有多个task,task之间可以互相依赖。例如我有两个task,taskA和taskB,指定taskA依赖taskB,然后执行taskA,这时会先去执行taskB,taskB执行完毕后在执行taskA。

##五.Gradle scripts

这里写图片描述

###settings.gradle
Gradle设置文件(gradle.settings)对于只有一个项目的构建而言是可选的,如果我们的构建中包含多于一个项目,那么它就是必须的.因为它描述了哪一个项目参与构建.
每一个多项目构建都必须在项目结构的根目录中加入一个设置文件gradle.settings.

###build.gradle
根目录下的build.gradle
Project层级的build.gradle描述的是作用于所有Module的配置,包括gradle版本等。

Module层级的build.gradle
每个Module下都有一个作用于该Module的build.gradle文件,描述了该Module相关的配置。这些配置主要包括:BuildTypes,ProductFlavors,Dependency,SigningSettings等。

###几个名字的含义比较:
1 minSdkVersion
minSdkVersion最好理解。就是app所能兼容的最低版本。如果某个系统api支持的最低版本高于minSdkVersion,在使用整个api的时候,就需要做相应的处理。
2 compileSdkVersion
compileSdkVersion是app编译时所用的Sdk版本。通俗的将就是代码在编译阶段所调用的系统api的版本。
3 targetSdkVersion
targetSdkVersion是经过验证的,app能够稳定运行的版本。整个参数是最容易被人忽视和误解的参数。
一般情况下推荐 minSdkVersion <= targetSdkVersion = compileSdkVersion

###gralde.proterties

Gradle属性文件(gradle.properties)用来配置构建属性.
gradle.properties是gradle的配置文件,build.gradle通过读取这个文件配置的参数来进行相应的构建.

###Gradle wrapper
Gradle Wrapper可以理解为是对Gradle的一层封装,使用它可以在没有安装Gradle的系统上使用Gradle来构建项目.

如何做到的呢?

Gradle Wrapper通过两个脚本文件实现这一功能,一个是用于windows的批处理文件gradlew.bat,一个是用于Linux和Uninx的Shell脚本文件gradlew.
使用Android Studio创建的项目默认为我们生成了Gradle Wrapper的文件结构.

在gradle/wrapper目录下有两个文件: gradle-wrapper.jar和gradle-wrapper.properties
gralde-wrapper.properties文件中声明了gradle的版本和下载地址.

在第一次使用gradlew进行项目构建的时候,Gradle Wrapper会自动下载gralde-wrapper.properties指定的gradle版本.

一般这个文件是不用动的,除非你想手动指定gradle的版本,可以修攺distributionUrl.

###proguard-rules.pro

##更高级的gradle知识

待续…


#制作一个aar包
##一.aar
aar是在Androidstudio中开始引入的一个全新的文件类型,它本质上是一个压缩包。里面包含了jar文件和Android相关的资源。

##二.aar上传到maven仓库
在android studio中使用maven私有仓库和并上传子项目到仓库中
1.上传脚本
apply plugin: ‘maven’

def MAVEN_LOCAL_PATH = 'http://192.168.200.92:8081/nexus/content/repositories/zyx/'
  def ARTIFACT_ID = 'ext-map-baidu'
  def VERSION_NAME = '1.0.0'
  def GROUP_ID = 'com.anjubao.code'
  def ACCOUNT = 'admin'
  def PASSWORD = 'admin123'

  //脚本:将Lib打成aar包上传至maven私有库
  uploadArchives {
      repositories {
        mavenDeployer {
            repository(url:MAVEN_LOCAL_PATH ){
                authentication(userName: ACCOUNT, password: PASSWORD)}
            pom.project {
                groupId GROUP_ID
                artifactId ARTIFACT_ID
                version VERSION_NAME
                packaging 'aar'
          }
        }
      }
  }

apply plugin: ‘maven’:添加maven插件
def XXX XXX:定义字符串常量
authentication(userName: ACCOUNT, password: PASSWORD)}:设置Nenux的账户和密码
设置OMP:
pom.project {
groupId GROUP_ID
artifactId ARTIFACT_ID
version VERSION_NAME
packaging ‘aar’

2.执行脚本
写好脚本后,使用terminal进入Module根目录,
使用gradle + task_name的方式 如: gradle uploadArchives 成功后可在web上看见生成的文件:直接运行命令:
gradle uploadArchives
即成功打包上传。

3.引用aar包,远程依赖
如何将原来引用了子项目的项目更改为引用仓库中的aar包?
打开需要更改的项目的build.gradle文件。
将compile project(’:lib-common’)更改为compile ‘com.anjubao.code:lib-common:1.0.0’

Maven仓库的引用方法(本地仓库与远程仓库方法一致)
格式 :
pom.groupId : pom.artifactId : pom.version @aar

##三.优点
明显降低项目的构建时间
但是不容易debug

##参考资料:
maven私服aar包的打包、上传和引用
http://www.jianshu.com/p/d4b8ff8e2cb9

Androidstudio 打包aar 无法引用类库中 dependencies 远程依赖
http://blog.csdn.net/u011840744/article/details/50608677

《Android高级进阶》

《Androidstudio实战指南》

Android Studio引用第三方项目,Jar包,AAR包总结
http://blog.csdn.net/aiynmimi/article/details/52293282

组件化开发中引用aar包引起的jar包冲突问题
http://blog.csdn.net/u013136708/article/details/70257742

Android studio jar冲突 文件冲突 aar引用相同的文件 引用相同的jar包 重复导入相同依赖包
http://blog.csdn.net/WX_JIN/article/details/50853609


  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值