Android-Gradle(二)
理解Gradle脚本
当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具。当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件,两个build.gradle,一个settings.gradle,build.gradle分别放在了根目录和moudle目录下,下面是gradle文件的构成图:
MyApp
├── build.gradle
├── settings.gradle
└── app
└── build.gradle
setting.gradle解析
当你的app只有一个模块的时候,你的setting.gradle将会是这样子的:
include ':app'
setting.gradle文件将会在初始化时期执行,关于初始化时期,可以查看上一篇博客,并且定义了哪一个模块将会被构建。举个例子,上述setting.gradle包含了app模块,setting.gradle是针对多模块操作的,所以单独的模块工程完全可以删除掉该文件。在这之后,Gradle会为我们创建一个Setting对象,并为其包含必要的方法,你不必知道Settings类的详细细节,但是你最好能够知道这个概念。
根目录的build.gradle
该gradle文件是定义在这个工程下的所有模块的公共属性,它默认包含二个方法:
buildscript { repositories {
jcenter()
} dependencies { classpath 'com.android.tools.build:gradle:1.2.3'
}
}allprojects { repositories {
jcenter()
}
}
buildscript方法是定义了全局的相关属性,repositories定义了jcenter作为仓库。一个仓库代表着你的依赖包的来源,例如maven仓库。dependencies用来定义构建过程。这意味着你不应该在该方法体内定义子模块的依赖包,你仅仅需要定义默认的Android插件就可以了,因为该插件可以让你执行相关Android的tasks。
allprojects方法可以用来定义各个模块的默认属性,你可以不仅仅局限于默认的配置,未来你可以自己创造tasks在allprojects方法体内,这些tasks将会在所有模块中可见。
模块内的build.gradle
模块内的gradle文件只对该模块起作用,而且其可以重写任何的参数来自于根目录下的gradle文件。该模块文件应该是这样:
apply plugin: 'com.android.application'
android { compileSdkVersion 22
buildToolsVersion "22.0.1"
defaultConfig { applicationId "com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"
}
buildTypes { release { minifyEnabled false
proguardFiles getDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies { compile fileTree(dir: 'libs', include: ['*.jar'])
compile 'com.android.support:appcompat-v7:22.2.0'
}
插件
该文件的第一行是Android应用插件,该插件我们在上一篇博客已经介绍过,其是google的Android开发团队编写的插件,能够提供所有关于Android应用和依赖库的构建,打包和测试。
Android
该方法包含了所有的Android属性,而唯一必须得属性为compileSdkVersion和buildToolsVersion:
compileSdkVersion:编译该app时候,你想使用到的api版本。
buildToolsVersion:构建工具的版本号。
构建工具包含了很多实用的命令行命令,例如aapt,zipalign,dx等,这些命令能够被用来产生多种多样的应用程序。你可以通过sdk manager来下载这些构建工具。
defaultConfig方法包含了该app的核心属性,该属性会重写在AndroidManifest.xml中的对应属性。
defaultConfig {
applicationId "com.gradleforandroid.gettingstarted"
minSdkVersion 14
targetSdkVersion 22
versionCode 1
versionName "1.0"}
第一个属性是applicationId,该属性复写了AndroidManifest文件中的包名package
name,但是关于applicationId和package
name有一些不同。在gradle被用来作为Android构建工具之前,package
name在AndroidManifest.xml有两个作用:其作为一个app的唯一标示,并且其被用在了R资源文件的包名。
Gradle能够很轻松的构建不同版本的app,使用构建变种。举个例子,其能够很轻松的创建一个免费版本和付费版本的app。这两个版本需要分隔的标示码,所以他们能够以不同的app出现在各大应用商店,当然他们也能够同时安装在一个手机中。资源代码和R文件必须拥有相同的包名,否则你的资源代码将需要改变,这就是为什么Android开发团队要将package name的两大功能拆分开。在AndroidManifest文件中定义的package name依然被用来作为包名和R文件的包名。而applicationid将被用在设备和各大应用商店中作为唯一的标示。
接下来将是minSdkVersion和targetSdkVersion。这两个和AndroidManifest中的<uses-sdk>很像。minSdkVersion定义为最小支持api。
versionCode将会作为版本号标示,而versionName毫无作用。
所有的属性都是重写了AndroidManifest文件中的属性,所以你没必要在AndroidManifest中定义这些属性了。
buildTypes方法定义了如何构建不同版本的app,我们将在下一篇博客中有所介绍。
依赖包
依赖模块作为gradle默认的属性之一(这也是为什么其放在了Android的外面),为你的app定义了所有的依赖包。默认情况下,我们依赖了所有在libs文件下的jar文件,同时包含了AppCompat这个aar文件。我们将会在下一篇博客中讨论依赖的问题。
让我们开始tasks吧
如果你想知道你多少tasks可以用,直接运行gradlew tasks,其会为你展示所有可用的tasks。当你创建了一个Android工程,那么将包含Android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等。
基本的tasks
android插件依赖于Java插件,而Java插件依赖于base插件。
base插件有基本的tasks生命周期和一些通用的属性。
base插件定义了例如assemble和clean任务,Java插件定义了check和build任务,这两个任务不在base插件中定义。
这些tasks的约定含义:
assemble: 集合所有的output
clean: 清除所有的output
check: 执行所有的checks检查,通常是unit测试和instrumentation测试
build: 执行所有的assemble和check
Java插件同时也添加了source sets的概念。
Android tasks
android插件继承了这些基本tasks,并且实现了他们自己的行为:
assemble 针对每个版本创建一个apk
clean 删除所有的构建任务,包含apk文件
check 执行Lint检查并且能够在Lint检测到错误后停止执行脚本
build 执行assemble和check
默认情况下assemble tasks定义了assembleDebug和assembleRelease,当然你还可以定义更多构建版本。除了这些tasks,android 插件也提供了一些新的tasks:
connectedCheck 在测试机上执行所有测试任务
deviceCheck 执行所有的测试在远程设备上
installDebug和installRelease 在设备上安装一个特殊的版本
所有的install task对应有uninstall 任务
build task依赖于check任务,但是不依赖于connectedCheck或者deviceCheck,执行check任务的使用Lint会产生一些相关文件,这些报告可以在app/build/outputs中查看:
android studio的tasks
你根本不必要去执行gradle脚本在命令行中,Android studio有其对应的工具:
在这个界面,你要做的就是双击了。当然你也可以在Android studio中打开命令行,执行相关命令,具体操作就不介绍了。
自定义构建
当你在Android studio中自定义了gradle文件,需要更新project:
其实该按钮,执行了generateDebugSources tasks,该任务会生成所有必要的classes文件。
BuildConfig和resources
android { buildTypes { debug { buildConfigField "String", "API_URL", "\"http://test.example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS", "true"
}
release { buildConfigField "String", "API_URL", "\"http://example.com/api\""
buildConfigField "boolean", "LOG_HTTP_CALLS","false"
}
}
类似这些定义的常量,当定义了这些属性后,你完全可以在代码中使用:BuildConfig.API_URL和BuildConfig.LOG_HTTP
最近,Android tools team也让其里面定义string变为可能:
android { buildTypes { debug { resValue "string", "app_name", "Example DEBUG"
}
release { resValue "string", "app_name", "Example"
}
}
}
你可以在代码中使用这些string。其中“”不是必须得。
全局设置
如果你有很多模块在一个工程下,你可以这么定义你的project文件。
allprojects { apply plugin: 'com.android.application'
android { compileSdkVersion 22
buildToolsVersion "22.0.1"
}
}
这只会在你的所有模块都是Android app应用的时候有效。你需要添加Android 插件才能访问Android的tasks。更好的做法是你在全局的gradle文件中定义一些属性,然后再模块中运用它们。比如你可以在根目录下这么定义:
ext {
compileSdkVersion = 22
buildToolsVersion = "22.0.1"}
那么你在子模块中就可以使用这些属性了:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}
Project properties文件
上述方法是一种办法,当然还有很多办法:
ext方法
gradle.properties文件
-p参数
ext {
local = 'Hello from build.gradle'} task printProperties << { println local // Local extra property
println propertiesFile // Property from file
if (project.hasProperty('cmd')) { println cmd // Command line property
}
}
当然你可以在gradle.properties中定义:
propertiesFile = Hello from gradle.properties
你也可以输入命令行:
$ gradlew printProperties -Pcmd='Hello from the command line':printProperties
Hello from build.gradle
Hello from gradle.properties
Hello from the command line
总结
在这篇博客中,我们细致的查看了Android studio生成的三个gradle文件,现在你应该能够自己去创建自己的gradle文件,我们还学习了最基本的构建任务,学习了Android 插件以及其tasks。
在接下来的几年里,Android开发生态将会爆炸性增长,很多有趣的依赖库将会让每个人去使用,在下一篇博客里面,我们将看看我们能有几种方式添加我们的依赖库,这样我们才能够避免造轮子。
原文:https://segmentfault.com/a/1190000004234712?_ea=538654
关注微信公众号获得更多内容:
Android-Gradle(二)的更多相关文章
- Gradle之Android Gradle Plugin 主要流程分析(二)
[Android 修炼手册]Gradle 篇 -- Android Gradle Plugin 主要流程分析 预备知识 理解 gradle 的基本开发 了解 gradle task 和 plugin ...
- Android Gradle 技巧之一: Build Variant 相关
Build Variant android gradle 插件,允许对最终的包以多个维度进行组合. BuildVariant = ProductFlavor x BuildType 两个维度 最常见的 ...
- Android Gradle 自定义Task 详解
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/76408024 本文出自[赵彦军的博客] 一:Gradle 是什么 Gradle是一 ...
- 读书笔记--Android Gradle权威指南(下)
前言 最近看了一本书<Android Gradle 权威指南>,收获挺多,就想着来记录一些读书笔记,方便后续查阅. 本篇内容是基于上一篇:读书笔记--Android Gradle权威指南( ...
- Android Gradle基于参数化配置实现差异化构建
一.背景: 项目中有一些特殊的需求,如个别渠道集成腾讯bugly,个别渠道集成易观统计,不同的渠道集成不同的推送策略(如Oppo渠道优先Opush推送),不同的渠道拥有不同的第三方登录集成等等.这些需 ...
- Android Gradle 理解
/********************************************************************************* * Android Gradle ...
- Android Gradle 学习笔记(六):Gradle 插件
Gradle 本身提供了一些基本的概念和整体核心的框架,其他用于描述真实使用场景的都可以通过插件扩展的方式来实现.这样就可以通过抽象的方式提供一个核心的框架,其他具体的功能和业务都通过插件扩展的方式来 ...
- Android Gradle 学习笔记(五):Gradle 任务 Task
在之前的学习中,我们了解到Gradle的构建工作都是由Task组合完成的.本节我们就来介绍一下 Task - 任务. 一.多种方式创建任务 在Gradle中,我们可以有很多种方式来创建任务.为什么有这 ...
- Android Gradle 学习笔记(七):Android Gradle 插件
我们知道Android Gradle其实就是一个Gradle的一个第三方插件,它是由Google的Android团队开发的,基于Gradle构建的,和Android Studio完美搭配.相比于旧的构 ...
- Gradle之Android Gradle Plugin 主要 Task 分析(三)
[Android 修炼手册]Gradle 篇 -- Android Gradle Plugin 主要 Task 分析 预备知识 理解 gradle 的基本开发 了解 gradle task 和 plu ...
随机推荐
- ImportError: No module named 'requests.packages.urllib3'
场景:CentOS 7 运行微信告警脚本报错 原因:requests库版本问题 解决方法: sudo pip install requests urllib3 pyOpenSSL --force -- ...
- 【QT】QT更改构建目录
菜单“工具”-“选项”. Qt Creator怎样更改默认构建目录_百度经验 https://jingyan.baidu.com/article/6181c3e0b9d170152ef153af.ht ...
- shell脚本学习笔记(符号)
shell脚本的学习: 1.Shell的作用是解释运行用户的命令,用户输入一条命令,Shell就解释运行一条,这样的方式称为交互式(Interactive),Shell还有 一种运行命令的方式称为批处 ...
- HTML使用CSS样式的方法
在html网页中引入css样式表主要有一下四种方法 1.行内引入 <p ></p> 2.嵌入式 <style type="text/css"> ...
- 为IONIC开发的安卓apk签名
首先进入\platforms\android目录生成一个keystore文件: keytool -genkey -alias mykey -keyalg RSA -validity 40000 -ke ...
- maven 中的mirror详解
一.前言 今天同事遇到个问题,本来公司是有maven私服的,但同事觉得上面有些东西下载不到,于是在自己本地的maven配置中加了: <mirrors> <mirror> < ...
- centos7上修改lv逻辑卷的大小
author:headsen chen date: 2019-03-18 15:24:22 1,查看 [root@localhost mnt]# df -h Filesystem Size Used ...
- 怎么用js编写1——100的质数?
这里来自csdn问答的一个问题,怎么用js编写1——100的质数? http://ask.csdn.net/questions/214429 质数也就是素数,即只能被1和自身整除的数,因此可以构造循环 ...
- 让wampserver2.5.exe支持sql server数据库的方法
将D:\wamp\bin\php\php5.5.12\ext路径下 这两个文件复制到php.ini中 链接数据库方法 <?php $serverName = "."; $co ...
- 23.react-router 路由
箭头函数扩展: 箭头函数: functoin 函数名(参数){ 函数体 } 箭头函数: 1.把function删掉 , 2.参数和{}之间加上 箭头=> 简写: 1.参数的简写:只有一个参 ...