赞
踩
Android Studio是一种常用的集成开发环境(IDE),用于开发Android应用程序。它提供了许多功能和工具,可以帮助开发人员更轻松地构建和调试Android应用程序。
如果你想开发Android Studio插件,以下是一些基本步骤:
这只是一个简单的概述,帮助你入门Android Studio插件开发。要深入了解插件开发的详细内容,你可以查阅Android Studio和IntelliJ平台的官方文档,并参考一些示例代码和教程。祝你成功开发自己的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开发很多很多的界面啦!
使用步骤其实也很简单,总共就下载和安装两步。
创建模板代码也是只有简简单单的两步。
敲黑板,重点来了。通常情况下,我们使用的Android Studio版本是不一致的,除非我们心灵相通,比较默契,是吧!首先你要查看你当前使用的Android Studio的版本。
把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/,然后照着本文前面所提到的本地安装插件的步骤就可以了。
最后,我觉得还是有必要简单讲解下插件的源码。
目录结构大概是这样的。插件代码在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能实现的内容。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。