相关文章:
- Android Gradle(一)Gradle的Android插件入门
- Android Gradle(二)签名配置和依赖管理
- 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插件,这一篇我们入个门。
什么是Gradle的Android插件 {#什么是Gradle的Android插件}
在Gradle核心思想(五)通俗易懂的Gradle插件讲解这篇文章中我们知道,Gradle有很多插件,为了支持Android项目的构建,谷歌为Gradle编写了Android插件,新的Android构建系统就是由Gradle的Android插件组成的,Gradle是一个高级构建工具包,它管理依赖项并允许开发者自定义构建逻辑。Android Studio使用Gradle wrapper来集成Gradle的Android插件。需要注意的是,Gradle的Android插件也可以独立于AndroidStudio运行。
在 Android的官方网站提到了新的Android构建系统主要有以下几个特点:
- 代码和资源易于重用
- 无论是针对多个apk发行版还是针对不同风格的应用程序,都可以很容易创建应用程序的多个不同版本。
- 易于配置、扩展和自定义构建过程
- 良好的IDE集成
Gradle的Android插件结合Android Studio成为了目前最为流行的Android构建系统。
Android Studio的模块类型和项目视图 {#Android-Studio的模块类型和项目视图}
Android Studio中的每个项目包含一个或多个含有源代码文件和资源文件的模块,这些模块可以独立构建、测试或调试,一个Android Studio的模块类型可以有以下几种:
Android应用程序模块
Android应用程序模块可能依赖于库模块,尽管许多Android应用程序只包含一个应用程序模块,构建系统会将其生成一个APK。
Android 库模块
Android库模块包含可重用的特定于Android的代码和资源,构建系统会将其生成一个AAR。
App 引擎模块
包含应用程序引擎集成的代码和资源。
Java 库模块
包含可重用的代码,构建系统会将其生成一个JAR包。
Android Studio3.3.2 中的Android项目视图如下所示。
所有构建文件在 Gradle Scripts 层级下显示,大概介绍下这些文件的用处。
- 项目build.gradle:配置项目的整体属性,比如指定使用的代码仓库、依赖的Gradle插件版本等等。
- 模块build.gradle:配置当前Module的编译参数。
- gradle-wrapper.properites:配置Gradle Wrapper,可以查看Gradle核心思想(四)看似无用,实则重要的Gradle Wrapper这篇文章。
- gradle.properties:配置Gradle的编译参数。具体配置见Gradle官方文档
- settings.gradle:配置Gradle的多项目管理。
- local.properties:一般用来存放该Android项目的私有属性配置,比如Android项目的SDK路径。
这篇文章主要介绍项目build.gradle和模块build.gradle。
项目build.gradle {#项目build-gradle}
我们新建一个Android项目,它的项目build.gradle的内容如下:
|------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
| 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()'
错误,可以用如下代码替代:
|-----------|--------------------------------------------------|
| 1
| maven { url 'https://maven.google.com' }
|
如果你还不理解Gradle插件,可以查看Gradle核心思想(五)通俗易懂的Gradle插件讲解这篇文章。
模块build.gradle {#模块build-gradle}
新建一个Android项目,它的模块build.gradle的内容如下:
|------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| 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' }
|
Gradle的Android插件类型 {#Gradle的Android插件类型}
apply引入的插件id为com.android.application,说明当前模块是一个应用程序模块,Gradle的Android插件有多个类型分别为:
- 应用程序插件,插件id为com.android.application,会生成一个APK。
- 库插件,插件id为com.android.library,会生成一个AAR,提供给其他应用程序模块用。
- 测试插件,插件id为com.android.test,用于测试其他的模块。
- eature插件,插件id为com.android.feature,创建Android Instant App时需要用到的插件。
- nstant App插件,插件id为com.android.instantapp,是Android Instant App的入口。
Android块 {#Android块}
Android块用于描述该Module构建过程中所用到的所有参数。
- compileSdkVersion:配置编译该模块的SDK版本
- buildToolsVersion:Android构建工具的版本
defaultConfig块 {#defaultConfig块}
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块 {#buildTypes块}
buildTypes块用于配置构建不同类型的APK。
当我们新建一个项目时,在Android块已经默认配置了 buildTypes块:
|---------------------|----------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6
| 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,甚至可以自定义构建类型,比如:
|------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8 9 10 11 12
| 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的功能 |
signingConfigs块 {#signingConfigs块}
用于配置签名设置,一般用来配置release模式。
| 属性 | 描述 | |---------------|------------| | storeFile | 签名证书文件 | | storePassword | 签名证书文件的密码 | | storeType | 签名证书的类型 | | keyAlias | 签名证书中密钥别名 | | keyPassword | 签名证书中密钥的密码 |
|-------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 1 2 3 4 5 6 7 8
| 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的配置是一样的,可以将这些配置提取出来,也就是使用全局配置。全局配置有多种方式,这里介绍其中的两种。
-
使用ext块配置
在项目build.gradle中使用ext块,如下所示。|---------------------|---------------------------------------------------------------------------------------------------------| |
1 2 3 4 5 6
|ext{ compileSdkVersion =28 buildToolsVersion ="28.0.3" minSdkVersion =15 targetSdkVersion =28 }
|在某个module的build.gradle中使用配置:
|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
|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" } ... } ...
| -
使用config.gradle配置
首先在根目录下创建config.gradle文件来进行配置。
config.gradle|------------------------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|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中使用配置:|------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|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 块 {#dependencies-块}
dependencies 块用于配置该module构建过程中所依赖的所有库。Gradle插件3.4版本新增了 api 和 implementation 来代替 compile 配置依赖,其中 api 和此前的 compile是一样的。dependencies和api主要以下的区别:
- implementation可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而api与compile一样,无法隐藏自己使用的依赖。
- 如果使用api,一个module发生变化,这条依赖链上所有的module都需要重新编译,而使用implemention,只有直接依赖这个module需要重新编译。
感谢 {#感谢}
https://jeroenmols.com/blog/2017/06/14/androidstudio3/
http://google.github.io/android-gradle-dsl/current/
http://www.androiddocs.com/tools/building/plugin-for-gradle.html
https://www.jianshu.com/p/8962d6ba936e
https://www.jianshu.com/p/b6744e1e4f7c
参考链接:http://liuwangshu.cn/application/android-gradle/1-gradle-plug-in.html