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

news2025/1/19 17:16:30
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">
    <!-- 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版本控制。

总结

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1790257.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算病理学的视觉语言基础模型| 文献速递-视觉通用模型与疾病诊断

Title 题目 A visual-language foundation model for computational pathology 计算病理学的视觉语言基础模型 01 文献速递介绍 数字病理学的快速普及和深度学习的进步使得可以开发出针对各种疾病和患者群体的各种病理学任务的强大模型。然而&#xff0c;由于医学领域标签…

解锁破解2024最新版会声会影,序列号注册码大揭秘!

会声会影2024是一款专业的视频编辑软件&#xff0c;它为用户提供了丰富的功能和工具&#xff0c;让用户能够轻松地制作出精美的视频作品。如果你是一位热爱视频制作的朋友&#xff0c;那么你一定不能错过这款软件。本文将为大家介绍会声会影2024的序列号注册码以及如何购买和使…

安徽某高校数据挖掘作业4-5 (与一些碎碎念)

1. 编写程序求函数、、的极限。 解答&#xff1a; import sympy as sp# 定义符号变量 x x sp.symbols(x)# 定义函数 f1 sp.sin(20 * x) / x f2 (1 4 * x)**(2 / x) f3 (1 4 / x)**(2 * x)# 计算极限 limit1 sp.limit(f1, x, 0) limit2 sp.limit(f2, x, 0) limit3 sp…

文件上传漏洞之upload-labs

前提&#xff1a; 本文中的以xshell命名的均为以密码为admin的一句话木马&#xff0c;而shell命名的则是由冰蝎工具生成的木马。 pass-01&#xff1a;js前端验证 测试性的上传一个一句话木马&#xff0c;发现被拦截了&#xff0c;而且根据推测大概率是前端检测&#xff0c;于…

开发人员申请Claude API Key教程:轻松获取Claude 3模型API Key并开发部署自己的Claude 3聊天应用

开发者如何申请并使用ClaudeAPI开发部署自己的Claude 3聊天应用 ClaudeAPI是由Anthropic公司开发的一款基于Claude模型的自然语言处理API服务。它可以帮助开发者在自己的应用中集成先进的自然语言理解和生成能力。本文将介绍如何申请和使用ClaudeAPI。 一、注册Anthropic账号 …

订单排队与链动模式塑造社交电商新格局

在数字化浪潮中&#xff0c;社交电商凭借其独特的魅力与潜力&#xff0c;正逐渐崭露头角。本文将解读一种融合了订单排队与链动模式的创新商业模式。这一模式旨在通过提高消费者复购率&#xff0c;优化销售流程&#xff0c;从而推动销售增长&#xff0c;塑造社交电商新生态。 …

【栈】736. Lisp 语法解析

本文涉及知识点 栈 LeetCode736. Lisp 语法解析 给你一个类似 Lisp 语句的字符串表达式 expression&#xff0c;求出其计算结果。 表达式语法如下所示: 表达式可以为整数&#xff0c;let 表达式&#xff0c;add 表达式&#xff0c;mult 表达式&#xff0c;或赋值的变量。表达…

Nacos注册中心 --学习笔记

Nacos注册中心是什么&#xff1f; 想象一下一个繁忙的购物中心&#xff0c;里面有很多商店&#xff0c;每个商店都在某个位置提供不同的商品或服务。这个购物中心有一个信息台&#xff0c;人们可以在这里查询任何商店的位置和提供的服务。等到有新的商店开张&#xff0c;或者现…

运维工具 - SFTP 和 FTP 的区别?

SFTP 和 FTP 的区别有三点 连接方式 SFTP 是在客户端和服务器之间通过 SSH 协议建立的安全连接来传输文件&#xff0c;而 FTP 则是 TCP 端口 21 上的控制连接建立连接。 安全性 SFTP 使用加密传输认证信息来传输数据&#xff0c;因此 SFTP 相对于 FTP 更安全的。 效率 SF…

DevOps全面综述:从概念到实践

一、背景与概述 1.1 DevOps的起源与发展 DevOps&#xff08;Development and Operations的缩写&#xff09;是软件工程领域中的一种文化和实践方法&#xff0c;旨在促进开发团队与运维团队之间的协作&#xff0c;从而实现更高效、更可靠的软件交付。DevOps起源于敏捷软件开发方…

应届生毕业择业必看!这三个朝阳行业错过就晚了!2024普通人赚钱的行业、2024最适合创业的项目

俗话说“男怕入错行&#xff0c;女怕嫁错郎”。尤其是对于现在的年轻人来说&#xff0c;一个好的处于上升期的行业&#xff0c;所能带来的收益是无法估量的。所以在这个大学生即将步入社会的毕业季&#xff0c;我们一起看看国家统计局发布的这份数据报告&#xff0c;来分析哪些…

机器学习18个核心算法模型

1. 线性回归&#xff08;Linear Regression&#xff09; 用于建立自变量&#xff08;特征&#xff09;和因变量&#xff08;目标&#xff09;之间的线性关系。 核心公式&#xff1a; 简单线性回归的公式为&#xff1a; , 其中 是预测值&#xff0c; 是截距&#xff0c; 是斜…

动态规划——浅谈dp如何入门,以及入门题目(值得收藏,持续更新)

前言 动态规划如何入门?如果你问我怎么精通,那我只能告诉你我也不知道,但你要问我怎么入门,那我就可以和你说道说道了. 我并没有能力也不想说你看完就会了,我只是想给大家开个头,你只要知道怎么写了怎么去思考了,你就可以通过刷题来强化思维了,能走多远就看各位的造化了! 动…

【全开源】知识库文档系统(ThinkPHP+FastAdmin)

&#x1f4da;知识库文档系统&#xff1a;解锁知识的无限可能 一款基于ThinkPHPFastAdmin开发的知识库文档系统&#xff0c;可用于企业工作流程的文档管理&#xff0c;结构化记录沉淀高价值信息&#xff0c;形成完整的知识体系&#xff0c;能够轻松提升知识的流转和传播效率&a…

QT: 读写ini配置文件(实现qml界面登录,修改)

目录 一.功能介绍 二.暴露属性 三.指定INI文件的路径和格式。 四.登录操作 1.检查INI文件中是否含有登录信息&#xff1b; 2.读取存储的ID&#xff1b; 3.读取存储的密码; 4.成功返回1&#xff1b;失败返回2&#xff1b; 五.修改账号 1.检查INI文件中是否含有登录信…

C# Onnx E2Pose人体关键点检测

C# Onnx E2Pose人体关键点检测 目录 效果 模型信息 项目 代码 下载 效果 模型信息 Inputs ------------------------- name&#xff1a;inputimg tensor&#xff1a;Float[1, 3, 512, 512] --------------------------------------------------------------- Outputs ---…

pycharm链接auto al服务器

研0提前进组&#xff0c;最近阻力需求是把一个大模型复现&#xff0c;笔者电脑18年老机子&#xff0c;无法满足相应的需求。因此租用auto dl服务器。本文记录自己使用pycharm&#xff08;专业版&#xff09;链接auto dl期间踩过的坑。 1.下载pycharm专业版 这一步不解释了&am…

智慧启航 网联无限丨2024高通汽车技术与合作峰会美格智能分论坛隆重举行

5月30日下午&#xff0c;以“智慧启航 网联无限”为主题的2024高通汽车技术与合作峰会&美格智能分论坛在无锡国际会议中心隆重举行&#xff0c;本次论坛由高通技术公司与美格智能技术股份有限公司共同主办&#xff0c;上海市车联网协会、江苏省智能网联汽车产业创新联盟、江…

Android 如何保证开启debug模式之后再启动

很多时候会需要debug看Android启动时候的一些数据&#xff0c;但很多时候会存在自己开启debug后app已经过了自己要debug的那段代码的时机了。 那么怎么样可以保证一定能让启动后不会错过自己要debug的那段代码执行的时机呢&#xff1f; 可以用下面这行命令&#xff0c;其中co…

LabVIEW版本控制

LabVIEW作为一种流行的图形化编程环境&#xff0c;在软件开发中广泛应用。有效地管理版本控制对于确保软件的可靠性和可维护性至关重要。LabVIEW提供了多种方式来管理VI和应用程序的修订历史&#xff0c;以满足不同规模和复杂度的项目需求。 LabVIEW中的VI修订历史 LabVIEW内置…