本文首发于微信公众号「后厂村码农」html
相关文章
Gradle核心思想(一)为何如今要用Gradle?
Gradle核心思想(二)Gradle入门前奏
Gradle核心思想(三)Groovy快速入门指南
Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper
Gradle核心思想(五)通俗易懂的Gradle插件讲解
Gradle核心思想(六)自定义Gradle插件的三种方式前端
在Gradle核心思想这个系列中我尽可能避免了Gradle和Android之间的关联,这是由于在了解Gradle的核心思想后,能够更好的理解Android Gradle,所以这里强烈建议先阅读Gradle核心思想系列。 Android Gradle或者Gradle for Android,实际上指的就是Gradle的Android插件,这一篇咱们入个门。android
在Gradle核心思想(五)通俗易懂的Gradle插件讲解这篇文章中咱们知道,Gradle有不少插件,为了支持Android项目的构建,谷歌为Gradle编写了Android插件,新的Android构建系统就是由Gradle的Android插件组成的,Gradle是一个高级构建工具包,它管理依赖项并容许开发者自定义构建逻辑。Android Studio使用Gradle wrapper来集成Gradle的Android插件。须要注意的是,Gradle的Android插件也能够独立于AndroidStudio运行。 在 Android的官方网站提到了新的Android构建系统主要有如下几个特色:git
Gradle的Android插件结合Android Studio成为了目前最为流行的Android构建系统。程序员
Android Studio中的每一个项目包含一个或多个含有源代码文件和资源文件的模块,这些模块能够独立构建、测试或调试,一个Android Studio的模块类型能够有如下几种:github
Android应用程序模块 Android应用程序模块可能依赖于库模块,尽管许多Android应用程序只包含一个应用程序模块,构建系统会将其生成一个APK。api
Android 库模块 Android库模块包含可重用的特定于Android的代码和资源,构建系统会将其生成一个AAR。bash
App 引擎模块 包含应用程序引擎集成的代码和资源。微信
Java 库模块 包含可重用的代码,构建系统会将其生成一个JAR包。app
Android Studio3.3.2 中的Android项目视图以下所示。
这篇文章主要介绍项目build.gradle和模块build.gradle。
咱们新建一个Android项目,它的项目build.gradle的内容以下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.3.2' //1
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
复制代码
注释1处配置依赖的Gradle插件版本,Gradle插件属于第三方插件,所以这里在buildscrip块中配置谷歌的Maven库和JCenter库,这样Gradle系统才能找到对应的Gradle插件。 若是使用google()
报not found: 'google()'
错误,能够用以下代码替代:
maven { url 'https://maven.google.com' }
复制代码
若是你还不理解Gradle插件,能够查看Gradle核心思想(五)通俗易懂的Gradle插件讲解这篇文章。
新建一个Android项目,它的模块build.gradle的内容以下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}
复制代码
apply引入的插件id为com.android.application,说明当前模块是一个应用程序模块,Gradle的Android插件有多个类型分别为:
Android块用于描述该Module构建过程当中所用到的全部参数。
Android块中的defaultConfig块用于默认配置,经常使用的配置以下所示。
属性 | 描述 |
---|---|
applicationId | 指定App的包名 |
minSdkVersion | App最低支持的SDK版本 |
targetSdkVersion | 基于哪一个SDK版本开发 |
versionCode | App内部的版本号,用于控制App升级 |
versionName | App版本名称,也就是发布的版本号 |
testApplicationId | 配置测试App的包名 |
testInstrumentationRunner | 配置单元测试使用的Runner,默认为android.test.InstrumentationTestRunner |
proguardFile | ProGuard混淆所使用的ProGuard配置文件 |
proguardFiles | 同时配置多个ProGuard配置文件 |
signingConfig | 配置默认的签名信息 |
buildTypes块用于配置构建不一样类型的APK。 当咱们新建一个项目时,在Android块已经默认配置了 buildTypes块:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
复制代码
在AS的Terminal中执行gradlew.bat build命令,会在该模块的build/outputs/apk目录中生成release和debug的APK,虽然只配置了release ,但release和debug是默认配置,即便咱们不配置也会生成。也能够修改默认的release和debug,甚至能够自定义构建类型,好比:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
privitedebug{
applicationIdSuffix ""
}
}
复制代码
这时会在build/outputs/apk目录中生成release、debug、privitedebug的APK。 buildTypes块还能够配置不少属性,经常使用的配置以下所示。
属性 | 描述 |
---|---|
applicationIdSuffix | 配置applicationId的后缀 |
debuggable | 表示是否支持断点调试 |
jniDebuggable | 表示是否能够调试NDK代码 |
buildConfigField | 配置不一样的开发环境,好比测试环境和正式环境 |
shrinkResources | 是否自动清理未使用的资源,默认值为false |
zipAlignEnabled | 是否开启开启zipalign优化,提升apk运行效率 |
proguardFile | ProGuard混淆所使用的ProGuard配置文件 |
proguardFiles | 同事配置多个ProGuard配置文件 |
signingConfig | 配置默认的签名信息 |
multiDexEnabled | 是否启用自动拆分多个Dex的功能 |
用于配置签名设置,通常用来配置release模式。
属性 | 描述 |
---|---|
storeFile | 签名证书文件 |
storePassword | 签名证书文件的密码 |
storeType | 签名证书的类型 |
keyAlias | 签名证书中密钥别名 |
keyPassword | 签名证书中密钥的密码 |
signingConfigs {
release {
storeFile file('C:/Users/liuwangshu/.android/release.keystore')
storePassword 'android'
keyAlias 'androidreleasekey'
keyPassword 'android'
}
复制代码
android块中除了前面讲的defaultConfig块、buildTypes块、signingConfigs块还有其余的配置块,这里列举一些。
块 | 描述 |
---|---|
sourceSets | 配置目录指向 |
productFlavors | 多个渠道配置 |
lintOptions | Lint配置 |
dexOptions | DEX工具配置 |
adbOptions | adb配置 |
packagingOptions | 打包时的相关配置 |
更多的配置块请参考官方文档。
若是有多个module的配置是同样的,能够将这些配置提取出来,也就是使用全局配置。全局配置有多种方式,这里介绍其中的两种。 1. 使用ext块配置 在项目build.gradle中使用ext块,以下所示。
ext{
compileSdkVersion =28
buildToolsVersion ="28.0.3"
minSdkVersion =15
targetSdkVersion =28
}
复制代码
在某个module的build.gradle中使用配置:
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.compileSdkVersion
buildToolsVersion rootProject.ext.buildToolsVersion
defaultConfig {
applicationId "com.example.liuwangshu.hookinstrumentation"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
}
...
复制代码
2. 使用config.gradle配置 首先在根目录下建立config.gradle文件来进行配置。 config.gradle
ext{
android=[
applicationId:"com.example.liuwangshu.hookinstrumentation",
compileSdkVersion :28,
buildToolsVersion :"28.0.3",
minSdkVersion : 15,
targetSdkVersion : 28,
]
dependencies =[
"appcompat-v7" : "com.android.support:appcompat-v7:28.0.0",
"constraint" : "com.android.support.constraint:constraint-layout:1.1.3",
]
}
复制代码
接着在项目build.gradle中添加apply from: "config.gradle"
,这样项目的全部module都能用config.gradle中定义的参数。 最后在module的build.gradle中使用配置:
apply plugin: 'com.android.application'
android {
compileSdkVersion rootProject.ext.android.compileSdkVersion
buildToolsVersion rootProject.ext.android.buildToolsVersion
defaultConfig {
applicationId rootProject.ext.android.applicationId
minSdkVersion rootProject.ext.android.minSdkVersion
targetSdkVersion rootProject.ext.android.targetSdkVersion
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
...
dependencies {
implementation rootProject.ext.dependencies["constraint"]
implementation rootProject.ext.dependencies["appcompat-v7"]
...
}
复制代码
dependencies 块用于配置该module构建过程当中所依赖的全部库。Gradle插件3.4版本新增了 api 和 implementation 来代替 compile 配置依赖,其中 api 和此前的 compile是同样的。dependencies和api主要如下的区别:
感谢 jeroenmols.com/blog/2017/0… google.github.io/android-gra… www.androiddocs.com/tools/build… www.jianshu.com/p/8962d6ba9… www.jianshu.com/p/b6744e1e4… 《Android群英传 神兵利器》