简单理解Gradle,Gradle是什么,一分钟入门Gradle

Gradle构建脚本使用DSL(Domain Specific Language)来描述构建逻辑,使用的语言是Groovy。想了解Android Studio工程的Gradle构建系统,可以先从Project的settings.gradleProject的build.gradleModule的build.gradlegradle/wrapper这些文件分析起。

1. Project的settings.gradle

这个文件描述的是Project里包含哪些module。

include ‘:app‘, ‘:lib‘

2. Project的build.gradle

这个文件描述的是Gradle构建所引用的仓库和最基础的依赖。

buildscript {
   repositories {  //支持的仓库包括jcenter, mavenCentral和Ivy
       jcenter()
   }
   dependencies {  //基础依赖
       classpath ‘com.android.tools.build:gradle:1.0.1‘

    // NOTE: Do not place your application dependencies here: they belong
    // in the individual module build.gradle files
   }
}

allprojects {
   repositories {
       jcenter()
   }
}

3. Module的build.gradle

这个文件描述的是主Module的一些配置。

apply plugin: ‘com.android.application’ //添加用于Gradle构建过程的Android插件

android {   //所有android相关的构建参数
    compileSdkVersion 19  //编译版本号
    buildToolsVersion “19.0.0”//构建工具版本号。需要大于或等于compileSdkVersion和targetSdkVersion

    defaultConfig { //AndroidManifest.xml相关参数配置的入口,允许覆盖Manifest文件的配置
        applicationId “com.example.my.app” //不同package的唯一识别码,仅存在于build.grade文件中
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {//构建和打包方式,默认含debug和release2种,其中debug包使用debug key签名,release包默认无签名
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(‘proguard-android.txt‘), ‘proguard-rules.pro’//文件混淆。其中proguard-android.txt为默认的混淆配置,proguard-rules.pro为模块额外的混淆配置

        }
    }
}

dependencies {  //模块的依赖库
    compile project(":lib”) //library module依赖
    compile ‘com.android.support:appcompat-v7:19.0.1’//远程库依赖,格式为group:name:version
    compile fileTree(dir: ‘libs‘, include: [‘*.jar’]) //本地库依赖,包含app/libs目录下的所有jar文件。因此当module想引用某个jar时,只需将jar拷贝到<moduleName>/libs即可
}

applicationId也可以用于不同product flavour / build type使用不同applicationId的情况:

productFlavors {
    pro {
        applicationId = "com.example.my.pkg.pro"
    }
    free {
        applicationId = "com.example.my.pkg.free"
    }
}

buildTypes {
    debug {
        applicationIdSuffix ".debug” //applicationId后缀
    }
}
....

4. Gradle Wrapper

Gradle Wrapper字面理解即Gradle包装,Android Studio使用Gradle Wrapper来完全嵌入Gradle的Android插件。我理解的是Android Studio不能直接使用Gradle的Android插件,需要再包一层引用。

gradle/wrapper属于Project级别文件(NOTICE:需要添加到版本控制系统)。包含如下几个文件:

  1. gradle-wrapper.jar文件
  2. gradle-wrapper.properties文件
  3. Windows平台下的shell脚本(可选)
  4. Mac/Linux平台下的shell脚本(可选)

Android Studio读取properties文件的配置,且运行当前目录下的wrapper文件。

gradle-wrapper.properties文件内容如下所示,若想使用指定的gradle,修改distributionUrl即可。

distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-2.4-all.zip

关于wrapper下的shell脚本,仅在命令行或非Android Studio环境下有效,Android Studio下不行。

5. 关于Build Variants

Build Variants我理解的是,基于同一份代码所构建出的不同的APK。通常基于productFlavorsbuildTypes两个维度构建,当然也存在其他的维度(如CPU/ABI,可根据需要定义)。

若productFlavors含baidu和wandoujia两种,buildTypes含release和debug两种,则可构建出4个不同的包,分别为 baiduRelease, baiduDebug, wandoujiaRelease, wandoujiaDebug。

不同的包,若存在差异化功能,可能会出现形如这种风格的目录src/main/src/<buildType>/src/<productFlavor>/。最终打包merge时优先级由高到低为src/<buildType>/ -> src/<productFlavor>/ -> src/main/ -> libraries/dependencies的src,并且高优先级会覆盖低优先级内容。

6. Build Tasks

Android Studio构建系统定义了一系列构建Task,顶级Task包含:assemble, check, build, clean。

关于Task更详细介绍可以研究下Gradle官方文档。

7. 满足不同构建包的差异化需求

这部分内容也是基于Build Variants。

通常做法为:

  1. build.gradle文件定义不同渠道的product flavors
  2. 对于存在差异化的product flavor,创建对应的source目录src/<productFlavor>
  3. src/<productFlavor>下增加差异化代码
  4. 以上操作同样适用于buildTypes,如果有需要的话。实际开发中较少涉及,通常只存在productFlavors下加不同渠道的情况

假设baidu手机助手渠道包存在一些差异化功能:有2个页面,FirstActivity跳转到SecondActivity,其中FirstActivity相同,SecondActivity功能不同。

(1)首先在build.grade文件的productFlavors中添加baidu{},代表百度手机助手渠道包。

...
android {
    ...
    defaultConfig { ... }
    signingConfigs { ... }
    buildTypes { ... }
    productFlavors {
        baidu {
        }
        full {
        }
    }
}
...

(2)在app/src目录下添加baidu包,baidu目录结构和main保持一致,根据实际情况只添加差异化部分。此处在baidu包下添加SecondActivity.java文件并自定义实现即可。

(3)由于baidu和main目录下的SecondActivity的package名称相同,因此在main的FirstActivity启动即可。

本文原文发自 某学姐, 向原创致敬

时间: 2025-01-11 00:33:55

简单理解Gradle,Gradle是什么,一分钟入门Gradle的相关文章

Android Gradle编译学习日记之一(搭建 Gradle 环境以及编译 Android 应用)

大家如果喜欢我的博客,请关注一下我的微博,请点击这里(http://weibo.com/kifile),谢谢 转载请标明出处(http://blog.csdn.net/kifile),再次感谢 Google 在最近正式推出了 Android Studio 1.0版本,开发者首页的默认开发工具也已经更改成了 Android Studio,我想我们是时候全面转型到 Android Studio 开发了. 其实抛开界面因素,Android Studio 与 Eclipse ADT 构建 Android

[干货分享]git的简单理解及基础操作命令

前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制>这本书(偏理论,内容完善,很不错),针对所学内容建了git仓库测试,且写了不少git操作命令的笔记,做个分享,有错误的地方各位大大也给提出,好做修改~ Git是一款免费.开源的.用Linux内核开发的分布式版本控制系统. git和svn有什么区别呢? git采用分布式版本库管理,而svn采用集中式版本库管理. 集中式版本库管理需要有一台存放版本库的服务器,

解决Gradle报错找不到org.gradle.api.internal.project.ProjectInternal.getPluginManager()方法问题

因为本地的AndroidStudio很久没用了,所以想要研究下github上的某个代码的时候,还得重新配下环境 打开了几个项目,都是提示如下错误 Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.getPluginManager()Lorg/gradle/api/internal/plugins/PluginManagerInternal;'. Possible causes for this

php类的封装、继承和多态的简单理解

.面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象: 我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象 一.封装性  封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作.  php提供了三种访问控制修饰符  public 表示全局,本类内部,类外部,子类都可以访问  protected 表示受保护的,只有本类或子类可以访问  pr

简单理解计算机通信

简单理解计算机通信 写在前面: 在计算机刚出现的时候,只能在本机进行一些运算处理,想将一台计算机中的数据转移到另一台计算机中,需要通过外部存储介质来传输,例如磁带.软盘.而网络技术的出现,使得计算机间可以通过一些传输介质(网线.光纤等),实现快速的数据传输和信息交互.如今,网络已无处不在,那么,计算机之间究竟是如何通信的呢?下面会通过一些基础的网络知识来简单理解计算机之间的通信过程. 网络通信模型: 网络通信模型是一种概念模型和框架,旨在使各种计算机在世界范围内互连为网络.其中有OSI七层模型和

Http协议与TCP协议简单理解

在C#编写代码,很多时候会遇到Http协议或者TCP协议,这里做一个简单的理解. TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通过TCP建立起一个到服务器的连接通道,当本次请求需要的数据完毕后,Http会立即将TCP连接断开,这个过程是很短的.所以Http连接是一种短连接,是一种无状态的连接.所谓的无状态,是指浏览器每次向服务器发起请求的时候,

回溯法之八皇后问题简单理解

回溯法,简单理解就是有源可溯.基本思想要借鉴穷举法,但是它不是一味地穷举,当发现某一步不符合条件时,这一步后面的穷举操作就不进行了(俗称“剪枝”),我自己把它叫做动态穷举法.假设第一个步骤可行,那么执行第二个步骤,第三个......如果其中第三个步骤不行,那么我们再回过来(回溯),第二个步骤换一种方法尝试,然后再重新第三个步骤,第四个......直到完成任务要求为止. 这里,以八皇后问题为例.试图把回溯法讲清楚. 注意:递归应该是一种算法结构,回溯法是一种算法思想. 何为八皇后问题? (百度百科

Javascript闭包简单理解

提到闭包,想必大家都早有耳闻,下面说下我的简单理解.说实话平时工作中实际手动写闭包的场景并不多,但是项目中用到的第三方框架和组件或多或少用到了闭包.所以,了解闭包是非常必要的.呵呵... 一.什么是闭包简而言之,就是能够读取其他函数内部变量的函数.由于JS变量作用域的特性,外部不能访问内部变量,内部可以外部变量. 二.使用场景1. 实现私有成员.2. 保护命名空间,避免污染全局变量.3. 缓存变量. 先看一个封装的例子: var person = function () { // 变量作用域为函

对数据类型封装和数据抽象的简单理解

请特别关注程序设计技术,而不是各种语言特征. --<C++程序设计语言> Bjarne Stroustrup 本文是<C++程序设计语言>(Bjarne Stroustrup )的第二章的读书笔记,例子来源于这本书的第二章. 在程序设计之中,我们倾向于将数据结构(也可以说是数据类型)以及一组对其操作的相关过程组织在一起,在逻辑上可以称将其为模块.此时程序分为一些模块,模块包括一组对数据的操作,数据隐藏于模块之中.以下以栈的设计为例,使用C和C++进行设计,简单理解模块化设计中的数据