360Qtest专栏 手把手教你 Android Studio 插件从开发到发布官方

simple · 2017年06月02日 · 最后由 simple 回复于 2017年06月05日 · 207 次阅读
本帖已被设为精华帖!

前言

好久没有为社区做贡献了,甚是惭愧。前不久组里先后发了《jenkins 集成 monkey》,《火线教你如何开发 Jenkins 插件》等实际动手的文章,想整理一下从创建到发布自己的 AS 插件整个详细的过程记录发布出来,希望给有需求的同行借鉴和使用。

自定义 AS 插件的需求来自于我们的静态代码扫描工具在公司推进过程中,开发同事提出希望能在研发流程中集成火线到他们的 IDE 中,方便直接本地扫描。公司大部分 Android 产品的研发团队已经强制使用 Android Studio,所以才着手开发了这个插件,闲话少说,开始介绍。

文中图片比较多,为了方便读者更直观的了解,一步一步按照步骤来操作即可。

环境准备

  • 安装 JDK 和 SDK 环境

    • 本地 JDK 版本,建议 1.8 版本

    • SDK 请升级到最新,我本地 API 已经升级到 25
  • 安装 IntelliJ IDEA

创建工程

创建插件项目,千万不要选错项目类型,File -> New Project,参考下图:

此处有两点需要注意:

  • 左边选择 Intellij Platform Plugin
  • SDK 选择正确的版本,底下 Groovy 和 Scala 不用管

项目介绍

  • 目录结构

创建项目完成后,目录大概是这样的:

  • Plugin.xml

plugin.xml是整个项目的核心配置文件,一些 Action、Extension 组件需要在这里先进行注册和声明,和 AndroidManifest.xml 注册组件类似。
以火线插件项目为例:

< id >: 插件的 ID,唯一性标识,上传到官方仓库如果如果有重复的 ID 是不能提交成功的,建议以工程 package 路径为 ID。

< name >: 显示在插件仓库列表中的名称。

< version >:插件版本。如果和之前版本号相同则不允许提交,所以每次提交仓库记得修改版本号,历史版本显示在官网插件详情页中。

< description >:插件的描述信息,会显示在插件详细说明中。

< change- notes >:更新日志,建议每个版本更新的内容都在这里描述。

< vendor >:宣传网址、联系邮件,公司信息写在这里。

< idea-version since-build="141.0" >:IDE 的 branch number,这里不用修改。

  • 创建一个 action 开发插件的最终目的当然是让它干活,所以需要从第一个 action 入手。在 src 目录点击右键 -> New -> Action,正确填写字段,例如:

Action ID:Action 的 ID,项目中可能会有多个 ID,不能相互重复,否则 plugin.xml 中会报错。
Class Name:Action 类名
Name:菜单项中显示的文字,常见的比如 run,go 等字样
Description:描述文字
Groups: Action 的类型,比如我选择的 ToolsMenu,则 action 会出现在工具栏 “Tools” 下拉列表中,以此类推如 “Edit”、“File”、“Run” 等等。Anchor 是指 action 在菜单中的位置。

创建完成 Action 后可以直接运行,这里需要提一下 run 的 edit configuration 设置,可以参考我的截图,创建一个类型为 plugin 的运行任务,这里我起名字为 run,如下图所示。

创建成功后点击 IDE 右上角的绿色三角形箭头,启动后会看到这样的效果:

成功创建 action 后,项目会自动在 plugin.xml 的节点增加刚刚填写的属性,如上图第一个箭头所指。

启动插件工程后,在工具栏 “Tools” 中就可以找到 “ShowMeTheMoney” 这个 action 了。此时点击没有反应,因为 action 还没有任何逻辑实现。如果想要 action 去执行工作,需要在刚刚新建的 action 类中的 actionPerformed() 方法中实现代码逻辑。在方法中加入如下代码:

Messages.showDialog("Hello,火线!", "Selected Element:", new String[]{"OK"}, -1, null);

再次点击运行后,点击 Tools -> ShowMeTheMoney,得到提示:

至此,我们完成了从创建 Action 到产生效果的全部过程。

右键菜单运行 action

火线插件有一种场景,就是选中 project 或单个文件点击右键菜单 FireLine -> Run 来执行项目扫描,如何实现这个场景?大家应该注意到此时 Run 事件是在 FireLine 菜单项下了。
很简单,打开 plugin.xml 在 Actions 节点中添加如下代码:

在 id 为 “com.qtest.MainMenu”,文本为 “Sample” 的 group 中增加名为 “ShowMeTheMoney” 的 Action,运行一下就出现下图的效果:

点击 “ShowMeTheMoney” 运行效果如同 Tools 中一样,此时 Tools 列表中依然存在这个 Action 选项。如果我想给 action 加个红心 icon,可以在 Action 节点中增加 icon 属性,比如 icon="/resources/icons/Heart_16px.png",运行后的效果如下:

打包&上传仓库

  • 导出插件安装包 选择插件工程,单击右键,选最底下的选项,如下图:

完成后会在当前工程目录下产生一个 jar(或 zip)文件,就是可安装的 AS 插件。安装方式是 File -> settings -> plugin -> Install plugin from disk,选中刚刚生成的.jar 文件安装后,重启 Android Studio 即可。

  • 上传官方仓库
    • 打开官方网站:https://plugins.jetbrains.com/
    • 注册 jetbrans 账户,并登录
    • 点击右上角的 “UPLOAD PLUGIN”
    • 根据提示一步一步选择
      • CATEGORY 选择 “Administration Tools”
      • 点击 “选择文件” 上传 jar(zip)包
      • 点击上传,成功后得到提示信息,等待审核即可

注意 1:第一次上传插件要有英文描述,否则会不能通过审核。
注意 2:AS 插件想要在官方仓库被找到,切记要在 plugin.xml 中把节点的注释去掉,否则默认只能在 Intellij IDEA 的仓库中找到,我就遇到这个坑。

共收到 5 条回复 时间 点赞

这应该是社区第一篇写 AS 插件开发和发布的文章,开眼界了。

话说,火线现在有在计划做阈值校验功能吗?类似于设定 xx 级别的问题数量大于 xx 后,扫描命令 exit code 不为 0 。这样会更方便把火线接入持续集成或者 git commit hook ,更好地止住静态扫描发现的问题数量。

陈恒捷 将本帖设为了精华贴 06月04日 01:49

红色的心很亮😊 😊

陈恒捷 回复

这个想法挺好的,不过 360 的流程比较麻烦,就是第一层面我们只拦截 block 的问题,第二个层面就是审计人员看到 block 问题还需要确认一下,举个例子:Androidmanifest 文件中组件导出过多,这个在安全那边是会警告,但是我们的手机助手项目和 360 浏览器项目必须开放上百个组件,这样直接 exit code 会出大问题。所以这边暂时还是采取比较柔和的方式来处理。

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册