准备工作

首先我们需要安装Idea,因为Androidstudio是基于Idea社区版开发的,所以我们要使用Idea去开发插件,以及运行,发布等功能。

运行Idea->新建工程,创建Ide插件

https://cdn.mucute.cn/blog/24/2/1709134467.767202.png

创建成功之后我们在左侧会看到插件的目录

配置

resources下存放我们需要的资源

META-INF/plugin.xml是我们插件的配置文件(名称,版本,行动,扩展点,服务等等)

我们现在project.gradle.kts中将intellij块中修改为一下内容,目的是为了让我们运行插件的时候打开Android Studio便于我们去测试

localPath是我们AndroidStudio所在的根目录,这里我是用的是Mac系统

1
2
3
4
5
intellij {
pluginName = properties("pluginName")
localPath="/Applications/Android Studio.app/Contents"
plugins = properties("platformPlugins").map { it.split(',').map(String::trim).filter(String::isNotEmpty) }
}

然后我们在plugin.xml中加入Android Studio的依赖

我们需要在<idea-plugin>标记下加入以下内容

1
2
<depends>org.jetbrains.android</depends>
<depends>com.intellij.modules.androidstudio</depends>

开发向导插件

编写TestProvider

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class TestProvider : WizardTemplateProvider() {

override fun getTemplates(): List<Template> {
return arrayListOf(temp())
}

private fun temp() = template {
val icon = TestProvider::class.java.getResource("/icons/profile.png")
name = "Simple插件"
thumb = { Thumb(path = { icon!! }) }
description = "创建Simple插件工程"
category = Category.Compose
constraints = arrayListOf(TemplateConstraint.Compose)
formFactor = FormFactor.Mobile
minApi = 27
screens = arrayListOf(WizardUiContext.NewProject)
widgets(LabelWidget("111"))
recipe = {
val data = (it as ModuleTemplateData)

}
}
}

这里我来解释下template

Template就是我们在创建工程界面看到的模板,以及我们可以看到的一些配置信息

https://cdn.mucute.cn/blog/24/2/1709135652.082999.png

https://cdn.mucute.cn/blog/24/2/1709135692.481915.png

这里我们使用Kotlin Dsl去创建Template

name是我们模板的名称

thumb是模板的图标

description是模板描述

category是我们在右键菜单中添加的位置

https://cdn.mucute.cn/blog/24/2/1709136054.668754.png

constraints表示我们创建什么类型的工程

formFactor是我们在创建工程界面选择创建设备类型的标识

https://cdn.mucute.cn/blog/24/2/1709136281.976515.png

screens是我们的模板可以存在于界面的上下文菜单中

widgets()可以创建我们的自定义字段(LabelWidget,TextFieldWidget,CheckBoxWidget.等)

recipe是在点击创建按钮之后我们需要进行操作的⌚️,里面包含了一下方法以便于我们使用,添加依赖,Compose设置等

在完成以上内容之后我们还需要在plugin.xml中添加扩展点,才可以正常使用我们创建的模板

1
2
3
<extensions defaultExtensionNs="com.android.tools.idea.wizard.template">
<wizardTemplateProvider implementation="cn.mucute.simple.plugin.wizard.TestProvider"/>
</extensions>

我们点击Ide右上角的运行按钮

https://cdn.mucute.cn/blog/24/2/1709136681.654252.png

会自动运行Android Studio并且安装我们开发的插件,就可以看到现实效果了

模快向导

创建并写入一下内容

SkippableWizardStep可以设置可见性的Step,可以通过前一个Step来控制跟在其后的Step可见性,例如一个Step提供了一些选项给用户,并根据用户的选择来决定之后哪些Steps可以被展示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class TestModuleDescriptionProvider : ModuleDescriptionProvider {
override fun getDescriptions(project: Project): Collection<ModuleGalleryEntry> {
return arrayListOf(TestModuleGalleryEntry())
}
}

class TestModuleGalleryEntry : ModuleGalleryEntry {
override val description: String
get() = "1"
override val icon: Icon
get() = IconUtil.moveUpIcon
override val name: String
get() = "Test"

override fun createStep(
project: Project,
moduleParent: String,
projectSyncInvoker: ProjectSyncInvoker
): SkippableWizardStep<*> {
return object : SkippableWizardStep<TestModel>(TestModel(), "1") {
override fun getComponent(): JComponent {
return JLabel("1")
}
}
}

}

并添加扩展点

1
2
3
<extensions defaultExtensionNs="com.android">
<moduleDescriptionProvider implementation="cn.mucute.simple.plugin.wizard.TestModuleDescriptionProvider"/>
</extensions>

然后我们运行插件

右键添加模快,就可以看到实现的效果了

https://cdn.mucute.cn/blog/24/2/1709136934.352934.png