准备工作
首先我们需要安装Idea
,因为Androidstudio
是基于Idea
社区版开发的,所以我们要使用Idea去开发插件,以及运行,发布等功能。
运行Idea->新建工程,创建Ide插件
创建成功之后我们在左侧会看到插件的目录
配置
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
就是我们在创建工程界面看到的模板,以及我们可以看到的一些配置信息
这里我们使用Kotlin Dsl去创建Template
name
是我们模板的名称
thumb
是模板的图标
description
是模板描述
category
是我们在右键菜单中添加的位置
constraints
表示我们创建什么类型的工程
formFactor
是我们在创建工程界面选择创建设备类型的标识
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右上角的运行按钮
会自动运行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>
|
然后我们运行插件
右键添加模快,就可以看到实现的效果了