请教一个关于 idea 插件开发中兼容各个 IDE 版本的问题

2023-10-14 17:30:56 +08:00
 HangoX

我开发了一个 android studio 的插件,用到了部分 android studio 的代码,但是到 as 的某个版本之后,这个类没了,改为另外一个类。

这个时候我遇到了一个问题,就是如果我改 target 为新的 as 作为目标,虽然可以使用这个新的类,然后适配新的 as ,但是旧版本的 as 就不能使用了(表现就是直接找不到这个类)。

请问如果我要同时兼容两个 as 版本,一般都是怎么做的? 我能想到的方法就是

  1. 不同的兼容版本在不同的分支上,然后分别维护,增加新功能每个分支都提交一下
  2. 编写兼容类,然后用反射确定使用什么类
1177 次点击
所在节点    程序员
11 条回复
zeal7s
2023-10-14 17:37:44 +08:00
可以拿到当前 as 的版本号吗?拿到的话就能用 if else 做个判断
zeal7s
2023-10-14 17:39:43 +08:00
@zeal7s
1. 在不同分支上操作管理起来太麻烦了
2. 反射感觉有点不太优雅
BBCCBB
2023-10-14 17:52:31 +08:00
jetbrains 的很多插件都是要使用新版本就必须升级 ide 到高版本的.
HangoX
2023-10-14 19:42:15 +08:00
@zeal7s 类不见了,是编译不过,升级后编译可以过,但是不同的类,加载直接报错

@BBCCBB as 的代码质量有点差,很多时候不是想升级就能升级的,还有就是刚好是个分割线,一般都是部分人先升级上去的
zeal7s
2023-10-14 20:29:37 +08:00
@HangoX 没有 c/c++/c#类似的#if 宏吗?
lisongeee
2023-10-14 22:00:20 +08:00
> as 的代码质量有点差,很多时候不是想升级就能升级的,还有就是刚好是个分割线,一般都是部分人先升级上去的

这点确实没毛病,kts 的语法高亮老是报错,还有就是 R 资源提示未发现符号

虽然不影响运行 gradle build ,但是真的很影响开发体验
HangoX
2023-10-15 01:37:40 +08:00
@lisongeee 你要是去看看 android studio 的源码,你会发现实际情况更差,什么沙雕代码都有
@zeal7s java 不是用这种方式实现,对于 C 来说编译用宏,实际上,java 编译用不同的 module compile 即可,但是不管 c 和 java 都要解决运行时问题
danbai
2023-10-15 08:11:53 +08:00
idea 插件可以设置使用的版本号,你可以维护两个版本。
learningman
2023-10-15 13:06:34 +08:00
加个版本限制,分开发布,新的特性 backport 到旧版本上。
你去看 jb 自己的插件也是这么搞的。
HangoX
2023-10-15 15:25:36 +08:00
@danbai 看来只能这样,有点蛋疼

@learningman 看起来很蛋疼,但是既然官方是这样,我就只能是这样了
ikas
2023-10-15 17:48:00 +08:00
兼容类
java 中没啥好办法

我自己的一个安卓项目,使用了不同版本的内置 api

dependencies {
api platform(project(':bom'))
implementation project(":system-common")
implementation project(":system28")
implementation project(":system29")
implementation project(":system30")
implementation project(":system31")
implementation project(":system32")
implementation project(":system33")
implementation project(":system34")
}

if (AndroidVersionUtil.getVersion() >= 34) {
permissionManager = new PermissionManager34();
....
} else if (AndroidVersionUtil.getVersion() >= 33) {
permissionManager = new PermissionManager33();
...
} else if (AndroidVersionUtil.getVersion() >= 32) {
permissionManager = new PermissionManager32();
....
}
...

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/981979

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX