开发效率优化之自动化构建系统Gradle(二)下篇

简介: 11/10号文档资料已全面更新!;《【阿里P7】移动互联网架构师进阶教程+BAT面试题》,可点击下方链接直接打开:【阿里P7】移动互联网架构师进阶高级教程+BAT面试题本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统Gradle:Gradle 插件简介Gradle 插件是一个能够将 Gradle 的构建逻辑(build logic)和构建任务(build task)打包到一起,以便在多个项目的构建脚本(build.gradle)中应用(apply)的工具。

11/10号文档资料已全面更新!;《【阿里P7】移动互联网架构师进阶教程+BAT面试题》,可点击下方链接直接打开:
【阿里P7】移动互联网架构师进阶高级教程+BAT面试题
本篇文章将继续从自定义 Gradle 插件开发来介绍自动化构建系统Gradle:

Gradle 插件简介

Gradle 插件是一个能够将 Gradle 的构建逻辑(build logic)和构建任务(build task)打包到一起,以便在多个项目的构建脚本(build.gradle)中应用(apply)的工具。

例如,build.gradle 构建脚本文件内 apply plugin: 'java'apply plugin: 'com.android.application' 中的 javacom.android.application 就是官方提供的 Gradle 插件,通过应用这些插件,可以丰富项目的构建任务与构建逻辑。

除官方提供的插件外,Gradle 还允许开发者定义自己的 Gradle 插件。开发者可以根据实际需求定义自己的构建逻辑和构建任务,将其打包为 Gradle 插件,从而在多个项目的构建脚本中复用。此外,还可以将自定义的 Gradle 插件发布到 plugin portal或其他仓库中,更为方便的分享给他人使用。

Gradle 插件对编程语言没有太多限制,只要是能够被编译为 JVM 字节码的编程语言,都能用来编写 Gradle 插件。Gradle-API 的被设计为对 Groovy、Java、Koltin 友好的,通常情况下,使用 Java 或 Kotlin 这类静态类型语言实现的 Gradle 插件的性能要比使用 Groovy 实现的相同常见的性能更好。

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#开始之前 "开始之前")开始之前

Gradle 作为一个普通的构建工具,本身并不依赖任何可视化 GUI 工具。为简化步骤,本文将采用命令行方式来完成自定义 Gradle 插件的演示。在开始之前,需先将 gradle 命令添加到系统环境变量中。

若读者在 IDEA / Android Studio 使用过 gradle ,则可在当前用户目录下找到 gradle 命令,具体路径如下

  • Mac:/Users/当前用户名/.gradle/wrapper/dists/gradle版本/沙盒路径/gradle版本/bin
  • Win:C:\Users\当前用户名\.gradle\wrapper\dists\gradle版本\沙盒路径\gradle版本\bin

若读者的电脑中尚未安装 gradle,则可在 Gradle 官方 下载安装。

以笔者使用的环境为例,gradle 命令所在目录为

~/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx/gradle-5.4.1/bin

将 gradle 命令所在目录添加到环境变量中

  • Mac:在 ~/.bashrc 中添加
export PATH=~/.gradle/wrapper/dists/gradle-5.4.1-all/3221gyojl5jsh0helicew7rwx/gradle-5.4.1/bin:$PATH
  • Win:在系统环境变量中添加
C:\Users\用户名\.gradle\wrapper\dists\gradle-5.4.1-all\805usxkvhgx6e1wbo8o64g0tx\gradle-5.6.1\bin

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#牛刀小试 "牛刀小试")牛刀小试

在命令行中输入

gradle --version

得到如下输出则表示 gradle 环境设置成功

------------------------------------------------------------
Gradle 5.4.1
------------------------------------------------------------

Build time:   2019-04-26 08:14:42 UTC
Revision:     261d171646b36a6a28d5a19a69676cd098a4c19d

Kotlin:       1.3.21
Groovy:       2.5.4
Ant:          Apache Ant(TM) version 1.9.13 compiled on July 10 2018
JVM:          1.8.0_171 (Oracle Corporation 25.171-b11)
OS:           Mac OS X 10.14.6 x86_64

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#自定义-Gradle-插件 "自定义 Gradle 插件")自定义 Gradle 插件

自定义 gradle 插件可以在以下三个地方创建,分别是:

  1. 构建脚本内
  2. buildSrc 模块内
  3. 单独项目

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#构建脚本内建方式 "构建脚本内建方式")构建脚本内建方式

build.gradle 内直接创建 Gradle 插件

优点:

  • build.gradle 中创建的插件将被自动编译并包含在 classpath 中,使用时无需在构建脚本内指定 classpath

缺点:

  • 此插件仅在当前构建脚本中有效,对外部文件不可见,无法在当前构建脚本以外的其他地方复用此插件

示例

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#1-创建-BuildInDemo-目录 "1.创建 BuildInDemo 目录")1. 创建 BuildInDemo 目录

mkdir BuildInDemo

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-在BuildInDemo目录内中新建-build-gradle-文件 "2.在BuildInDemo目录内中新建 build.gradle 文件")2. 在 BuildInDemo 目录内中新建 build.gradle 文件

cd BuildInDemo
touch build.gradle

使用 tree 命令查看创建后的目录结构,如下所示

BuildInDemo
.
└── build.gradle

0 directories, 1 file

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#3-在-BuildInDemo-build-gradle-内创建并应用-Gradle-插件,代码如下 "3.在 BuildInDemo/build.gradle 内创建并应用 Gradle 插件,代码如下")3. 在 BuildInDemo/build.gradle 内创建并应用 Gradle 插件,代码如下

// 1. 创建插件 BuildInPlugin
class BuildInPlugin implements Plugin<Project> {
    // 2. 应用插件时执行此函数
    @Override void apply(Project target) {
        println("hello form build-in plugin")
    }
}
//3. 应用插件
apply plugin: BuildInPlugin
 // 2\. 应用插件时执行此函数
 @Override void apply(Project target) {
 println("hello form build-in plugin")
 }
}
//3\. 应用插件
apply plugin: BuildInPlugin

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#4-构建此-build-gradle-文件 "4.构建此 build.gradle 文件")4. 构建此 build.gradle 文件

gradle build

Gradle 构建时将执行 build.gradle 中的代码,当执行到 apply plugin: BuildInPlugin 时,将会调用 BuildInPlugin 的实例方法 apply(Project p)。因此在构建过程中,可以看到如下输出,其中第 2 行即为上一步自定义插件中打印的内容,表明插件应用成功

> Configure project :
hello form build-in plugin

> Task :buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

classpath
No dependencies

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#buildSrc-模块方式 "buildSrc 模块方式")buildSrc 模块方式

rootProject/buildSrc 文件夹是 Gradle 的预留目录,用来存放当前项目私有 Gradle 插件的源代码与构建脚本

优点:

  • 项目构建时,Gradle 会自动编译项目目录下的 buildSrc 文件夹下的构建脚本和源码,并将其添加到项目构建脚本的 classpath 中,因此在使用 buildSrc 中创建的插件时,无需再手动指定 classpath
  • buildSrc 文件夹中构建脚本和 Gradle 插件同一项目均可见,因此同一项目中的其他模块也可以使用 buildSrc 中创建的插件

缺点:

  • 此处创建的插件对外部项目不可见,无法在其他项目中复用

示例

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#1-创建-PluginBuildSrcDemo-项目模块 "1. 创建 PluginBuildSrcDemo 项目模块")1. 创建 PluginBuildSrcDemo 项目模块

创建 PluginBuildSrcDemo 目录,并在该目录下创建 build.gradle 文件

mkdir PluginBuildSrcDemo && cd PluginBuildSrcDemo && touch build.gradle

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-创建-buildSrc-子模块 "2. 创建 buildSrc 子模块")2. 创建 buildSrc 子模块

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-1-在-PluginBuildSrcDemo-目录下创建buildSrc目录 "2.1 在 PluginBuildSrcDemo 目录下创建buildSrc目录")2.1 在 PluginBuildSrcDemo 目录下创建 buildSrc 目录
mkdir buildSrc
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-2-在-PluginBuildSrcDemo-buildSrc-目录下创建-buildSrc-子模块的构建脚本文件-build-gradle "2.2 在 PluginBuildSrcDemo/buildSrc 目录下创建 buildSrc 子模块的构建脚本文件 build.gradle")2.2 在 PluginBuildSrcDemo/buildSrc 目录下创建 buildSrc 子模块的构建脚本文件 build.gradle
cd buildSrc
touch build.gradle

PluginBuildSrcDemo/buildSrc/build.gradle 的内容如下

// 使用 plugins 块语法应用插件
plugins {
  // 应用 kotlin 插件
  id 'org.jetbrains.kotlin.jvm' version '1.3.50'
}
dependencies {
  // 仅在编译时使用 Grdale-API 依赖
  compileOnly gradleApi()
  // 在插件源码中添加 kotlin 标准库依赖
  implementation 'org.jetbrains.kotlin:kotlin-stdlib'
}
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-3-创建-buildSrc-模块的源码目录 "2.3 创建 buildSrc 模块的源码目录")2.3 创建 buildSrc 模块的源码目录
cd PluginBuildSrcDemo/buildSrc
mkdir -p /src/main/kotlin/com/example/plugin
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-4-创建插件文件PluginBuildSrc-kt "2.4 创建插件文件PluginBuildSrc.kt")2.4 创建插件文件 PluginBuildSrc.kt
cd PluginBuildSrcDemo/buildSrc/src/main/kotlin/com/example/plugin
touch PluginBuildSrc.kt

PluginBuildSrc.kt 的代码如下

package com.example.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class PluginBuildSrc : Plugin<Project> {
  override fun apply(target: Project) {
    println("hello from buildSrc plugin")
  }
}
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-5-声明-Gradle-插件的-ID-与实现类 "2.5 声明 Gradle 插件的 ID 与实现类")2.5 声明 Gradle 插件的 ID 与实现类

此步骤是可选的:若使用插件 ID 形式应用自定义插件,则必须进行此步骤;若使用插件实现类的形式应用自定义插件,则可跳过此步骤。

完成此步骤的方式有两种,任选其一即可

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#方式1-META-INF-方式 "方式1. META-INF 方式")方式 1. META-INF 方式

创建 PluginBuildSrcDemo/buildSrc/src/main/resources/META-INF/gradle-plugins 目录

cd PluginBuildSrcDemo/buildSrc
mkdir -p src/main/resources/META-INF/gradle-plugins

gradle-plugins 目录下创建 com.example.plugin.properties 属性文件,红色部分表示插件的 ID

cd src/main/resources/META-INF/gradle-plugins
touch com.example.plugin.properties

属性文件的内容如下,表示插件 ID 为 com.example.plugin 的插件所对应的实现类为 com.example.plugin.PluginBuildSrc

implementations-class=com.example.plugin.PluginBuildSrc
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#方式2-java-gradle-plugin-插件方式 "方式2. java-gradle-plugin 插件方式")方式 2. java-gradle-plugin 插件方式

java-gradle-plugin 是一个用于开发 Gradle 插件的辅助插件,它内置了很多辅助功能:

  1. 为宿主模块添加 gradlePlugin 配置块,可在此处配置插件的 ID 和实现类
  2. 为宿主模块添加 complile gradleApi() 依赖
  3. etc…

此处我们主要使用 gradlePlugin 配置块代替 META-INF 目录下的属性文件。java-gradle-plugin 的使用方式非常简单,只需在 PluginBuildSrcDemo/buildSrc/build.gradle 构建脚本文件中简单配置即可,如下所示。

 plugins {
      id 'org.jetbrains.kotlin.jvm' version '1.3.50'
+ //1. 应用 java-gradle-plugin 插件
+     id 'java-gradle-plugin' 
  }
     
  dependencies {
-     compileOnly gradleApi() // java-gradle-plugin 插件已为宿主添加 gradleApi 依赖,此行可移除 
      implementation 'org.jetbrains.kotlin:kotlin-stdlib'
  }
+ //2. 添加 gradlePlugin 配置块信息
+ gradlePlugin {
+     plugins{
+         // 此处的 tag 可以为任意名称
+         tag1{
+             id = 'com.example.plugin.buildsrc' //自定义插件的 ID
+             implementationClass  = 'com.example.plugin.PluginBuildSrc' //自定义插件的实现类
+         }
+     }
+ }

此时在 PluginBuildSrcDemo 目录下使用 tree 命令,可以看到当前的目录结构如下

PluginBuildSrcDemo
.
├── build.gradle
├── buildSrc
│   ├── build.gradle
│   └── src
│       └── main
│           └── kotlin
│               └── com
│                   └── example
│                       └── plugin
│                           └── PluginBuildSrc.kt
7 directories, 3 files

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#3-在-PruginBuildSrcDemo-项目模块中应用-buildSrc-中声明的-Gradle-插件 "3. 在 PruginBuildSrcDemo 项目模块中应用 buildSrc 中声明的 Gradle 插件")3. 在 PruginBuildSrcDemo 项目模块中应用 buildSrc 中声明的 Gradle 插件

PluginBuildSrcDemo/build.gradle 构建脚本文件中添加如下代码

//apply plugin: '插件 ID' 
apply plugin: 'com.example.plugin'
//apply plugin: 实现类
//apply plugin: com.example.plugin.PluginBuildSrc

应用插件时,指定插件 ID 或指定插件的实现类都可以,但指定插件 ID 的形式更为简短及灵活,在实际开发中也更为常见。

PluginBuildSrcDemo 目录下执行 gradle build 命令进行构建,可看到如下输出

> Configure project :
hello from buildSrc plugin

> Task :buildEnvironment
------------------------------------------------------------
Root project
------------------------------------------------------------
classpath
No dependencies

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 3s
1 actionable task: 1 executed

其中第 2 行是我们在 buildSrc 模块中定义的 Gradle 插件所打印日志,表明 buildSrc 模块 中的自定义插件在根项目中已生效。

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#4-创建-SubModule-子模块 "4. 创建 SubModule 子模块")4. 创建 SubModule 子模块

buildSrc 模块中定义的插件可以在同一项目的任意模块的构建脚本中使用,接下来便演示在 SubModule 子模块中的应用。

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#4-1-创建-SubModule-目录与构建脚本 "4.1 创建 SubModule 目录与构建脚本")4.1 创建 SubModule 目录与构建脚本
// 1. 在 PluginBuildSrcDemo 目录下创建 SubModule 目录
cd PluginBuildSrcDemo && mkdir SubModule
// 2. 在 SubModule 目录下新建 gradle 构建脚本 
cd SubModule
touch build.gralde

PluginBuildSrcDemo/SubModule/build.gradle 的内容如下

apply plugin: 'com.example.plugin'
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#4-2-将-SubModule-模块关联到-PluginBuildSrcDemo-项目中 "4.2 将 SubModule 模块关联到 PluginBuildSrcDemo 项目中")4.2 将 SubModule 模块关联到 PluginBuildSrcDemo 项目中

PluginBuildSrcDemo 目录下新建 settings.gradle 文件,内容如下

// 将SubModule 子模块添加到 PluginBuildSrcDemo 项目模块中
include ':SubModule'

此时在 PluginBuildSrcDemo 目录下使用 tree 命令,可以看到项目当前的目录结构如下

PluginBuildSrcDemo
.
├── SubModule
│   └── build.gradle
├── build.gradle
├── buildSrc
│   ├── build.gradle
│   └── src
│       └── main
│           └── kotlin
│               └── com
│                   └── example
│                       └── plugin
│                           └── PluginBuildSrc.kt
└── settings.gradle

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#5-在-SubModule-模块执行构建命令 "5. 在 SubModule 模块执行构建命令")5. 在 SubModule 模块执行构建命令

cd PluginBuildSrcDemo/SubModule
gradle build

得到如下输出

> Configure project :SubModule
hello from buildSrc plugin

> Task :SubModule:buildEnvironment

------------------------------------------------------------
Project :SubModule
------------------------------------------------------------

classpath
No dependencies

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#独立项目方式 "独立项目方式")独立项目方式

采用 buildSrc 模块方式时,Gradle 会妥善处理 buildSrc 模块的构建脚本与源码,并将其添加到当前项目的 classpath 中。但 buildSrc 方式的插件只能在项目内共享与复用,若要在其他项目中使用该插件,还需要再进行下列操作

  • 将插件发布到 maven 仓库(任意仓库)
  • 在需要应用该插件的构建脚本中的 repository 部分添加该插件所在的 maven 仓库
  • 在需要应用该插件的构建脚本中的 classpath 部分添加该插件对应的 maven 坐标 (group : id : version)

因为是在其他项目中使用该项目 buildSrc 模块 中的自定义 Gradle 插件,所以 Gradle 的 buildSrc 保留目录优势不再。如果将模块名由 buildSrc 修改为其他名称,则可将其称为独立的 Gradle 插件模块。

在本小节中,我们主要学习 gradle 插件的发布与使用。

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#1-创建-gradle-插件项目 "1. 创建 gradle 插件项目")1. 创建 gradle 插件项目

buildSrc 方式相同,先创建构建脚本与自定义插件类

mkdir StandaloneDemo 
cd StandaloneDemo
touch build.gradle
mkdir src/main/kotlin/com/example/plugin
touch src/main/kotlin/com/example/plugin/StandalonePlugin.kt

StandaloneDemo/build.gradle 的内容如下

plugins {
    id 'org.jetbrains.kotlin.jvm' version '1.3.50'
    id 'java-gradle-plugin'
}

gradlePlugin{
    plugins{
        sometag{
            id = 'com.example.plugin'
            implementationClass = 'com.example.plugin.StandalonePlugin'
        }
    }
}

StandaloneDemo/src/main/kotlin/com/example/plugin/StandalonePlugin.kt 的内容如下

package com.example.plugin

import org.gradle.api.Plugin
import org.gradle.api.Project

class StandalonePlugin : Plugin<Project> {
    override fun apply(target: Project) {
        println("hello from standalone plugin")
    }
}

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-将-gradle-插件发布到-maven-仓库 "2. 将 gradle 插件发布到 maven 仓库")2. 将 gradle 插件发布到 maven 仓库

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-1-在StandaloneDemo-build-gradle-文件中配置发布信息 "2.1 在StandaloneDemo/build.gradle 文件中配置发布信息")2.1 在 StandaloneDemo/build.gradle 文件中配置发布信息

使用 maven-publish 插件将自定义插件发布到本地 maven 仓库中,如下所示

plugins {
     id 'org.jetbrains.kotlin.jvm' version '1.3.50'
     id 'java-gradle-plugin'
+    //1. 应用 maven-publish 插件
+    id 'maven-publish'
 }
 
 gradlePlugin{
     plugins{
         sometag{
             id = 'com.example.plugin'
             implementationClass = 'com.example.plugin.StandalonePlugin'
         }
     }
 }
+//2. 设置发布相关配置
+publishing {
+    publications {
+        //3. 将插件发布到 maven 仓库
+        maven(MavenPublication) {
+                        //4. 设置插件的 maven 坐标
+            groupId 'com.example'//组织 ID
+            artifactId 'plugin'  //制品 ID
+            version 'snapshot'   //制品版本
+            from components.kotlin
+        }
+    }
+     //5. 设置发布仓库
+   repositories {
+       // 6. 发布到本地 maven 仓库 
+       mavenLocal()
+   }
+}
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#2-2-使用-publishMavenPublicationToMavenLocal-任务将插件发布到本地仓库 "2.2 使用 publishMavenPublicationToMavenLocal 任务将插件发布到本地仓库")2.2 使用 publishMavenPublicationToMavenLocal 任务将插件发布到本地仓库
cd StandaloneDemo
gradle publishMavenPublicationToMavenLocal

执行以上命令后,gradle 会把 StandaloneDemo 中的代码编译打包后发布到本地 maven 仓库中,本地 maven 仓库通常存放于当前用户目录下,具体路径为

  • Mac: ~/.m2/repository
  • Win:C:\Users\当前用户名\.m2\repository

我们可以在此目录下看到刚刚发布的插件,如下图所示

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#3-在其他项目中使用本地-maven-仓库中的-gradle-插件 "3. 在其他项目中使用本地 maven 仓库中的 gradle 插件")3. 在其他项目中使用本地 maven 仓库中的 gradle 插件

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#3-1-新建-OtherProject项目 "3.1 新建 OtherProject项目")3.1 新建 OtherProject 项目
mkdir OtherProject
cd OtherProject
touch build.gradle

build.gradle 的文件内容如下,相比 buildSrc 方式,应用时多了 11 行的 buildscript 相关的配置信息。

+buildscript {
+  repositories {
+    //1. 为当前构建脚本添加插件所在的 maven 仓库,本例中为 maven 本地仓库
+    mavenLocal()
+  }
+  dependencies {
+    //2. 为当前构建脚本添加如下依赖
+    //`com.exaple`、`plugin`、`snapshot` 是在上一步中设置的 maven 三维坐标
+    classpath 'com.example:plugin:snapshot'
+  }
+}
 //3. 应用独立插件项目中的自定义插件
 // apply plugin: '插件 ID'
 apply plugin: 'com.example.plugin'
[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#3-2-构建-OtherProject-项目 "3.2 构建 OtherProject 项目")3.2 构建 OtherProject 项目
cd OtherProject
gradle build

输入以上命令,得到如下输出

> Configure project :
hello from standalone plugin

> Task :buildEnvironment

------------------------------------------------------------
Root project
------------------------------------------------------------

classpath
\--- com.example:plugin:snapshot

A web-based, searchable dependency report is available by adding the --scan option.

BUILD SUCCESSFUL in 0s
1 actionable task: 1 executed

[](http://geek5nan.github.io/2019/09/07/Developing-Gradle-Plugin-1/#小结 "小结")小结

本文演示了 gradle 插件的三种创建方式,相关代码已上传至 github 中,点此即可查看。行文匆忙难免疏忽,如有遗漏还请斧正。

最后

我们今年整理了一份阿里P7级别的Android架构师全套学习资料,特别适合有3-5年以上经验的小伙伴深入学习提升。

主要包括腾讯,以及字节跳动,华为,小米,等一线互联网公司主流架构技术。如果你有需要,尽管拿走好了。

以下为我整理的资料免费分享;【阿里P7】Android高级教程+BAT面试题

1.Android高级技术脑图

2.P7级Android高级架构视频教程

3.Android核心高级技术PDF文档+BAT大厂面试真题解析

4.Android思维脑图(技能树)

1.Android高级技术脑图;

查漏补缺,体系化深入学习提升

2.【Android高级架构视频教程】;

全套部分展示;

java与Android内核进阶专题视频与源码

image

image

阿里P7级全套高级学习视频;

image

3.Android核心高级技术PDF文档,BAT大厂面试真题解析

4.Android思维脑图(技能树)

免费分享

【阿里P7】移动互联网架构师进阶高级教程+BAT面试题

为什么免费分享?

我的目的是让更多需要的Android开发朋友能够提升自己的技术水平
无论是Android,还是qq,微信,360等,想在互联网上最大程度推广,就必须免费!
如果我的学习资料对你有帮助,点个赞,谢谢!

相关文章
|
27天前
|
存储 运维 安全
构建高效自动化运维体系:Ansible与Docker的完美结合
【2月更文挑战第31天】 随着云计算和微服务架构的兴起,自动化运维成为保障系统稳定性和提升部署效率的关键手段。本文将详细探讨如何通过Ansible和Docker的结合来构建一个高效、可靠且易于管理的自动化运维体系。首先,介绍自动化运维的必要性及其在现代IT基础设施中的作用;然后,分别阐述Ansible和Docker的技术特点及优势;最后,提供一个基于Ansible和Docker结合使用的实践案例,以及实施过程中遇到的挑战和解决方案。
|
28天前
|
运维 Prometheus 监控
构建高效自动化运维系统的关键策略
【2月更文挑战第30天】随着云计算和微服务架构的兴起,现代IT运维环境变得愈加复杂多变。为保持业务连续性、提高响应速度并降低成本,企业亟需构建一个高效的自动化运维系统。本文将深入探讨自动化运维系统构建过程中的关键策略,包括工具和技术选型、流程优化、监控与告警体系搭建以及持续集成/持续部署(CI/CD)实践,旨在为读者提供一个清晰的构建蓝图和实用的实施建议。
|
28天前
|
运维 Kubernetes 监控
构建高效自动化运维体系:基于Docker和Kubernetes的实践指南
【2月更文挑战第30天】 在当今快速发展的云计算时代,传统的IT运维模式已难以满足业务的敏捷性和稳定性需求。本文深入探讨了如何通过Docker容器化技术和Kubernetes集群管理工具构建一个高效、可靠的自动化运维体系。文章首先概述了容器化技术和微服务架构的基本概念,随后详细阐述了基于Docker的应用打包、部署流程,以及Kubernetes在自动化部署、扩展和管理容器化应用中的关键作用。最后,文中通过案例分析,展示了如何在实际场景中利用这些技术优化运维流程,提高系统的整体效率和可靠性。
|
23天前
|
运维 监控 安全
构建高效自动化运维体系的五大关键步骤
在当今快速发展的IT环境中,自动化已经成为提高运维效率、减少人为错误和响应快速变化的关键。本文将深入探讨构建一个高效自动化运维体系的核心步骤,包括工具选择、流程设计、系统集成、安全策略以及持续改进。通过这些步骤,企业可以确保其运维团队能够更加高效地管理日常任务,同时保持系统的稳定性和安全性。
|
24天前
|
运维 监控 持续交付
构建高效自动化运维体系:策略与实践
在数字化时代,企业IT基础设施的管理和维护变得日益复杂。为了提高效率、降低错误率并快速响应市场变化,构建一个高效的自动化运维体系至关重要。本文将探讨自动化运维的核心策略,并通过实际案例分析展示如何将这些策略应用于日常管理中,以实现IT运维的优化。
15 0
|
28天前
|
人工智能 运维 监控
构建高性能微服务架构:现代后端开发的挑战与策略构建高效自动化运维系统的关键策略
【2月更文挑战第30天】 随着企业应用的复杂性增加,传统的单体应用架构已经难以满足快速迭代和高可用性的需求。微服务架构作为解决方案,以其服务的细粒度、独立性和弹性而受到青睐。本文将深入探讨如何构建一个高性能的微服务系统,包括关键的设计原则、常用的技术栈选择以及性能优化的最佳实践。我们将分析微服务在处理分布式事务、数据一致性以及服务发现等方面的挑战,并提出相应的解决策略。通过实例分析和案例研究,我们的目标是为后端开发人员提供一套实用的指南,帮助他们构建出既能快速响应市场变化,又能保持高效率和稳定性的微服务系统。 【2月更文挑战第30天】随着信息技术的飞速发展,企业对于信息系统的稳定性和效率要求
|
3天前
|
运维 Kubernetes Devops
构建高效自动化运维体系:DevOps与容器技术融合实践
【4月更文挑战第15天】 在当今快速发展的信息技术时代,传统的IT运维模式已难以满足业务敏捷性的需求。本文旨在探讨如何通过整合DevOps理念和容器技术来构建一个高效的自动化运维体系。文章将详细阐述DevOps的核心原则、容器技术的基础知识,以及两者结合的优势。此外,文中还将分享一系列实践经验,包括持续集成/持续部署(CI/CD)流程的搭建、微服务架构的应用,以及监控和日志管理策略的优化,以期帮助企业实现快速、可靠且安全的软件交付过程。
|
8天前
|
机器学习/深度学习 存储 运维
构建高效自动化运维体系的五大策略
【4月更文挑战第10天】在数字化转型的浪潮中,企业IT基础设施的复杂性与日俱增,传统的手动运维模式已难以满足快速响应和高效率的需求。本文将探讨构建一个高效自动化运维体系的五大策略,包括监控与告警的智能化、配置管理自动化、故障自愈能力的提升、日志管理的优化以及持续集成和部署(CI/CD)的实践。这些策略将帮助企业减轻运维负担,提高系统稳定性和业务敏捷性。
|
10天前
|
运维 监控 Kubernetes
构建高效自动化运维体系的实践与思考
【4月更文挑战第8天】在数字化时代,IT基础设施的复杂性日益增加,传统的手工运维模式已经难以满足快速响应和高效率的需求。本文将探讨如何通过自动化工具和策略构建一个高效的自动化运维体系,旨在提高系统的稳定性、减少人为错误以及优化资源分配。文章首先分析了自动化运维的必要性,接着介绍了实现自动化的关键技术和工具,并通过案例分析展示自动化运维体系的实际效果。最后,对自动化运维的未来发展趋势进行了展望。
|
10天前
|
存储 运维 监控
构建高效自动化运维体系的关键步骤
【4月更文挑战第8天】 在快速发展的IT环境中,自动化已成为提升运维效率和可靠性的核心驱动力。本文将详细探讨构建一个高效自动化运维体系的必经之路,从基础设施的自动化部署到监控、故障响应与修复,再到持续的性能优化。通过分析具体的技术实现和最佳实践案例,揭示如何利用现代技术栈打造能够支撑复杂服务架构的自动化运维平台。

热门文章

最新文章