一、理解gradle
gradle是基于Groovy语言的项目构建框架实现,Groovy是一种基于JVM的动态语言。Android studio采用gradle来构建项目。
Android项目结构
MyApp
├── build.gradle //project
├── settings.gradle
└── app
├── build.gradle //module
├── build
├── libs
└── src
└── main
├── java
│ └── com.package.myapp
└── res
├── drawable
├── layout
└── etc.
build.gradle的配置文件
根目录project的build.gradle
buildscript方法定义的是所有模块的公共属性
buildscript {
repositories { //项目依赖的仓库,即依赖包的来源,常见的还有如maven仓库,或者自己定义的仓库
jcenter()
}
dependencies { //定义默认的依赖包,不能在此定义子模块的特有依赖包
classpath 'com.android.tools.build:gradle:1.2.3'
}
}
allprojects { //可定义各模块的默认配置和各模块都可见的tasks
repositories {
jcenter()
}
}
Module内的build.gradle
apply plugin: 'com.android.application' // 声明是插件
android { // Android类型的插件可以使用Android标签
compileSdkVersion 22 // 编译app时API版本
buildToolsVersion "22.0.1" // 构建工具得版本号
defaultConfig { // 定义了app的核心属性,并会在AndroidManifest中重写对应属性。
applicationId "com.gradleforandroid.gettingstarted" // 复写了AndroidManifest中的packageName。applicationId可以用来作为设备和应用商店的唯一标志,基于此,一个手机可以安装两个“同样”的app。
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'
}
第一行表示插件声明。apply plugin: 'com.android.application'
表示声明的是googleAndroid开发团队编写的插件,能够提供所有关于Android应用和依赖库的构建打包和测试。
setting.gradle
settings.gradle会在初始化初期执行,其中定义了哪些模块会被project构建。
include ':app', ':playui'
会至少包含一个include ':app'
,这时候表示单模块工程。
关于各模块的插件声明:
app:
apply plugin: 'com.android.application'
其他module:
apply plugin: 'com.android.library'
如果插件声明的是Android类型,则可以使用Android标签
android {
compileSdkVersion 22 //编译sdk版本
buildToolsVersion "22.0.1" //构建版本工具,可以用高版本去构建低版本
}
声明在libs文件夹内的jar包
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
全局设置
方法一、allprojects
这种必须是Android app module才有效,只有添加了Android插件才能访问Android的tasks
allprojects {
apply plugin: 'com.android.application'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
}
}
方法二、ext
在project的build.gradle中声明ext并定义属性,在所有子module中可以访问。
ext {
compileSdkVersion = 22
buildToolsVersion = "22.0.1"
}
则子模块中可以如下使用:
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
}
Tasks
待补充: https://blog.csdn.net/singwhatiwanna/article/details/78898113
二、依赖管理
gradle中可以一行代码实现依赖,由gradle自动从远程仓库下载依赖jar,并保证被正确使用。gradle也可以在工程中添加多个相同依赖时,自动排除掉相同的依赖。
仓库
仓库即文件的集合。Gradle支持Maven、lvy以及文件夹三种不同的仓库下载,并且针对特定版本的依赖包只需要下载一次后会在本地保留一份缓存。
一个依赖需要定义三个元素:
- group:创建该library的组织名,通常是包名
- name:该library的唯一标示
- version:该library的版本号
通常的依赖声明如下:
dependencies {
compile 'com.google.code.gson:gson:2.3'
compile 'com.squareup.retrofit:retrofit:1.9.0'
}
上述是基于groovy语法的,所以其完整的表述应该是
dependencies {
compile group: 'com.google.code.gson', name: 'gson', version:'2.3'
compile group: 'com.squareup.retrofit', name: 'retrofit', version: '1.9.0'
}
远程仓库
对于不在MavenCentral或者jcenter中而在一些组织自己的的Maven库的依赖,,需要添加Maven库的url地址,如果仓库需要权限,还要添加相应的userName和password
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
}
}
repositories {
maven {
url "http://repo.acmecorp.com/maven2"
credentials {
username 'user'
password 'secretpassword'
}
}
}
本地依赖
手动下载jar包添加依赖或者创建自己的library,而不必将该library发布到公有或者私有库。
文件依赖
添加一个具体的jar文件依赖:
dependencies {
compile files('libs/domoarigato.jar')
}
添加一个文件夹下所有的jar依赖
dependencies {
compile fileTree('libs')
}
默认情况下,新建的Android项目会有一个lib文件夹,并且会在依赖中这么定义(即添加所有在libs文件夹中的jar):
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
}
这样在任何一个Android项目中,你都可以把一个jar文件放在到libs文件夹下,其会自动的将其添加到编译路径以及最后的APK文件。
Native包(so包)
用c或者c++写的library会被叫做so包,Android插件默认情况下支持native包,你需要把.so文件放在对应的文件夹中:
app
├── AndroidManifest.xml
└── jniLibs
├── armeabi
│ └── nativelib.so
├── armeabi-v7a
│ └── nativelib.so
├── mips
│ └── nativelib.so
└── x86
└── nativelib.so
aar文件
可以使用Android API和包含Android资源文件,清单文件等的library(即依赖工程)。与应用工程生成apk不同,依赖工程生成.aar,该文件可以被Android应用工程当做依赖来使用。
创建依赖工程模块
与应用工程module不同,该build.gradle第一行应声明成:
apply plugin: 'com.android.library'
使用依赖工程模块
- 直接使用library作为依赖,在project的build.gradle里添加声明
include ':app', ':library'
在使用的模块里添加依赖
dependencies {
compile project(':library')
}
- 当构建library的时候,在 build/output/aar/下会生成对应的aar包,当项目需要复用library的时候可以以aar包形式引入。
创建一个aars文件夹,将aar拷贝,添加该文件夹作为依赖库,则该文件夹下所有aar文件都将作为依赖。
repositories {
flatDir {
dirs 'aars'
}
}
dependencies {
compile(name:'libraryname', ext:'aar')
}
依赖的概念
配置
compile是默认的那个,其含义是包含所有的依赖包,即在APK里,compile的依赖会存在。
apk的意思是apk中存在,但是不会加入编译中,这个貌似用的比较少。
provided的意思是提供编译支持,但是不会写入apk。
testCompile和androidTestCompile会添加额外的library支持针对测试。
动态版本
在需要使用最新版本的依赖包的情况下,采用此方式引入动态版本,gradle会在每次构建的时候去仓库寻找是否有最新版本。但是这面临的一个问题是,最新版本可能不是稳定版。动态版本一个显著的特点是版本号后面带“+”。
dependencies {
compile 'com.android.support:support-v4:22.2.+'
compile 'com.android.support:appcompat-v7:22.2+'
compile 'com.android.support:recyclerview-v7:+'
}
三、版本构建
在Gradle的Android插件中,一个构建版本意味着定义一个app或者依赖库如何被构建。每个构建版本都要特殊的一面,比如是否需要debug,application id是什么,是否不需要的资源被删除等等。你可以定义一个构建版本通过buildTypes方法。Android studio将debug作为默认构建版本。
android {
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile
('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
signingConfig signingConfigs.debugConfig
buildConfigField "boolean", MAIL_LOGIN, getMailLoginValue()
}
}
}
创建自己的构建版本
同样是在buildTypes里写入自己的版本,为自己的构建版本定一些特殊的属性。构建版本可以继承并重写已有构建版本的属性。
android {
buildTypes {
staging {
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
buildConfigField "String", "API_URL",
"\"http://staging.example.com/api\""
}
}
}
构建版本通过initWith方法继承并重写以后构建版本
android {
buildTypes {
staging.initWith(buildTypes.debug)
staging {
applicationIdSuffix ".staging"
versionNameSuffix "-staging"
debuggable = false
}
}
}
四、构建变体
ing...