Android Studio 插件开发:New Module 与 OHOS

背景
在做 KMP 工程化时,官方不支持 OHOS,对应的 Android Studio 插件也不会自动带 OHOS 目录(例如新建 module 时)。Kuikly 提供了 project 模板,但没有 New Module 模板,所以需要自己研究「在 AS 里增加一种 Module Type」的插件开发。
一、创建插件工程
先安装 Plugin DevKit,按文档创建工程即可。
二、添加本地依赖(Android Studio)
开发的是 Android Studio 插件,dependency 要选 Android Studio 平台及对应版本。版本列表:https://plugins.jetbrains.com/docs/intellij/android-studio-releases-list.html。
若指定了对应版本,会自动下载该版本 AS;若本机已有,可直接用本地路径,不必再下:
dependencies {
intellijPlatform {
local("/Applications/Android Studio.app/Contents")
bundledPlugins(listOf(
"com.intellij.java",
"org.jetbrains.kotlin",
"org.jetbrains.android",
))
}
}
这样才能引用 AS 内置的代码。
三、New Module:IDEA 与 Android Studio 的差异
网上教程多是 Action 开发,这块按文档做即可。但要做 New Module 界面、在图中红色位置增加一种 Module Type,就卡住了:

官方文档:Module Types
步骤大致是:1)添加一个 module type;2)实现 module type 和 module builder。
按文档在 IDEA 上配置 dependency 后,New Module 里确实会多出一个 type;但 Android Studio 纹丝不动。
四、Android Studio 的 New Module:用 AGP 扩展点
查不到现成方案,只能看 Android Studio 源码:Android Studio 源码预览。
最后发现要用 AGP 的扩展,而不是纯 IntelliJ 的 Module Type:
<extensions defaultExtensionNs="com.android">
<moduleDescriptionProvider implementation="com.xxxxx.YourModuleDescriptionProvider"/>
</extensions>
把相关代码 copy 到自己的工程里,就能在 Android Studio 的 New Module 里多出一种 type。
4.1 核心逻辑简述
- 实现 ModuleDescriptionProvider,并给出 ModuleGalleryEntry(名称、描述、图标、createStep 等)。
- createStep 继承 ConfigureModuleStep,重写 createMainPanel 做 UI;同时绑定一个 Model,Model 有 render 方法负责渲染模板。实际可以按需求简化,不必完全照搬 KMP 那套。
部分示例(plugin.xml 注册 + Provider + Step + Model 骨架):
// plugin.xml
// <extensions defaultExtensionNs="com.android">
// <moduleDescriptionProvider implementation="com.XXX.TestModuleDescriptionProvider"/>
// </extensions>
class TestModuleDescriptionProvider : ModuleDescriptionProvider {
override fun getDescriptions(project: Project): Collection<ModuleGalleryEntry> = listOfNotNull(
if (StudioFlags.NPW_NEW_KOTLIN_MULTIPLATFORM_MODULE.get())
KotlinMultiplatformLibraryModuleTemplateGalleryEntry() else null,
)
private class KotlinMultiplatformLibraryModuleTemplateGalleryEntry : ModuleGalleryEntry {
override val name: String = "Your Library Name"
override val description: String = "your library description"
override val icon: Icon = IconLoader.getIcon("/icons/your_icon.png", this::class.java.classLoader)
override fun createStep(project: Project, moduleParent: String, projectSyncInvoker: ProjectSyncInvoker): SkippableWizardStep<*> {
return ConfigureKmpLibraryModuleStep(KmpModel(project, moduleParent, projectSyncInvoker), name)
}
}
}
// ConfigureKmpLibraryModuleStep:createMainPanel 做 UI,onProceeding 里 set template
// KmpModel:继承 ModuleModel,实现 TemplateRenderer,recipe 里生成目录/文件(可塞入 ohos 目录等)
若要定制目录结构(例如强制带 OHOS 目录),需要在 Model 的 renderer / recipe 里自己改。
五、总结
- 给 Android Studio 增加 Module Type,不能只按 IntelliJ 的 Module Type 文档做。
- 新版本 Android Studio 需要注册 moduleDescriptionProvider(
com.android命名空间),并参考 KMP 插件实现 Provider 和对应的 Step、Model。 - 额外定制(目录、模板内容)需要深入改 Model 和 recipe。