android 编写gradle,写给Android开发的Gradle知识体系

原标题:写给Android开发的Gradle知识体系

作者 : 刘望舒 |来源 :刘望舒的博客

地址:http://liuwangshu.cn/application/android-gradle/1-gradle-plug-in.html

前言

老读者都知道,我的技术博客从2016年开始就没写过不成系列的文章,这些系列文章组成了目前Android领域最全面深入的原创知识体系,更恐怖的是这个体系还在不断的成长,关于这个知识体系可以点击 阅读原文 了解。

今天我给大家带来的是Android Gradle系列文章的开篇,实际上在Android Gradle系列之前,我已经写了Gradle核心思想系列,这个系列我尽量避免了Gradle和Android之间的关联,这是因为在了解Gradle的核心思想后,可以更好的理解Android Gradle,因此这里强烈建议先阅读Gradle核心思想系列。

1.什么是Gradle的Android插件

在通俗易懂的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构建系统。

2. Android Studio的模块类型和项目视图

Android Studio中的每个项目包含一个或多个含有源代码文件和资源文件的模块,这些模块可以独立构建、测试或调试,一个Android Studio的模块类型可以有以下几种:

Android应用程序模块

Android应用程序模块可能依赖于库模块,尽管许多Android应用程序只包含一个应用程序模块,构建系统会将其生成一个APK。

Android 库模块

Android库模块包含可重用的特定于Android的代码和资源,构建系统会将其生成一个AAR。

App 引擎模块

包含应用程序引擎集成的代码和资源。

Java 库模块

包含可重用的代码,构建系统会将其生成一个JAR包。

Android Studio3.3.2 中的Android项目视图如下所示。

51fb2afd26a9055c63d8c107cc8819c9.png

1.png

所有构建文件在 Gradle s 层级下显示,大概介绍下这些文件的用处。

项目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。

3.项目build.gradle

我们新建一个Android项目,它的项目build.gradle的内容如下:

build {

repositories {

google

jcenter

}

dependencies {

classpath 'com.android.tools.build:gradle:3.3.2'//1

}

}

allprojects {

repositories {

google

jcenter

}

}

task clean( type: Delete) {

deleterootProject.buildDir

}

注释1处配置依赖的Gradle插件版本,Gradle插件属于第三方插件,因此这里在buildscrip块中配置谷歌的Maven库和JCenter库,这样Gradle系统才能找到对应的Gradle插件。

如果使用google报not found: 'google'错误,可以用如下代码替代:

maven{ url'https://maven.google.com'}

如果你还不理解Gradle插件,可以查看Gradle核心思想(五)通俗易懂的Gradle插件讲解这篇文章。

4.模块build.gradle

新建一个Android项目,它的模块build.gradle的内容如下:

applyplugin: 'com.android.application'

android {

compileSdkVersion28

defaultConfig {

applicationId"com.example.myapplication"

minSdkVersion 15

targetSdkVersion 28

versionCode 1

versionName "1.0"

testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

}

buildTypes {

release{

minifyEnabledfalse

proguardFiles getDefaultProguardFile( 'proguard-android-optimize.txt'), 'proguard-rules.pro'

}

}

}

dependencies {

implementationfileTree(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'

}

4.1 Gradle的Android插件类型

apply引入的插件id为com.android.application,说明当前模块是一个应用程序模块,Gradle的Android插件有多个类型分别为:

应用程序插件,插件id为com.android.application,会生成一个APK。

库插件,插件id为com.android.library,会生成一个AAR,提供给其他应用程序模块用。

测试插件,插件id为com.android.test,用于测试其他的模块。

feature插件,插件id为com.android.feature,创建Android Instant App时需要用到的插件。

Instant App插件,插件id为com.android.instantapp,是Android Instant App的入口。

4.2 Android块

Android块用于描述该Module构建过程中所用到的所有参数。

compileSdkVersion:配置编译该模块的SDK版本

buildToolsVersion:Android构建工具的版本

4.2.1 defaultConfig块

Android块中的defaultConfig块用于默认配置,常用的配置如下所示。

2bd0cb94853be6c3833a0855c029d5f4.png

buildTypes块用于配置构建不同类型的APK。4.2.2 buildTypes块

当我们新建一个项目时,在Android块已经默认配置了 buildTypes块:

buildTypes{

release{

minifyEnabledfalse

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{

minifyEnabledfalse

proguardFiles getDefaultProguardFile( 'proguard-android-optimize.txt'), 'proguard-rules.pro'

}

debug{

debuggabletrue

}

privitedebug{

applicationIdSuffix""

}

}

这时会在build/outputs/apk目录中生成release、debug、privitedebug的APK。

buildTypes块还可以配置很多属性,常用的配置如下所示。

0a75896944f2e61a6a5fa5b2adf3090f.png

4.2.3 signingConfigs块

用于配置签名设置,一般用来配置release模式。

fc79a72b1461805890afbedaa96709af.png

signingConfigs{

release{

storeFilefile( 'C:/Users/liuwangshu/.android/release.keystore')

storePassword 'android'

keyAlias 'androidreleasekey'

keyPassword 'android'

}

4.2.4 其他配置块

android块中除了前面讲的defaultConfig块、buildTypes块、signingConfigs块还有其他的配置块,这里列举一些。

c6f4830b84837d8068ddeb78f99845b9.png

更多的配置块请参考官方文档。

4.2.4 全局配置

如果有多个module的配置是一样的,可以将这些配置提取出来,也就是使用全局配置。全局配置有多种方式,这里介绍其中的两种。

1. 使用ext块配置

在项目build.gradle中使用ext块,如下所示。

ext{

compileSdkVersion =28

buildToolsVersion = "28.0.3"

minSdkVersion =15

targetSdkVersion =28

}

在某个module的build.gradle中使用配置:

applyplugin: 'com.android.application'

android {

compileSdkVersionrootProject.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中使用配置:

applyplugin: 'com.android.application'

android {

compileSdkVersionrootProject.ext.android.compileSdkVersion

buildToolsVersion rootProject.ext.android.buildToolsVersion

defaultConfig {

applicationIdrootProject.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 {

implementationrootProject.ext.dependencies[ "constraint"]

implementation rootProject.ext.dependencies[ "appcompat-v7"]

...

}

4.2 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

《Android群英传 神兵利器》

-------- END ---------返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值