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


    IDE插件开发简介

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

    如果你想开发Android Studio插件,以下是一些基本步骤:

    1. 确保你已经安装了最新版本的Android Studio。你可以从官方网站(https://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的插件市场(https://plugins.jetbrains.com/androidstudio)或其他适当的位置。

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

    Dora SDK的Android Studio插件介绍

    Dora SDK
    https://github.com/dora4/dora ,是由Dora开发的,没错,就是我,一款高效开发Android App的基础架构。而Dora Android Studio Plugin则提供了快捷使用Dora SDK的功能,即以图形化界面的方式,创建继承自dora.BaseActivity的Activity类和继承自dora.BaseFragment的Fragment类。这样就方便了大家高效地使用Dora SDK开发很多很多的界面啦!

    product.png

    依赖Dora SDK的Android Studio插件

    使用步骤其实也很简单,总共就下载和安装两步。

    install-jar.png

    使用Dora SDK的Android Studio插件创建模板代码

    创建模板代码也是只有简简单单的两步。

    step1.png

    step2.png

    通过插件源码编译适合自己Android Studio版本使用的插件包

    敲黑板,重点来了。通常情况下,我们使用的Android Studio版本是不一致的,除非我们心灵相通,比较默契,是吧!首先你要查看你当前使用的Android Studio的版本。

    截屏2023-05-20 02.46.08.png

    截屏2023-05-20 02.47.41.png
    把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/,然后照着本文前面所提到的本地安装插件的步骤就可以了。

    插件源码讲解

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

    截屏2023-05-20 02.55.46.png

    目录结构大概是这样的。插件代码在kotlin目录下,资源则在resources目录下。我们先从resources/META-INF/plugin.xml看起,里面配置了插件的一些基本信息,重要的是这个入口。

    <extensions defaultExtensionNs="com.android">
        
        <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版本控制。

    总结

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

  • 相关阅读:
    复旦大学-华盛顿大学EMBA项目位列全球第9,学术研究连续3年亚洲第一
    云原生爱好者周刊:使用 Cilium 和 Grafana 实现无侵入可观测性
    毕业设计 大数据电商用户行为分析 -python 大数据
    git bash 的make 又在搞事情
    pytorch_神经网络构建3
    Dockerfile
    ios- Gesture
    前端开发:JS中字符串拼接的总结
    Excel快速对齐表格的中姓名(两个字姓名和三个字姓名对齐)
    栈的三道oj【C++】
  • 原文地址:https://blog.csdn.net/a_lwh____/article/details/139382318