Android Studio 插件开发实战

Android Studio 插件开发实战

  • 1.搭建IntelliJ IDEA开发环境
  • 2.配置插件项目
  • 3.开发插件
  • 4.发布和安装插件

AndroidStudio中有许多插件,比如生成set/get方法、生成toString方法等,这些插件可以辅助我们进行快捷的开发。
Android Studio 插件开发实战_第1张图片
我们也可以自己开发插件,比如我们想在一个model类中,自动生成所有private变量的get方法,当然AndroidStudio自带插件已经支持了,这里我们只是以这个例子为入手点,看下如何开发一个IDE插件。

1.搭建IntelliJ IDEA开发环境

首先去官网下载IntelliJ IDEA开发工具,初始配置时,点击右下角Configuration的Structure For New Projects设置面板。
Android Studio 插件开发实战_第2张图片
然后在SDKs选项里,配置一个新的Plugin SDK版本。

  • Home path选择IntelliJ IDEA的Contents/路径即可
  • java版本选择1.8即可,最好不要太高,否则插件可能无效
    Android Studio 插件开发实战_第3张图片
    最后可以在Project选项里,配置一下工程默认的SDK版本,指向我们刚配置的版本即可,这样每个Project默认都会走我们配置的版本。
    Android Studio 插件开发实战_第4张图片

2.配置插件项目

IDE环境搭建好后,我们开始创建一个Plugin插件项目,并确保SDK版本正确,然后进行下一步。
Android Studio 插件开发实战_第5张图片
然后就是输入project名称即可完成创建。
Android Studio 插件开发实战_第6张图片
我们先来看下生成的project结构。
Android Studio 插件开发实战_第7张图片
其实就是有一个plugin.xml,估计都能猜到,这个文件就是插件的配置文件。

<idea-plugin>
  <id>com.your.company.unique.plugin.idid>
  <name>GenerateGetMethodPluginname>
  <version>1.0version>
  <vendor email="[email protected]" url="http://www.yourcompany.com">YourCompanyvendor>

  <description>
      most HTML tags may be used
    ]]>description>

  <change-notes>
      most HTML tags may be used
    ]]>
  change-notes>

  
  <idea-version since-build="173.0"/>

  
  <depends>com.intellij.modules.platformdepends>

  <extensions defaultExtensionNs="com.intellij">
    
  extensions>

  <actions>
    
  actions>

idea-plugin>

配置内容很简单,都是一些插件的基本信息就不赘述了;底部的actions标签,就是我们稍后要添加的插件具体功能,我们管每一个插件的功能叫做一个Action,所以一个插件中,可以定义多个Action。
我们在包中,右键创建一个Action类。
Android Studio 插件开发实战_第8张图片
弹窗中,我们需要配置Action的各种参数。

  • Action ID:action的id,自己定义一个就好
  • Class Name:action的类名
  • Name:展示给用户看的功能名称
  • Description:对功能的解释
  • Groups:该功能按钮展示在哪里,这里我们选择GenerateGroup里,就是我们用于生成get/set方法的那个快捷键,所弹出的功能列表里,当然可以选择很多地方,比如菜单栏里的Code、Analyze等,甚至可以自己新加一项
  • Anchor:该功能展示在功能列表的何处,这里我们选择First第一个位置
  • Keyboard Shortcuts:定义快捷键

Android Studio 插件开发实战_第9张图片
创建好后,会生成一个GenerateGetMethodAction的类,同时在plugin.xml配置文件中自动进行了配置。

<actions>
  
    <action id="GenerateGetMethodAction.Plugin" class="com.cwj.plugin.GenerateGetMethodAction" text="GenerateGetMethod"
            description="GenerateGetMethod">
        <add-to-group group-id="GenerateGroup" anchor="first"/>
    action>
actions>

3.开发插件

下面开始正式开发我们的功能,首先生成的Action类,需要我们实现actionPerformed方法。

public class GenerateGetMethodAction extends AnAction {

    @Override
    public void actionPerformed(AnActionEvent anActionEvent) {
    }
}

该方法的AnActionEvent参数,可以获取当前执行环境的各种信息,比如:

  • anActionEvent.getData(LangDataKeys.PSI_FILE)获取当前操作的文件,是一个PsiFile类型
  • anActionEvent.getData(LangDataKeys.EDITOR)获取当前鼠标的光标信息

那么我们需要怎么做呢?
首先应该要获取当前所在的model类文件:

PsiFile psiFile = anActionEvent.getData(LangDataKeys.PSI_FILE);

为了获取该文件对应的各种类信息,需要转换为PsiClass对象进行操作:

if (psiFile instanceof PsiJavaFile) {
    PsiClass[] classes = ((PsiJavaFile) psiFile).getClasses();
    if (classes.length > 0 && classes[0] != null) {
        PsiClass psiClass = classes[0];
    }
}

有了class后,就可以获取类的所有field,并且我们只需要过滤出private且非static的field:

Arrays.stream(psiClass.getFields())
        .filter(it -> it != null && it.hasModifierProperty(PsiModifier.PRIVATE) && !it.hasModifierProperty(PsiModifier.STATIC))
拿到应该生成get方法的field后,以字符串的形式生成get方法即可:
List<String> methods = Arrays.stream(psiClass.getFields())
        .filter(it -> it != null && it.hasModifierProperty(PsiModifier.PRIVATE) && !it.hasModifierProperty(PsiModifier.STATIC))
        .map(psiField -> {
            String name = psiField.getName();
            return "public " + psiField.getType().getCanonicalText() +
                    " get" + name.substring(0, 1).toUpperCase() + name.substring(1) +
                    "() { return this." + name + "; }";
        }).collect(Collectors.toList());
  • PsiField的getType即为field的类型

我们拿到了所有要生成的get方法字符串形式集合,最后一步就是添加到PsiClass中:

new WriteCommandAction(psiFile.getProject(), psiFile) {
    @Override
    protected void run(@NotNull Result result) throws Throwable {
        PsiElementFactory psiElementFactory = PsiElementFactory.SERVICE.getInstance(psiFile.getProject());
        methods.forEach(s -> {
            psiClass.add(psiElementFactory.createMethodFromText(s, psiClass));
        });
    }
}.execute();
  • 写操作要异步进行,使用WriteCommandAction
  • 增加method只需要字符串即可,很方便

至此,一个简单的生成get方法的插件就完成了!

4.发布和安装插件

插件完成后,我们就可以制定版本号并发布,版本号在上述的xml配置文件中指定即可。
1.2
发布时,我们可以上传到官方仓库,这里我们只上传到本地即可:点击菜单栏的Build-Prepare Plugin Module xxx For Deployment,即可发布到本地,默认位置为项目根目录中,是一个jar包。
在AndroidStudio中,我们可以通过IDE的Preferences进入到Plugin设置,选择从本地磁盘加载插件即可。
Android Studio 插件开发实战_第10张图片
最后重启AndroidStudio,插件就生效了!
Android Studio 插件开发实战_第11张图片
Android Studio 插件开发实战_第12张图片

参考资料:

  • 官方文档:https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/deploying_plugin.html
  • https://blog.csdn.net/w855227/article/details/79483966

你可能感兴趣的:(android相关,知识积累)