IDE 和 Gradle 的关系

6 篇文章 0 订阅
2 篇文章 0 订阅

   业界流行的IDE,比如Eclipse,JetBrains全家桶,Android Studio 等,都采用的是插件式架构设计模式,Intellij 底座相当于是一个插件管理器,为上层的插件提供完整的插件声明周期管理,VFS,Messageing,线程模型,UI 事件模型等框架服务能力以及技术基础设施的API等,在这种架构模式下,IDE首先有一个核心底座,其中提供的插件管理的机制,因此用户可以通过该机制,开发自己的Intellij 插件集中到底座中,来完成定制化需求和功能,例如在Android Studio 中就包含一个 Android APK  Support的插件:

Intellij 官网:https://www.jetbrains.com/zh-cn/

 

  该插件就是Google 专为android 开发提供的一个可安装在Intellij 上的插件,同样可以把该插件安装到 Intellij 上,使其具备开发android 应用的能力。具体的功能包括,比如IDE 上的build菜单,project structure中相关数据的可视化,apk的分析显示等。

  Gradle的Intellij 插件:

  Gradle 也提供了一个Gradle Plugin,来解决IDE上编译构建自动化的问题,提供了自动个性化,编译构建,打包部署等的一个插件服务和框架。

 Gradle Plugin 主要提供的是在IDE 上Gradle project 的相关管理,比如improt gradle project;run gradle scripts等,其主要功能也集中在IDE 右侧的gradle 页签中:

  

Gradle 的构建插件:

 在进行Gradle 构建时,Gradle 会读取项目中每个Module 中build.gradle的用户的自定义的配置,来实现自定义的构建和自动的依赖解析等,Gradle 提供了一个Java 开发的构建插件,其中包含java源码的编译打包,测试等基础Task,用户可以通过在build.grdle中进行配置:

    

同样android 也提供了自己的AGP(android gradle plugin)来实现用户的个性化apk的打包,测试,部署等。其中android{} 闭包中的内容,就是AGP 中提供的给用户个性化定制的构建的内容。

因此整个IDE 从构建的角度,可以大致分为两个部分,一个是IDE,一个是Gradle 构建系统,从代码的角度可以分为三个部分:

  Intellij 底座代码对应的jetbrains 开源代码:

   https://github.com/JetBrains/Intellij-community

 对应的资料:

  https://plugins.jetbrains.com/docs/intellij/welcome.html?from=jetbrains.org

ADT 部分代码及对应android support 插件的开源代码:  

  https://github.com/JetBrains/android

Gradle 构建插件代码对应的adt-tools-base中部分代码:

 https://github.com/JetBrains/adt-tools-base

从功能模块的角度可以分为四个部分:

  1.Intellij 的平台底座,这部分是整个IDE的核心,其他所有的功能模块和服务等都需要调用其提供的各种能力,比如VFS,插件的生命周期管理,通信机制等,主要在Intellij-community中

  2.Intellij 的Gradle插件,主要是Intellij 针对gradle提供的插件服务,其他插件如果需要与gradle进行交互,都可以通过集成这一套机制,来实现自己的数据处理和解析,主要在intellij-community/plugins/gradle中

  3.ADT,主要是android提供的用于andorid开发的Intellij插件,实现的定制Android 工程的管理功能服务,主要在intellij/community/android/tools/idea/gradle

 4.AGP,主要是android 的构建插件,提供andorid 应用的一系列配置dsl和打包的自动化构建任务,主要在intellij/community/android/tools-base/build-system

  

了解了整个IDE和gradle之间的关系,Android Studio 中的ADT 是如何通过Gradle 插件中提供的接口,调用Gradle Tooling Api ,调用Gradle Tooling Api 来获取AGP 中解析的用户配置的构建数据,依赖信息的。

 

ADT与AGP 信息通信的机制:

   Gradle Tooling API 

   gradle 可以集成到很多三方的工具中,比如IDE ,CI 构建平台:

   一些常见的集成平台和IDE可以参考Gradle 官方文档:

    https://docs.gradle.org/current/userguide/third_party_integration.html

   一般与Gradle交互和集成存在两种场景:

    1.gradle执行构建时使用其他工具

    2.其他工具来执行Gradle 提供的构建任务

  第一种场景就是我们常用的,在Gradle构建插件,或者Gradle脚本中添加Task来调用 三方工具来完成某些任务,第二种场景常见的就是通过Tooling API来把Gradle嵌入三方工具中,以便工具和gradle进行交互。

  Tooling API 的主要特性:

   Gradle Tooling API 的一个基本特征是,它是独立于版本的,这意味着可以使用相同的API 来处理使用不同的Gradle版本的构建。Tooling API 来吧Gradle 嵌入三方工具中,以便工具和 gradle 进行交互。

 Tooling API 的主要特征:

  Gradle Tooling API 的一个基本特征是,它是独立于版本的,这意味着可以使用相同的API 来处理使用不同的Gradle 版本的构建。Tooling API 可以感知到Gradle的包装其,并且在默认情况下,使用与基于Wrapper的构建相同的Gradle版本。

提供的特性包括:

 1.查询项目的详细信息,包括项目的层次结构和项目的依赖项,外部依赖项(包括源和javadocjar),源目录和每个项目的任务。

 2.执行构建并监听 stdout 和 stderr 日志记录和进度消息(例如,当你在命令行上运行时,在状态栏上显示)

 3.执行特点的测试类或测试方法

 4.在执行构建时接受感兴趣的事件,例如项目配置,任务执行和测试执行。

 5.取消正在运行的生成

 6.结合多个单独的Gradle 构建到一个单一的复合构建

 7.Tooling API 可以下载并安装适当的Gradle版本类似于包装器

 8.实现是轻量级的,仅具有少量依赖,同时也是一个行为良好的库,不对类加载器结构或日志记录配置进行任何假设。这使得该API 易于嵌入到应用程序中。

 

Gradle Tooling API 中主要的入口是GradleConnector,可以通过GradleConnector.connect()来创建一个ProjectConnection,然后与一个Gradle,Project来进行连接,通过这个连接,你可以执行任务,测试,或者解析相关的Models来获取相关信息:

 具体可以参考:https://docs.gradle.org/current/userguide/javadoc/org/gradle/tooling/GradleConnector.html

 案例:https://github.com/bmuschko/tooling-api-custom-model

AGP 中的Build-model:

  在AGP 中,android 定义了很多Build-model接口类来提供数据,主要集中在 tools-base工程 /build/system/builder-model/src/main/java/com/android/builder/model中,其中包含61个接口类:

开源代码地址:

   https://github.com/JetBrains/adt-tools-base/tree/master/build-system/builder-model/src/main/java/com/android/builder/model

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

焱宣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值