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

时间:2022-11-30 12:58:09

Android Studio 3.6 发布了,又有新的特性可以让人感觉热血沸腾了,小M开开心心地点完「Check for Updates」按钮,把 Android Studio 安装完,开启了新一轮探索之旅。


① 多次「邂逅」


“咦, Google 到底更新了什么呢?听说优化了很多内容,可是一下子也想不起来啊,要是错过了某些特性会让人很遗憾。”小M心里这样想着,他打开了他刚更新完的 Android Studio:

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

What's New in 3.6 哇,这不是就是小M要的东西吗?赶紧浏览下。这里面提到了 Design tools/Android Gradle plugin 3.6.0 updates/Emulators/... 等等内容。这个 Assistant


② 攀谈甚欢

今天,小M接到一个任务,公司要为海外用户开发的 App 接入 Google Firebase 组件。印象里 Firebase 依靠 Google Play Services 提供了许多能力,这么多内容,接入会不会很复杂呢?国内的一些公司提供的单业务 SDK 全部是靠分发 gradle 坐标依赖的方式提供给用户接入,Firebase 不会也这样吧?

小M打开了 Android Developer 官网,想查询下如何接入 Firebase SDK,找到了如下内容:

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

哈!又是 Assistant,和刚刚的东西是一样的吗?于是根据以上指南,小 M 打开了 Firebase 提供的 Assistant:

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

哇,这次的内容比刚刚的 What's New 丰富多了,还有链接可以点击。每一节都是不同的组件,点开一个组件后,我们可以看到如下的教程:

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

这里的交互就丰富多了,不仅有按钮,还有代码片段,Step 1/2/3/4 的结构很清晰,简直像 Google 在手把手教你接入 Firebase,这种体验比我们看只有干货的文档要舒服多了。首先要在 Android Studio 中登录好 Google 账户,然后点击「Connect to Firebase」,选择好项目之后,我们发现我们的 App 工程下面就多了本来需要手动接入的 google-services.json

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

回来看下 Assistant 中,第一步显示完成了:

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

哇,这样我都不用自己去检查了,那么继续点击第二步,出现了一个对话框:

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

这个是告诉了我们,如果我们应用变更后,我们的项目会发生哪些变化,点完「Accept Changes」之后,我们看一下 build.gradle,发现已经全部都应用好了:

//其余配置省略
apply plugin: 'com.google.gms.google-services'
android {
...
}

dependencies {
implementation 'com.google.firebase:firebase-auth:19.3.0'
}

这样,我们想接入的 auth 组件就完成了,直接运行跑就好了。

这样的接入方式也太舒服了吧?


③ Say Hi

小 M 今天接到了一个任务,公司有一个 SDK 需要输出到外网,小 M 再次想起了 Assistant 工具,要是我们也能提供一个 Assistant 界面,那该多好呀,和 PD 讨论了下,PD 非常赞成,于是小 M 开始调研如何利用 IDEA Plugin 开发方式开发一个 Assistant 界面。

首先,IDEA Plugin 开发环境按照这个文档(https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started.html)配置好,因为 Assistant 机制是由 Android Studio 提供的,因此在开发过程中需要添加对 Android Plugin 的支持,也就是在 intellij 这个 DSL 中添加:

intellij {
//.....省略
setPlugins("java", "gradle", "groovy", "terminal", "android")
}

添加完成之后,我们就有了所有为 Android Studio 开发插件的环境,同时要有个心理准备,因为 IDEA 插件开发的环境比较恶劣,除了官方提供的 Plugin Development Guide 之外,没有其他详细的资料可以参考,对于 Assistant 相关的开发更是只能查看相关源码提供参考。

那么我们参考两个源码,一个是 Firebase Plugin 的反编译源码,另外一个是 Android Studio 里面的源码来实现,我们先来看 Firebase Plugin 的反编译源码,把 Firebase Plugin 的 jar 包反编译后,然后只用查里面的关键字我们就能找到 Assistant 界面描述的资料了,比如我们搜“Firebase gives you the tools and infrastructure from Google to help you develop, grow and earn money from your app”

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

一下子就明白了,我们的 Assistant 界面事实上是 Android Studio 分析这个 xml 生成相关的 UI 组件产生的 —— 因为 IDEA 是由 Swing 构建的, Swing UI 并未提供 WebView,我们无法得到原生 WebView 的能力。

我们可以再搜索 firebase_tutorial_bundle.xml 查看哪里使用了这个 xml。

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

再往上查,发现这个类就在 plugin.xml 中注册了

<idea-plugin>

<!-- 省略不重要的节点 -->

<extensions defaultExtensionNs="com.android.tools.idea.assistant">
<assistantBundleCreator implementation="com.google.services.firebase.FirebaseBundleCreator"/>
<actionStateManager implementation="com.google.services.firebase.DependencyStateManager"/>
<actionHandler implementation="com.google.services.firebase.AddDependencyAction"/>
<actionStateManager implementation="com.google.services.firebase.FirebaseConnectStateManager"/>
<actionHandler implementation="com.google.services.firebase.FirebaseConnectAction"/>
<actionHandler implementation="com.google.services.firebase.RecordRoboScriptAction"/>
</extensions>

<actions>
<action
id="DeveloperServices.Firebase"
class="com.google.services.firebase.FirebaseOpenSidePanel"
text="Firebase"
description="Add Firebase to your app">
<add-to-group group-/>
</action>
</actions>
</idea-plugin>

以上已经省略了我们暂时不关心的几个节点,可以看到注册的相关节点和 action,FirebaseOpenSidePanel

public class FirebaseBundleCreator implements AssistantBundleCreator {
private static final String TUTORIAL_CONFIG_FILENAME = "/firebase_tutorial_bundle.xml";

@NotNull
public String getBundleId() {
return "DeveloperServices.Firebase";
}
}

这里的 BundleId 刚好对应 FirebaseOpenSidePanel 这个 action 的 Id,这样 action 和这个 bundle 就关联上了。

仿照这几个类写好后,「Hello World」 就完成了。

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


④ 部署「教程」

我们再回头看 firebase_tutorial_bundle.xml 里面有 feature/description/tutorial/step 等节点,不同的节点有不同的展现形式,等我们把文案填充好之后,就出现了一个完整的可以包含步骤的界面了。如果你想看看还有什么结点可以用的话,可以看下 com.android.tools.idea.assistant.DefaultTutorialBundle

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

小M利用了 Android Studio 提供的 Assistant 快速开发完了 mPaaS Android 的接入方案,目前已经对外发布啦,这是我们面向公有云快速接入的最新尝试,希望 mPaaS 提供的 SDK 能越来越符合所有开发者的胃口,mPaaS 提供的能力能更好的服务到所有的移动开发者。