目录

Android Studio 插件开发:New Module 与 OHOS

背景

在做 KMP 工程化时,官方不支持 OHOS,对应的 Android Studio 插件也不会自动带 OHOS 目录(例如新建 module 时)。Kuikly 提供了 project 模板,但没有 New Module 模板,所以需要自己研究「在 AS 里增加一种 Module Type」的插件开发。


一、创建插件工程

参考:IntelliJ 创建插件项目

先安装 Plugin DevKit,按文档创建工程即可。

注意
JDK 版本随 Platform 版本不同有要求,需对照文档。

二、添加本地依赖(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,就卡住了:

/img/in-post/as_module_type.jpg

官方文档: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 需要注册 moduleDescriptionProvidercom.android 命名空间),并参考 KMP 插件实现 Provider 和对应的 Step、Model。
  • 额外定制(目录、模板内容)需要深入改 Model 和 recipe。