7

Android Studio 的代码插件开发

 2 years ago
source link: http://blog.agilestudio.cn/Android-Studio-ModelCodeGenerator/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

AgileStudio博客

独立开发者/技术分享/自由职业/外包软件定制

Android Studio 的代码插件开发

文章作者: 叶大侠

在对接API的时候,我们要根据出来的字段定义相关的数据模型,在复制粘贴几次之后,我开始厌倦这种没有半点技术含量的重复性工作,所以开始思考怎么把这个工作自动化,砍柴不误磨刀工,我相信额外的一点付出会带来效率的提升。

源码地址

码工们做的很多工作,很多时候是为了减少这个世界上的重复工作。在为这个世界带来便捷的时候,当然也要不忘给自己的工作减负,提高工作的效率啦。在对接API的时候,我们要根据出来的字段定义相关的数据模型,在复制粘贴几次之后,我开始厌倦这种没有半点技术含量的重复性工作,所以开始思考怎么把这个工作自动化,砍柴不误磨刀工,我相信额外的一点付出会带来效率的提升。

当前我们开发用的IDE是Android Studio, 大家都只都这个是基于intellij开发的,所以能集成在intellij里面就最好了。

目前我们的api文档有两种格式(规范不好的原因),一种是表格,字段名和类型信息都有了,如下:

字段 类型 描述

pkgFile String 包链接

gameId long 游戏id

channelName String 渠道名

另外一种就是偷懒的写法,直接把返回的Json贴上去:

{
2
    "id": 1,
3
    "gameName": "这是游戏标题",
4
    "gameRecommendText": "游戏一句话推荐",
5
    "cover": "封面图片",
6
    "ugcTime": "一天前",
7
    "gameIcon": "这是游戏图标",
8
    "gameDownloadUrl": "这是游戏下载链接",
9
    "ugcTitle": "这是资讯标题",
    "style": 1,
    "ugcViewCount": 333,
    "ugcSource": "咨询来源",
    "videoLength": "12'33''"
}

这里当然两种格式都要很好的支持啦,笔者发现表格直接在网页上复制,然后粘贴到文本输入框中的格式是非常整齐的空格隔开的,格式如下:

pkgFile String  包链接
2
gameId  long    游戏id
3
channelName String  渠道名

因此我们的数据源就很好确定了,而且也很方便。根据这两种数据源,我们约定:

  • 基本类型比如int,long和对应的类类型Integer则返回基本类型。
  • 没有类型信息或者其他类型用String类型。

下面我们就开始开始这个插件的开发探索吧,笔者希望能抛砖引玉,大家能在平时的工作中有意识根据自己的需要做出更多好用的工具,优化开发流程和开发效率。

intellij插件开发基础知识

这里我建议大家看官方的文档,已经介绍很详细了,我在下面也会简单介绍,传送门

  1. 下载安装intellij社区版: 下载地址
  2. 配置IntelliJ Platform Plugin SDK
  3. 创建一个Plugin Project
  4. 运行和调试
  5. 发布插件,这里我建议大家配置Ant来构建,我发现在引入libs包的时候生成的插件主工程会少很多文件,导致无法正常运行,用Ant打包就正常了。
  1. 配置Intellij SDK:
    打开Project Structure对话框[Ctrl+Shift+Alt+S],选择Intellij的目录:

intellij-project-stucture.png
2. 新建Plugin Project:

darcy_blog_intllij-platform-plugin-project.PNG
3. 新建完成工程目录结构:

intellij-project-resource.png

其中plugin.xml文件就是我们注册AnAction的地方。

AnAction介绍

AnAction就是IDE相关位置的事件触发处理的地方,要创建一个Action,只需要简单的两个步骤:

  1. 定义一个AnAction,你通常需要继承AnAction类,然后在actionPerformed方法里面实现你的操作。
  2. 在plugin.xml里面注册这个AnAction

intellij社区版里面创建Action非常方便,你可以通过图像界面很容易找到自己想要放置的Action位置,比如我们要在Code菜单下的Generate..```下面放置我们的Action,那么只需要在Groups中找到相应的位置即可:

darcy_blog_intellij-new-action.png

  • Action ID: 每个Action都需要一个唯一的ID.
  • Class Name: Action的类名,我们是在ithub.yedaxia.plugin.actions下面建的。
  • Name: 名字,就是在界面上我们看到的名字。
  • Description: 描述信息,鼠标放在上面一小段时间可以看到的描述信息。
  • Groups: 可以理解为Action集合。
  • Keyboard Shortcuts: 快捷键设置,这里我们暂时不需要了。

生成之后我们可以看到在plugin.xml里面就有对应的Action了:

<action id="CodeGenerationPlugin.EntryAction" class="github.yedaxia.plugin.actions.EntryAction"
2
            text="EntryGenerator..." description="Entry Code Generator">
3
      <add-to-group group-id="CodeMenu" anchor="after" relative-to-action="Generate"/>
4
</action>

对应的AnAction代码:

public class EntryAction extends AnAction {
2
    @Override
3
    public void actionPerformed(AnActionEvent e) {
4
        //点击EntryGenerator...按钮之后调用这个方法
5
    }
6
}

代码生成界面:

代码生成的逻辑并不复杂,我们把这个放到最后,本文还是着重介绍intellij插件的编写,现在我们已经有了程序的入口了,我们还需要一些简单的UI元素,一个对话框,一个简单的输入框[类名],比较大的文本框[数据源和生成的最终代码]。

先看最后的效果:

model-code-generator-dialog.png

intellij本身运行在Java上面,所以java swing库支持肯定是没问题的,这个对话框我主要参考了android-codegenerator-plugin-intellij里面的实现。

里面用到了com.intellij.openapi.ui.DialogBuilder,相关api文档没有找到,通过源码也不难发现其用法:

  • setTitle: 标题
  • setCenterPanel(JComponent centerPanel): 对话框中间面板,JComponent对于Java程序员应该就不陌生了。
  • addAction: 添加底部的按钮和相关事件。

具体的代码可以看: CodeDialogBuilder.java

代码生成主要包括两个步骤:

  1. 代码模板设计。
  2. 代码构建。

模板的设计也是参考了android-codegenerator-plugin-intellij项目,根据Model数据模板的特点,我分成了以下四个代码模板:

  1. Entry_template: 目标代码模板。
  2. Entry_Field_template: 类字段模板。
  3. Entry_Setter_template: setter方法模板。
  4. Entry_Setter_template: getter方法模板。

Json解析我用的是alibaba的fastjson,所以模板就是长下面的样子了,大家可以根据自己的需要去修改:

Entry:
2
public class ${CLASS_NAME} implements Serializable{
3
4
${FIELDS}
5
${METHODS}
6
}
7
8
Field:
9
private ${FIELD_TYPE} ${FIELD_NAME};
Getter:
@JSONField(name="${REMOTE_FIELD_NAME}")
public ${FIELD_TYPE} get${CASE_FIELD_NAME}(){
    return ${FIELD_NAME};
}
Setter:
@JSONField(name="${REMOTE_FIELD_NAME}")
public void set${CASE_FIELD_NAME}(${FIELD_TYPE} ${FIELD_NAME}){
20
    this.${FIELD_NAME} = ${FIELD_NAME};
21
}

具体的代码构建过程这里就不详细讲了,大家可以移步github,这个过程应该不难理解。如果觉得这个插件有用,你可以给个star。

这个工具的开发过程比我想象中要简单很多,一天时间左右应该就差不多完成的了,后续带来的好处和省下来的时间肯定会弥补回这个时间代价,有些码工经常会觉得麻烦或者根本没有这个意识,宁愿麻烦一些也不愿意去写个工具来加速自己的工作,我觉得是不可取的,我们应该用重构和工具去避免写重复的代码,把更多的时间放到有价值和有创造性的工作上面来,从中长期来看,这样带来的好处是巨大的,更快的开发速度、鲁棒性更好的系统等,更重要的是个人也获得了成长。

关于Agile Studio工作室

我们是一支由资深独立开发者和设计师组成的团队,成员均有扎实的技术实力和多年的产品设计开发经验,提供可信赖的软件定制服务。

未经声明,本站文章均为原创,转载请附上链接:
http://blog.agilestudio.cn/Android-Studio-ModelCodeGenerator/


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK