android gradle项目剖析
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项目剖析的更多相关文章
- Android Studio 第一次新建Android Gradle项目超级慢的解决方案
大家有什么问题,欢迎问我! 注:Android Studio在第一次新建一个Gradle项目时需要下载Gradle,所以启动很慢(Gradle-bin大约三十几兆),所以我们应该事先帮他下载好. 首先 ...
- Android Gradle项目Hotfix热修复技术的接入
https://github.com/AItsuki/HotFix Issues MAC系统无法自动打包补丁,原因可能是路径分隔符问题 使用谷歌multidex分包后无法注入代码(开启multidex ...
- Android Gradle基于参数化配置实现差异化构建
一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...
- Android studio 使用Gradle发布Android开源项目到JCenter 总结
1.注册账号 先到https://bintray.com注册一个账号. 这个网站支持 github 账户直接登录的 2.获取 bintray.user 和 bintray.apikey ...
- [转]使用Gradle发布Android开源项目到JCenter
转自:http://blog.csdn.net/maosidiaoxian/article/details/43148643 使用Gradle发布Android开源项目到JCenter 分类: G ...
- 第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
[声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/ ...
- 【转】第一次使用Android Studio时你应该知道的一切配置(三):gradle项目构建
原文网址:http://www.cnblogs.com/smyhvae/p/4456420.html [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.c ...
- Android官方技术文档翻译——迁移 Gradle 项目到1.0.0 版本
本文译自Android官方技术文档<Migrating Gradle Projects to version 1.0.0>,原文地址:http://tools.android.com/te ...
- Android Studio项目Gradle内网配置
由于内网无法连接到外部网络,在使用Gradle编译Android Studio项目时就会面临一些问题: 1.Gradle安装文件无法下载 2.Gradle Android插件无法下载 3.项目依赖文件 ...
随机推荐
- maven打包指定main入口插件
<!--打包插件 --><plugin> <groupId>org.apache.maven.plugins</groupId> <artifac ...
- Java面试框架篇(8)
71,谈谈你对Struts的理解. 1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServle ...
- 6407. 【NOIP2019模拟11.05】小 D 与随机
题目描述 Description Input 第一行两个个整数 n,k. 之后 n -1 行,第 i 行两个整数 ui, vi, 表示一条树边. 保证输入的数据构成一棵树. Output 一行一个数表 ...
- PHP基础教程 PHP的页面缓冲处理机制
PHP有很多机制.函数,其实就是魔术师,重复发挥好,其实甚至是简单应用,就会出现神奇的效果.兄弟连PHP培训 这里来讲一个ob_start()函数. ob_start()函数用于打开缓冲区,比如hea ...
- golang rabbitmq实践(啰嗦)
目录 rabbitmq ubuntu下的配置 go 实现rabbitmq的消息收发 1:背景简介 我是一个.net一线开发,今年6月份离开帝都来到魔都,后入职于莫江互联网在线教育公司.现刚刚转正,在这 ...
- 【转载】mysqld_safe Directory ‘/var/run/mysqld’ for UNIX socket file don’t exists.
This is about resetting the MySQL 5.7 root password in Ubuntu 16.04 LTS You probably tried something ...
- 微信小程序登录 code 40029 天坑
微信登录时 code 大坑(服务端返回如下代码) {"errcode":40029,"errmsg":"invalid code, hints: [ ...
- 测试常用命令之awk篇
awk/gawk 1,内置变量 FILENAME:输入文件名称 FNR:当前数据文件中的数据行数 NF:数据文件中的字段总数 NR:已处理的输入数据行数目 FS:输入数据段分隔符 RS:输入数据行分隔 ...
- vscode-php代码提升及函数跳转
安装插件,php intellisense 安装后还要配置一下PHP的运行路径 打开扩展 输入 PHP IntelliSense 安装 文件 - 首选项 - 设置 - 扩展 - ...
- jieba (中文词频统计) 、collections (字频统计)、WordCloud (词云)
py库: jieba (中文词频统计) .collections (字频统计).WordCloud (词云) 先来个最简单的: # 查找列表中出现次数最多的值 ls = [1, 2, 3, 4, 5, ...