1 配置文件

1.1 gradle属性文件

1.1.1 gradle.properties

对项目范围内的gradle进行配置,比如设置cache。

1.1.2 local.properties

设置sdk的路径。

1.2 编译文件

1.2.1 顶级编译文件

build.gradle

1.2.2 模块级编译文件

build.gradle

1.2.2.2 关于apply

是为gradle指定一个plugin,如果是android项目,那么就是为gradle指定androud plugin,plugin:'com.android.application',gradle就知道这是一个android项目。

还有一个gradle的plugin,android library plugin,plugin:'com.android.library'。

1.2.2.3 关于android

android相关的编译选项放在这里。

1.2.2.4 关于task

task是构建中的原子性操作,该task一旦触发就会被执行。

可以在artifacts中触发task的执行。

android相关的task?这个地方需要再补充一下。

1.2.2.5 关于artifacts

显式指定构建生成的目标文件。

1.3 gradle设置文件

settings.gradle,设置编译时应该包含的模块。

可见,最重要的配置文件是编译文件。

2 编译文件的语法

2.1 buildscript

buildscript代码块中声明的是gradle脚本自己需要的资源,可以声明的资源包括依赖项、第三方插件和maven库地址。

buildscript中的dependencies的依赖用classpath,

2.2 allprojects

allprojects代码块中声明的是所有的projects的配置。比如repositories就是配置给所有的模块都可以使用的仓库。

3 gradle的仓库

gradle使用的是maven和ant的仓库,准确来说,主要使用的是maven的仓库。如果设置了多个库,gradle去查找依赖的时候,是按照配置的库的顺序依次查找的。

一般有三个maven库jcenter(),mavenCentral()和google()。

4 模块级编译文件中的依赖

4.1 依赖项配置

4.1.1 implementation

可以在编译时隐藏自己的依赖。

app依赖于libary1, library1依赖于library2,如果他们都用的是implementation的话,那么app中不能直接使用library2中的类,因为library1隐藏了自己的依赖library2,使得其对app不可见。这样,修改了library2,不会重新编译app。

4.1.2 api

编译时不能隐藏自己的依赖。

4.1.3 compileOnly

只编译时有效,不参与打包。比如com.android.support。

4.1.4 runtimeOnly

只生成apk时参与打包,不参与编译。

4.2 依赖项类型

4.2.1 本地库模块依赖项

implementation project(':library')

这个地方的project是settings.gradle中include的模块名。

4.2.2 本地二进制文件依赖项

implementation fileTree(dir:'libs', include:['*.jar','*.aar'])

该模块的libs目录下的jar二进制文件和aar二进制文件。

4.2.3 远程二进制文件依赖项

implementation 'com.android.support:design:28.0.0'

这是implementation group:'com.android.support', name:'design', version:'28.0.0'的缩写。

5 android相关的编译选项

5.1 compileSdkVersion

指定android api level要小于或者等于该版本,这个指的是在编写代码时使用的android sdk的api,如果高于该设置,那么编译是通过不了的,这样就能够保证targetSdkVersion了。

5.2 defaultConfig

指定applicationId,versionCode和versionName,这些在app store中都是唯一的。

还有minSdkVersion和targetSdkVersion。

如果手机的sdk版本小于minSdkVersion的话,app是安装不上去的。因为,app中可能会使用高版本的新的api,这样导致app中的api在小版本的手机中没有,故跑不起来。

maxSdkVersion不再检测。

关于targetSdkVersion

描述:目标SdkVersion

作用:标识在指定的SdkVersion已做充分测试,Android系统不会针对此版本进行兼容处理

如果targetSdkVersion=16的app跑在SdkVersion=16的手机上,则Android系统不会做任何兼容处理,从而提高了性能

如果targetSdkVersion=16的app跑在SdkVersion=17的手机上,则Android系统需要做兼容处理以保障app仍然以16的特性运行

如果targetSdkVersion=16的app跑在SdkVersion=15的手机上,可能会出现错误,所以至少要保证app在minSdkVersion的手机上测试通过

定义位置:AndroidManifest.xml

默认值:minSdkVersion

检测时机:运行时

app的向前兼容和向后兼容

minSdkVersion保证了app的向前兼容,一些新的app可以跑在老的机器上;进行sdk版本判断,调用老的api即可。

targetSdkVersion保证了app的向后兼容,一些老的app可以跑在新的机器上,它们的作用是不同的。

使用模拟器来进行测试从而降低成本。

5.3 buildTypes

有两个build type,一个是debug,一个是release,比如在release中混淆方案。

minifyEnabled,打开混淆;

zipAlignEnabled,优化apk。

5.4 dataBinding

即数据绑定。

6 关于gradle本身

6.1 com.android.tools.build:gradle:3.4.2

这个是用于编译android应用的gradle plugin。

6.2 android studio的版本、gradle的版本和android plugin的版本适配

一般已经弄好的项目的额gradle的版本集合android plugin的版本是适配的,可能和android studio的版本不适配。

7 关于android studio

下载android studio之后,需要下载anroid sdk和command line tools,这样就可以构建library和apk了。

android gradle项目剖析的更多相关文章

  1. Android Studio 第一次新建Android Gradle项目超级慢的解决方案

    大家有什么问题,欢迎问我! 注:Android Studio在第一次新建一个Gradle项目时需要下载Gradle,所以启动很慢(Gradle-bin大约三十几兆),所以我们应该事先帮他下载好. 首先 ...

  2. Android Gradle项目Hotfix热修复技术的接入

    https://github.com/AItsuki/HotFix Issues MAC系统无法自动打包补丁,原因可能是路径分隔符问题 使用谷歌multidex分包后无法注入代码(开启multidex ...

  3. Android Gradle基于参数化配置实现差异化构建

    一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...

  4. Android studio 使用Gradle发布Android开源项目到JCenter 总结

    1.注册账号 先到https://bintray.com注册一个账号.  这个网站支持 github 账户直接登录的 2.获取  bintray.user  和 bintray.apikey      ...

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

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

  6. 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...

  7. 【转】第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建

    原文网址:http://www.cnblogs.com/smyhvae/p/4456420.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...

  8. Android官方技术文档翻译——迁移 Gradle 项目到1.0.0 版本

    本文译自Android官方技术文档<Migrating Gradle Projects to version 1.0.0>,原文地址:http://tools.android.com/te ...

  9. Android Studio项目Gradle内网配置

    由于内网无法连接到外部网络,在使用Gradle编译Android Studio项目时就会面临一些问题: 1.Gradle安装文件无法下载 2.Gradle Android插件无法下载 3.项目依赖文件 ...

随机推荐

  1. python导入不同目录下的自定义模块

    一.代码目录结构 自定义的模块在Common包下,Study文件下SelectionSort.py文件导入自定义的模块 二.源码 2.1:SelectionSort.py文件   python导包默认 ...

  2. 1.端口被占用问题:Embedded servlet container failed to start. Port 8097 was already in use.

    1.端口被占用问题:Embedded servlet container failed to start. Port 8097 was already in use.netstat -anonetst ...

  3. 解决"'pip' 不是内部或外部命令,也不是可运行的程序或批处理文件"的问题

    大家好,我是Connor,今天我为大家带来解决CMD命令无法直接运行 '点子' 进行安装库的问题. 今天本来想安装库来着,但是苦于pycharm的设置里不知道出了什么原因,无奈只能使用PIP功能来安装 ...

  4. Selenium 详解xpath定位

    xpath定位在业界被戏称为元素定位的"屠龙宝刀",宝刀在手,武林我有.现在我们就来详解xpath定位方法. 一.xpath通过元素属性定位 xpath可以通过元素的属性来定位,如 ...

  5. sqli-labs(36)

    0X01发现又是‘’被过滤了 ?id=%df%%20and%=%23 错误 ?id=1%df%27%20and%201=1%23 正确   存在注入 0X01爆数据库 ?id=-%df%%20unio ...

  6. sqli-labs(29)

    0X01 题目说有waf 那我们先来试探一波 ?id=-' union select 1,database(),3%23 成功了 那么他的WAF过滤了什么呐? 这是index.php的源码并没有过滤什 ...

  7. js,正则实现金钱格式化

    https://blog.csdn.net/qq_36279445/article/details/78889305 https://github.com/jawil/blog/issues/30

  8. How jQuery UI Works

    https://learn.jquery.com/jquery-ui/how-jquery-ui-works/ jQuery UI contains many widgets that maintai ...

  9. QbztDay1游记

    qbzt爆零记Day1 T1 我们为什么不把这个机器人直接报废掉呢? 素质题目 其实这就是个膜你模拟 坑点: 如果走到了水池并掉进去了,位置并不是水池前面的格子,而是执行这条指令之前的位置 来自老师的 ...

  10. PADS LAYOUT的一般流程

    1.概述    本文档的目的在于说明使用PADS的印制板设计软件PowerPCB进行印制板设计的流程和一些注意事项,为一个工作组的设计人员提供设计规 范,方便设计人员之间进行交流和相互检查. 2.设计 ...