IDE插件开发简介

Android Studio是一种常用的集成开发环境(IDE),用于开发Android应用程序。它供给了许多功用和工具,能够协助开发人员更轻松地构建和调试Android应用程序。

如果你想开发Android Studio插件,以下是一些根本过程:

  1. 保证你现已装置了最新版其他Android Studio。你能够从官方网站(developer.android.com/studio)下载并安…
  2. 了解Android Studio插件的根本结构和原理。Android Studio插件是基于IntelliJ平台构建的,因此你能够经过学习IntelliJ插件开发来了解Android Studio插件的开发。
  3. 创立一个新的插件项目。在Android Studio中,挑选”File” -> “New” -> “New Project”,然后挑选”IntelliJ Platform Plugin”作为项目类型。
  4. 定义你的插件。你能够经过插件描绘文件(plugin.xml)来指定插件的名称、版别、依靠项等信息。
  5. 完成插件的功用。依据你的需求,你能够运用Java或Kotlin编写插件的代码。你能够运用IntelliJ平台供给的API来访问和操作Android Studio的功用和组件。
  6. 编译和运转插件。在Android Studio中,挑选”Run” -> “Run ‘plugin_name'”来编译和运转你的插件。这将发动一个新的实例,并加载你的插件。
  7. 测验和调试插件。你能够运用Android Studio的调试功用来调试你的插件代码。在开发过程中,保证测验你的插件在各种情况下的行为和兼容性。
  8. 打包和发布插件。一旦你完成了插件的开发和测验,你能够将插件打包为一个JAR文件,并上传到Android Studio的插件商场(plugins.jetbrains.com/androidstud…

这仅仅一个简略的概述,协助你入门Android Studio插件开发。要深化了解插件开发的详细内容,你能够查阅Android Studio和IntelliJ平台的官方文档,并参阅一些示例代码和教程。祝你成功开发自己的Android Studio插件!

Dora SDK的Android Studio插件介绍

Dora SDK github.com/dora4/dora ,是由Dora开发的,没错,便是我,一款高效开发Android App的根底架构。而Dora Android Studio Plugin则供给了方便运用Dora SDK的功用,即以图形化界面的方式,创立继承自dora.BaseActivity的Activity类和继承自dora.BaseFragment的Fragment类。这样就方便了咱们高效地运用Dora SDK开发许多许多的界面啦!

Android Studio插件开发 - Dora SDK的IDE插件

依靠Dora SDK的Android Studio插件

运用过程其实也很简略,总共就下载和装置两步。

Android Studio插件开发 - Dora SDK的IDE插件

运用Dora SDK的Android Studio插件创立模板代码

创立模板代码也是只要简简略单的两步。

Android Studio插件开发 - Dora SDK的IDE插件

Android Studio插件开发 - Dora SDK的IDE插件

经过插件源码编译合适自己Android Studio版别运用的插件包

敲黑板,要点来了。通常情况下,咱们运用的Android Studio版别是不一致的,除非咱们心灵相通,比较默契,是吧!首要你要检查你当时运用的Android Studio的版别。

Android Studio插件开发 - Dora SDK的IDE插件

Android Studio插件开发 - Dora SDK的IDE插件
把AI后边的这一串数字仿制下来。IDEA有许多分支变体版别,AI就代表咱们的Android Studio。

然后修正gradle的装备,

compileKotlin {
    kotlinOptions.jvmTarget = 你的jdk版别
}
compileTestKotlin {
    kotlinOptions.jvmTarget = 你的jdk版别
}
// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
    plugins = ['Kotlin', 'android']
    version.set("你的Android Studio版别,如213.7172.25.2113.9123335")
    // Android Studio的代号是AI
    type.set("AI")
}

JDK的版别在[File] – [Project Structure]中装备。咱们还要装备一下咱们项目的类型为Gradle项目。点击[Edit Configrations],挑选Gradle,点OK,然后就能够编译插件了。编译后的插件生成目录为dora-studio-plugin/build/libs/,然后照着本文前面所提到的本地装置插件的过程就能够了。

插件源码讲解

最终,我觉得还是有必要简略讲解下插件的源码。

Android Studio插件开发 - Dora SDK的IDE插件

目录结构大概是这样的。插件代码在kotlin目录下,资源则在resources目录下。咱们先从resources/META-INF/plugin.xml看起,里边装备了插件的一些根本信息,重要的是这个进口。

<extensions defaultExtensionNs="com.android">
    <!-- Add your extensions here -->
    <tools.idea.wizard.template.wizardTemplateProvider
        implementation="com.dorachat.templates.recipes.DoraTemplateWizardProvider"/>
</extensions>

这儿装备了一个模板向导供给者。

package com.dorachat.templates.recipes
import com.android.tools.idea.wizard.template.WizardTemplateProvider
class DoraTemplateWizardProvider: WizardTemplateProvider() {
    override fun getTemplates() = listOf(MVVMActivityTemplate, MVVMFragmentTemplate)
}

由于咱们总共有两套模板,所以这儿列出这两套模板的类名。以MVVMActivityTemplate为例。

package com.dorachat.templates.recipes
import com.android.tools.idea.wizard.template.*
import com.android.tools.idea.wizard.template.impl.activities.common.MIN_API
import java.io.File
object MVVMActivityTemplate : Template {
    override val category: Category
        get() = Category.Activity
    override val constraints: Collection<TemplateConstraint>
        get() = emptyList()     //AndroidX, kotlin
    override val description: String
        get() = "创立一个dora.MVVMActivity,来自https://github.com/dora4/dora"
    override val documentationUrl: String?
        get() = null
    override val formFactor: FormFactor
        get() = FormFactor.Mobile
    override val minSdk: Int
        get() = MIN_API
    override val name: String
        get() = "MVVM Activity"
    override val recipe: Recipe
        get() = {
            mvvmActivityRecipe(
                    it as ModuleTemplateData,
                    activityClassInputParameter.value,
                    activityTitleInputParameter.value,
                    layoutNameInputParameter.value,
                    packageName.value
            )
        }
    override val uiContexts: Collection<WizardUiContext>
        get() = listOf(WizardUiContext.ActivityGallery, WizardUiContext.MenuEntry, WizardUiContext.NewProject, WizardUiContext.NewModule)
    override val useGenericInstrumentedTests: Boolean
        get() = false
    override val useGenericLocalTests: Boolean
        get() = false
    override val widgets: Collection<Widget<*>>
        get() = listOf(
                TextFieldWidget(activityTitleInputParameter),
                TextFieldWidget(activityClassInputParameter),
                TextFieldWidget(layoutNameInputParameter),
                PackageNameWidget(packageName),
                LanguageWidget()
        )
    override fun thumb(): Thumb {
        return Thumb { findResource(this.javaClass, File("template_mvvm_activity.png")) }
    }
    val activityClassInputParameter = stringParameter {
        name = "Activity Name"
        default = "MainActivity"
        help = "The name of the activity class to create"
        constraints = listOf(Constraint.CLASS, Constraint.UNIQUE, Constraint.NONEMPTY)
        suggest = { layoutToActivity(layoutNameInputParameter.value) }
    }
    var layoutNameInputParameter: StringParameter = stringParameter {
        name = "Layout Name"
        default = "activity_main"
        help = "The name of the layout to create for the activity"
        constraints = listOf(Constraint.LAYOUT, Constraint.UNIQUE, Constraint.NONEMPTY)
        suggest = { activityToLayout(activityClassInputParameter.value) }
    }
    val activityTitleInputParameter = stringParameter {
        name = "Title"
        default = "Main"
        help = "The name of the activity. For launcher activities, the application title"
        visible = { false }
        constraints = listOf(Constraint.NONEMPTY)
        suggest = { buildClassNameWithoutSuffix(activityClassInputParameter.value, "Activity") }
    }
    val packageName = defaultPackageNameParameter
}

这儿是不是装备了一些创立模板的信息?包括编译的最低sdk版别,有哪些输入框等等。这些输入控件需求指定输入类型的参数,如stringParameter。suggest表明输入的建议,简略的说,便是让其他输入框的内容跟当时输入的内容联动。还有一个要点便是这个recipe,它决定了这个模板代码怎么去生成。

package com.dorachat.templates.recipes
import com.android.tools.idea.wizard.template.*
import com.android.tools.idea.wizard.template.impl.activities.common.generateManifest
import com.dorachat.templates.recipes.app_package.res.layout.mvvmActivityXml
import com.dorachat.templates.recipes.app_package.res.layout.mvvmFragmentXml
import com.dorachat.templates.recipes.app_package.src.mvvmActivity
import com.dorachat.templates.recipes.app_package.src.mvvmActivityKt
import com.dorachat.templates.recipes.app_package.src.mvvmFragment
import com.dorachat.templates.recipes.app_package.src.mvvmFragmentKt
import java.lang.StringBuilder
fun RecipeExecutor.mvvmActivityRecipe(
        moduleData: ModuleTemplateData,
        activityClass: String,
        activityTitle: String,
        layoutName: String,
        packageName: String
) {
    val (projectData, srcOut, resOut) = moduleData
    generateManifest(
            moduleData = moduleData,
            activityClass = activityClass,
//            activityTitle = activityTitle,
            packageName = packageName,
            isLauncher = false,
            hasNoActionBar = false,
            generateActivityTitle = false,
    )
    if (projectData.language.equals(Language.Kotlin)) {
        save(mvvmActivityKt(projectData.applicationPackage ?: packageName, packageName, activityClass,
                buildBindingName(layoutName), layoutName), srcOut.resolve("${activityClass}.${projectData.language.extension}"))
    }
    if (projectData.language.equals(Language.Java)) {
        save(mvvmActivity(projectData.applicationPackage ?: packageName, packageName, activityClass,
                buildBindingName(layoutName), layoutName), srcOut.resolve("${activityClass}.${projectData.language.extension}"))
    }
    save(mvvmActivityXml(packageName, activityClass), resOut.resolve("layout/${layoutName}.xml"))
    open(resOut.resolve("layout/${layoutName}.xml"))
}

如果要考虑比较周全,肯定是Java和Kotlin言语开发的项目代码都要能生成,然后创立Activity类的一起也把对应的布局xml文件也创立了,并且打开给运用者看一下,便于直接添加到git版别操控。

总结

有兴趣的同学能够参阅插件项目的源代码,github.com/dora4/dora-… 和Dora SDK的源代码github.com/dora4/dora 。别的,我的开发套件三驾马车分别是dora、dcache和dview,你也能够称为“三剑客”。这是运用Android Studio插件开发代码生成模板的一个事例,插件开发还能够完全自定义功用,本文篇幅有限,就不细说了,大概是经过Action作菜单按钮和Java Swing作为图形界面,开发任意Java能完成的内容。