Android Studio Assistant 基础功能 —— Action

本文涉及的产品
mPaaS订阅基础套餐,标准版 3个月
简介: 快速玩转 AS Assistant —— 更多交互即刻实现

0527banner.jpg
小 M 自从上次发布了新版 IDEA 插件之后,Assistant 新颖的接入方式收到了一致好评,但是第一版的 Assistant 只有介绍和基础接入功能,老板希望小M多加一些功能,比如像 Firebase 接入的时候,有按钮显示接入状态,可以 apply 一些 Gradle 的插件等等功能。


Ⅰ 起源 —— Action

这些肯定难不倒小 M,我们只要参考下 Firebase 的集成就好了。其实我们大部分业务开发都是基于“事件”这个模型的,包括普通的 Web 后端和前端上的开发,IDEA 相关的内容也不例外,IDEA 响应的用户的动作一般都是 Action,比如点击菜单里的某一项,就是响应 AnAction 的操作。比如我们举个例子,在之前 Assistant 相关的 xml 中,有如下代码:

<action key="mpaas.integrate_dependencies" label="点击添加">
  ....
</action>

我们需要对这个 Action 做处理,根据之前 firebase 相关的集成方式,首先需要在 plugin.xml 中注册如下内容:

<extensions defaultExtensionNs="com.android.tools.idea.assistant">
  <actionHandler implementation="com.alipay.mpaas.assistant.actions.MPIntegrateBaselineActionHandler" />    
</extensions>

在这个类中,复写getId()方法:

class MPIntegrateBaselineActionHandler: AssistActionHandler {
​
  companion object {
    const val ACTION_KEY = "mpaas.integrate_dependencies"
  }
​
  override fun getId() = ACTION_KEY
}

这样就和上面 xml 中的内容对应上了,它提供了一个 handlAction 方法,我们可以在这里写逻辑:

override fun handleAction(actionData: ActionData, project: Project) {
    ....
  }

那这里就是小助手和我们代码连接的地方了,经过以上的说明,对于响应事件这件事,我们就已经做完了。


Ⅱ 操作 Gradle 文件

第二步,就是操作 Gradle 文件了。IDEA 插件里面其实没有内置 Gradle 引擎(显然也不合算),但是它通过 Psi 提供了对 Gradle DSL 解析的弱支持(不是完整支持)。同时提供了一些语义化的模型来简化这个问题。
我们注意到 Android Studio 提供了这么一个类 GradleBuildModel 在 Anroid Studio 3.6 中,它提供的接口如下:
640.png
看 android / buildscript / dependencies / ext 我们马上可以知道,这里对应我们 build.gradle 中几个 DSL 的 block,比如我们需要往 buildscript 中加入特定的 maven,用来拉取 sdk 或者 gradle 插件的话,那么按如下方式操作:

① 获取与修改 GradleBuildModel

GradleModelProvider.get().getBuildModel(project)
    //or
GradleModelProvider.get().getBuildModel(module)

GradleBuildModel 一般是在 sync 完成之后,会被 AS 缓存起来,我们能以 O(1) 的效率去获取,然后我们这边还是以 buildscript 为例,它对应 BuildScriptModel,在 build.gradle 中的内容如下:

buildscript {
    ext.mpaas_artifact = "mpaas-baseline"
    ext.mpaas_baseline = "10.1.68-5"
    repositories {
        mavenCentral()
        jcenter()
        google()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.6.3'
    }
}

那么我们往repositories添加一个阿里云的 maven 仓库的方式就很简单了,我们调用RepositoriesModeladdMavenRepositoryByUrl方法。

repositoriesModel.addMavenRepositoryByUrl("https://maven.aliyun.com/repository/central")

② 回写 GradleBuildModel

这一步改完后,在 BuildModel 就暂存了刚刚的内容,我们还需要把这块内容回写回去:

WriteCommandAction.runWriteCommandAction(project, buildModel::applyChanges)

最终实现效果如下:
20200528143338130.png

③ 添加复杂 Maven DSL 表达式

当然,上面视频里面展示的效果是添加一个比较复杂的 maven 配置,有 name / credential 等配置,因为 RepositoriesModel 只给我们提供了添加 url 一种方式,如果想实现以上的效果,我们需要使用反射的方式,操作 GradleDslBlockModel 的方式来进行。

val myDslElementField = GradleDslBlockModel::class.java.getDeclaredField("myDslElement")
myDslElementField.isAccessible = true

val myDslElement: GradlePropertiesDslElement = myDslElementField.get(repositoryModel) as GradlePropertiesDslElement

val nameElement = GradleNameElement.create("maven")
val mavenDslElement = MavenRepositoryDslElement(myDslElement, nameElement)
val mavenCredentialsDslElement = MavenCredentialsDslElement(mavenDslElement)

mavenCredentialsDslElement.setNewLiteral("username", "xxx")
mavenCredentialsDslElement.setNewLiteral("password", "xxx")

mavenDslElement.setNewLiteral("url", ALIPAY_MAVEN_URL)
mavenDslElement.setNewLiteral("name", "alipay")

mavenDslElement.addParsedElement(mavenCredentialsDslElement)
myDslElement.setNewElement(mavenDslElement)

完成以上的工作,我们就能通过 Action 的方式操作 Gradle 文件了。


Ⅲ 状态管理

点完这个按钮后,如果能有一个提示来告诉用户是否接入成功,这简直就太好啦:
640 (1).png
这需要一个叫 ActionStateManager 的组件

<extensions defaultExtensionNs="com.android.tools.idea.assistant">
  <actionStateManager implementation="com.alipay.mpaas.assistant.actions.MPIntegrateBaselineStateManager" />
</extensions>

我们同时也来写一个这样的组件,它继承于 AssistActionStateManager 里面有几个类需要复写
640 (2).png
这里的 getId() 返回你刚刚注册 Action 的那个 id 即可,我这里就是 mpaas.integrate_dependencies 这里我们 getState() 支持返回的状态有这么几种可以选:
640 (3).png
当然,你也可以根据提示自己新建一种状态,按照这个枚举的名字,和里面参数的定义,我们能知道每一种状态代表的含义。
因为这个类的生命周期没有相关的回调,如果我们需要这个类的实例,因此我们需要在 AS 调用 init 方法的时候,自己拿到它的实例存起来。


前情回顾.png

介绍一位不太熟的老友:Android Studio Assistant

作者名片.jpg
动态-logo.gif
公众号媒体导流矩阵.jpg

相关文章
|
28天前
|
SQL 人工智能 Dart
Android Studio的插件生态非常丰富
Android Studio的插件生态非常丰富
42 1
|
28天前
|
Ubuntu Linux Android开发
Android Studio支持多种操作系统
Android Studio支持多种操作系统
57 1
|
4月前
|
Java Android开发 C++
Android Studio JNI 使用模板:c/cpp源文件的集成编译,快速上手
本文提供了一个Android Studio中JNI使用的模板,包括创建C/C++源文件、编辑CMakeLists.txt、编写JNI接口代码、配置build.gradle以及编译生成.so库的详细步骤,以帮助开发者快速上手Android平台的JNI开发和编译过程。
330 1
|
28天前
|
前端开发 数据处理 Android开发
Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍
本文深入探讨了Flutter前端开发中的调试技巧与工具使用方法,涵盖调试的重要性、基本技巧如打印日志与断点调试、常用调试工具如Android Studio/VS Code调试器和Flutter Inspector的介绍,以及具体操作步骤、常见问题解决、高级调试技巧、团队协作中的调试应用和未来发展趋势,旨在帮助开发者提高调试效率,提升应用质量。
45 8
|
28天前
|
数据可视化 开发工具 Android开发
Android Studio
Android Studio
82 1
|
2月前
|
Android开发
Android开发表情emoji功能开发
本文介绍了一种在Android应用中实现emoji表情功能的方法,通过将图片与表情字符对应,实现在`TextView`中的正常显示。示例代码展示了如何使用自定义适配器加载emoji表情,并在编辑框中输入或删除表情。项目包含完整的源码结构,可作为开发参考。视频演示和源码详情见文章内链接。
74 4
Android开发表情emoji功能开发
|
2月前
|
安全 Android开发 iOS开发
Android vs iOS:探索移动操作系统的设计与功能差异###
【10月更文挑战第20天】 本文深入分析了Android和iOS两个主流移动操作系统在设计哲学、用户体验、技术架构等方面的显著差异。通过对比,揭示了这两种系统各自的独特优势与局限性,并探讨了它们如何塑造了我们的数字生活方式。无论你是开发者还是普通用户,理解这些差异都有助于更好地选择和使用你的移动设备。 ###
55 3
|
2月前
|
Java Unix Linux
Android Studio中Terminal运行./gradlew clean build提示错误信息
遇到 `./gradlew clean build`命令执行出错时,首先应检查错误信息的具体内容,这通常会指向问题的根源。从权限、环境配置、依赖下载、版本兼容性到项目配置本身,逐一排查并应用相应的解决措施。记住,保持耐心,逐步解决问题,往往复杂问题都是由简单原因引起的。
353 2
|
3月前
|
XML IDE 开发工具
🔧Android Studio高级技巧大公开!效率翻倍,编码不再枯燥无味!🛠️
【9月更文挑战第11天】在软件开发领域,Android Studio凭借其强大的功能成为Android开发者的首选IDE。本文将揭示一些提升开发效率的高级技巧,包括自定义代码模板、重构工具、高级调试技巧及多模块架构。通过对比传统方法,这些技巧不仅能简化编码流程,还能显著提高生产力。例如,自定义模板可一键插入常用代码块;重构工具能智能分析并安全执行代码更改;高级调试技巧如条件断点有助于快速定位问题;多模块架构则提升了大型项目的可维护性和团队协作效率。掌握这些技巧,将使你的开发之旅更加高效与愉悦。
73 5
|
3月前
|
Android开发 开发者
Android平台无纸化同屏如何实现实时录像功能
Android平台无纸化同屏,如果需要本地录像的话,实现难度不大,只要复用之前开发的录像模块的就可以,对我们来说,同屏采集这块,只是数据源不同而已,如果是自采集的其他数据,我们一样可以编码录像。