logo头像

我有一个梦想

基于IDE插件的代码实时检测

本文于 326 天之前发表,文中内容可能已经过时。

基于IDEA插件的实时代码检测及推荐调研

背景

由于目前的移动端的崩溃和卡顿个数较多所以进行开发建设治理工具,通过工具化降低线上问题,提高App的稳定性

目标

通过实时获取开发者当前的开发内容

  1. 推荐适合当前语境的代码。eg:如使用Dialog时,提示其调用方式
  2. 发现当前代码存在问题,并提出解决方案。eg:文档汇总、MR中的优秀代码块

方案调研

基于目前的目标,我们考虑了两种方案:IDEA插件、Lint工具

Lint工具

lint规则书写是从问题角度出发,根据发生的问题进行规则书写,对推荐侧并不是强依赖,所以lint工具的局限性较强,局限在这些规则中。

IDEA插件

IDEA是当前主流的开发工具,当前开发Android的主流工具Android studio也是基于IDEA进行开发的。所以开发IDEA插件也可以在Android Studio中通用。

IDEA插件是什么?

以Android Studio为例,我们常用的project,Gradle的工具栏,底部的工具栏,如Logcat等都是IDEA插件,可以说在Android studio中你使用所有功能的绝大多数都是IDEA插件。如此强大的IDEA插件是因为,IDEA插件提供了多样化的SDK,可以使开发者在插件上实现各式各样的功能,满足多样化的需求。

插件方式

IDEA插件的创建有两种方式:DevKit插件 和 Gradle插件
而官方文档已经建议使用Gradle插件了,将 DevKit 插件迁移到 Gradle,所以本IDEA插件会采用基于Gradle的环境进行开发

使用介绍
  1. koltin适配:
    目前的IDEA插件允许行配置kotlin语言开发,并明确了kotlin开发在开发插件中的优势,配置Kotlin支持
    同时,如果有一些UI的开发工作,不太会使用swing搭建的,可以使用kotlin的DSL进行UI搭建。kotlin DLS 开发

  2. Plugin Content(插件内容):

    插件进行打包后生成的.jar文件包含:

    1. 配置文件(META-INF/plugin.xml
    2. 实现插件的功能类
    3. 插件的图标(META-INF/pluginIcon*.svg
  3. Bundling Plugin API Sources(绑定插件的API源):
    如果第三方插件使用Gradle IntelliJ 插件并向插件添加依赖项,该插件捆绑 ZIP 分发中的源代码,则当开发人员导航到 API 类时,源代码将自动附加到插件库并在 IDE 中可见。

  4. Plugin Class Loaders(插件类加载器):
    可以加载当前插件中找不到的类。

  5. Plugin Actions(插件动作):
    Actions是绝大部分插件会使用的方式,他是IDEA提供的一个动作的概念,比如点击工具栏按钮,使用快捷键,命令行触发
    img

    通过add-to-group配置,对Actions的触发条件进行设置,eg:绑定Command-N快捷键

  6. Plugin Extensions(插件拓展):
    可以理解为插件的入口,比如菜单栏,工具栏等众多拓展点,基本所有的东西都允许二次拓展,大概存在1424扩展点

  7. Plugin Listeners(插件监听器):

    IDEA插件中的监听器,通过消息总线的方式进行传输,插件方可根据自己的需求监听不同的监听器,执行不同的逻辑处理。目前存在211监听器

  8. Plugin Extension Points(插件拓展点):

    与Plugin Extensions对立,这里接入拓展点后,别的插件可以在你的基础上进行二次拓展

    1. 接口拓展:其他插件实现你的接口,进行拓展调用
    2. Bean拓展:其他插件可以使用你的data拓展你的插件,新增数据类型等
  9. Plugin Services(插件服务):

    插件服务的存在主要是确保只存在一个实例,即使他被多次调用

    • com.intellij.applicationService - 应用级别服务
    • com.intellij.projectService - 项目级别服务
    • com.intellij.moduleService - 模块级别服务(官方不推荐使用,会增加内存损耗)
  10. Components(组件):

    是一个被抛弃的东西,不支持动态加载,如果使用了,需要进行迁移

  11. Plugin Configuration File(插件配置文件):
    plugin.xml文件的语法

  12. Plugin Logo (Icon)(插件图标)

  13. Plugin Dependencies(插件依赖项)

IDEA插件结构

image-20221107212550157

对于非用户触发的操作通过一个队列进行管理,防止逻辑时间点相近导致短时间内重复请求,造成项目卡顿,服务超载的问题
对于用户触发的操作则直接进行处理,请求推荐算法获取结论,并展示在IDEA或者直接修复代码

结论

通过IDEA插件的Gradle形式可以实现对代码的动态监测,开发完毕后,需要对IDEA插件的性能进行分析,避免影响开发者的正常开发。