IDEA插件开发(13)---Dynamic Plugins
Posted 流子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IDEA插件开发(13)---Dynamic Plugins相关的知识,希望对你有一定的参考价值。
从2020.1版本开始,无需重新启动 IDE 即可在 IntelliJ 平台中安装、更新和卸载插件。
在插件开发期间,Auto-Reload还允许代码更改在沙盒 IDE 实例中立即生效。要测试动态安装是否正常工作,请验证安装本地构建分发是否成功(请参阅故障排除)。
请注意,生产环境中的任何卸载问题只会要求用户重新启动 IDE。
如果插件需要重新启动(例如,由于使用本机库)require-restart=“true”,请在plugin.xml中指定根标记。
限制
对于支持这一点的插件,必须满足下面列出的所有限制。要在本地验证插件,请调用Code | 分析代码 | 按名称运行检查…并运行插件 DevKit | 插件描述符 | Plugin.xml对所有插件描述符文件进行动态插件验证检查。
对于托管在JetBrains Marketplace上的插件,内置插件验证程序将自动运行这些检查。有关如何在本地或 CI 上运行它的更多信息,请参阅插件验证程序。
不使用组件
不得使用任何组件;现有的必须迁移到服务、扩展或侦听器。
操作组需要 ID
所有s 都必须声明一个唯一的id。
仅使用动态扩展
无论是在平台本身(扩展点和侦听器列表)中定义还是来自其他插件,所有使用的扩展点都必须明确标记为动态(参见下一段)。
一些不推荐使用的扩展点(例如,com.intellij.configurationProducer)是故意非动态的,它们的使用应该迁移到相应的替换。
将扩展点标记为动态
如果插件定义了自己的自定义扩展点,它们必须遵守特定的使用规则,然后明确声明准备好动态使用。
可根据扩展点进行配置
任何Configurable依赖于动态扩展点的都必须实现Configurable.WithEpDependencies。
不使用服务覆盖
不允许使用声明的应用程序、项目和模块服务。overrides=“true”
代码
加载和卸载插件发生在 EDT 和写入操作中。
缓存值
加载/卸载插件会清除所有使用CachedValuesManager.
不要存储 PSI
不要将 PSI 元素的引用存储在可以承受插件加载或卸载的对象中;改为使用SmartPsiElementPointer。
不要使用 FileType/Language 作为 Map Key
替换为Stringfrom Language.getID()/ FileType.getName()(使用检查插件 DevKit | Code | Map key may leak)。
插件加载/卸载事件
注册应用程序侦听器以接收插件加载/卸载事件的更新。DynamicPluginListener
这可用于取消长时间运行的活动或由于正在进行的进程而禁止卸载。
故障排除
卸载或更新插件时,IDE 会同步等待插件卸载,如果卸载失败,则请求重新启动。
使用目标 IDE 的最新可用版本进行验证。另请参阅与处理动态插件相关的已知平台问题列表。
日志记录
所有事件都com.intellij.ide.plugins.DynamicPlugins在 IDE 日志文件中的类别下进行跟踪。如果插件无法重新加载,日志将包含原因说明。
诊断泄漏
要查找阻止干净卸载的泄漏,请执行以下步骤:
验证 IDE 是否正在使用 VM 参数运行-XX:+UnlockDiagnosticVMOptions。使用GradlerunIde.jvmArgs += "-XX:+UnlockDiagnosticVMOptions"时,请另外指定Configure JVM Options。
将注册表项设置ide.plugins.snapshot.on.unload.fail为true(转到Navigate | Search Everywhere并键入Registry)。
触发插件重新加载。
打开插件卸载时生成的.hprof内存快照,查找插件 ID 字符串。IntelliJ Ultimate可以直接打开内存快照。
查找PluginClassLoader引用插件 ID 字符串
查看对PluginClassLoader实例的引用。
它们中的每一个都是需要解决的内存泄漏(或内存泄漏的一部分)。
完成第 1 步和第 2 步后,日志将包含有关内存泄漏的更多信息,例如,以下显示了将类加载器保留在内存中的字段引用链。
2020-12-26 14:43:24,563 [ 251086] INFO - lij.ide.plugins.DynamicPlugins - Snapshot analysis result: Root 1:
ROOT: Global JNI
sun.awt.X11.XInputMethod.clientComponentWindow
com.intellij.openapi.wm.impl.IdeFrameImpl.rootPane
com.intellij.openapi.wm.impl.IdeRootPane.myToolbar
com.intellij.openapi.actionSystem.impl.ActionToolbarImpl.myVisibleActions
java.util.ArrayList.elementData
java.lang.Object[]
com.example.ActionExample.
com.example.ActionExample.
- com.intellij.ide.plugins.cl.PluginClassLoader
其他提示
尝试更新版本的 IDE,在某些情况下平台错误可能是一个问题。
尝试全新的配置(例如,清理沙箱或使用不同的配置目录)。
以上是关于IDEA插件开发(13)---Dynamic Plugins的主要内容,如果未能解决你的问题,请参考以下文章
有人知道 IntelliJ Idea 的一些很酷的 PL/SQL 插件吗?