Gradle基础知识
Gradle是一个非常先进的项目构建工具,它使用了一种基于Groovy的领域特定语言(DSL)来声明项目配置,摒弃了传统基于XML(Ant和Maven)的各种繁琐配置。
Gradle作为Android的构建系统,主要作用是编译应用资源和源代码,将其打包成可供测试、部署、签署和分发的APK。
Android Studio使用Gradle这个高级构建工具包来自动化执行和管理构建流程,也可运行我们自定义的构建配置。
Gradle和Android插件是独立于Android Studio运行的,所以我们可以在非Android Studio中,也可以构造Android应用。
构建流程
编译器将源代码转换成 DEX(Dalvik Executable) 文件(其中包括运行在 Android 设备上的字节码),将所有其他内容转换成已编译资源。
APK 打包器将 DEX 文件和已编译资源合并成单个 APK。不过,必须先签署 APK,才能将应用安装并部署到 Android 设备上。
APK 打包器使用调试或发布密钥库签署 APK:
如果构建的是调试版本的应用(即专用于测试和分析的应用),打包器会使用调试密钥库签署您的应用。Android Studio 自动使用调试密钥库配置新项目。如果构建的是打算向外发布的发布版本应用,打包器会使用发布密钥库签署您的应用。
在生成最终 APK 之前,打包器会使用 zipalign 工具对应用进行优化,减少其在设备上运行时的内存占用。
简而言之:
编译器将源代码生成dex与编译好的资源文件生成APK,然后通过调试或发布秘钥,来签署APK。最后使用zipalign优化,才生成可安装的APK。
依赖项(dependencies)
管理本地系统以及来自远程存储区的项目依赖项,不用去手动搜索和下载依赖项的二进制文件包以及将它们复制到项目目录内。
ProGuard
构建系统可在构建过程中运行 ProGuard 对类进行压缩和混淆处理。
settings.gradle(设置文件)
指示Gradle在构造应用时,包含的模块。在项目中我创建了两个模块,app和myapplication,Android Studio会自动帮我们配置。
include ':app', ':myapplication2'
build.gradle(Project: )(顶级配置文件)
安卓编译工具的路径,配置项目中共用的库和依赖项。
repositories中的 jcenter() , 它是一个代码仓库,很多Android开源项目都会选择将代码托管到jcenter(),声明了这行配置之后,我们就可以在项目中轻松引用jcenter上的开源项目。也就是说,Gradle 会自动去搜索和下载开源项目。默认代码仓库为jcenter() , 其实还有Maven Central() , Ivy 。
dependencies中使用了classpath声明了Gradle插件。因为Gradle并不是专门为构建Android应用开发的,Java,C++等很多项目都可以使用Gradle来构建。我们想要使用它来构建Android项目,就要声明这个插件,后面是Gradle的版本。
allprojects 在这里我们配置所有项目的库和依赖,为了保证每个项目的独立性,不会有过多的公有操作,所以每个依赖项要在每个项目(Module)中自行配置。
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
}
}
allprojects {
repositories {
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
build.gradle(Module:app)(模块级配置文件)
第一行应用了一个插件apply plugin: 'com.android.application'
,表明这是一个应用程序模块。一般有两个可选值,还一个为apply plugin: 'com.android.library'
表示这是一个库模块。
两者的去区别在于:前者是可以直接运行的,后者只能作为代码库依附于别的应用程序模块来运行。注意:两者不能同时使用。
android这里内容包括很多,我们主要是用来配置项目
defaultConfig默认配置,可以重写清单文件中的信息,如果清单文件和配置文件所涉及到的内容相同,以配置文件为准。
buildTypes 这里包括debug,release。但是debug不显示,它包含了调试工具,和秘钥签名。release做的工作就是代码的压缩和混淆处理。proguardFiles用于指定混淆时使用的规则文件,proguard-android.txt
是Android SDK 目录下的,里面是所有项目通用的混淆规则。proguard-rules.pro
是当前项目根目录下的,里面可以编写当前项目特有的混淆规则。
Android Studio 直接运行项目生成的都是测试版的安装文件。
dependencies 指定当前项目的所有依赖关系。Android Studio共有三种依赖:本地依赖,库依赖,远程依赖。
本地依赖可以对本地的jar包或目录添加依赖关系。库依赖可以对项目中的库模块添加依赖关系。远程依赖可以对jcenter库上的开源项目添加依赖关系。
compile fileTree(dir: 'libs', include: ['*.jar'])
第一行是本地依赖声明,表示可以将libs目录下所有.jar后缀文件都添加到项目中。
compile 'com.android.support:appcompat-v7:25.3.1'
第二行是远程依赖,其中com.android.support
是域名,用于和其他库和其他公司的库做区分。appcompat-v7
是组名,用于同一公司不同库作区分。25.3.1
版本号,用于同一个库中不同版本作区分。
在声明这行代码后,Gradle在构建项目的时候会首先查看本地是否有缓存,没有的话就会去远程库中下载,然后添加到项目的构建路径当中。
库依赖:compile project
结构,例如添加helper就应该compile project(':helper')
声明测试用例库testCompile 'junit:junit:4.12'
apply plugin: 'com.android.application'
android {
compileSdkVersion 25 //项目编译版本
buildToolsVersion "25.0.2" //项目构建工具版本
defaultConfig {
applicationId "example.com.myapplication" //包名,发布应用时的唯一识别
minSdkVersion 15 //最低兼容的Android系统版本
targetSdkVersion 25 //用于测试程序的最高API级别
versionCode 1 //指定项目的版本号(发布更新应用时使用)
versionName "1.0" //指定项目的版本名
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false //使代码缩小
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
这里还有productFlavors,用来配置免费和付费的应用,两者需要制定不同的applicationId。
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
Gradle属性文件
gradle.properties
以在其中配置项目范围 ,例如 Gradle 后台进程的最大堆大小。
local.properties
为构建系统配置本地环境属性,例如 SDK 安装路径。由于该文件的内容由 Android Studio 自动生成并且专用于本地开发者环境,因此不需要手动操作。