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

avatar
mPaaS 官方专栏号 @蚂蚁集团

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


① 多次「邂逅」

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

What's New in 3.6 哇,这不是就是小M要的东西吗?赶紧浏览下。这里面提到了 Design tools/Android Gradle plugin 3.6.0 updates/Emulators/... 等等内容。这个 Assistant 有点好玩呀,嵌入式的类 WebView 的信息展示体验给小M留下了非常好的印象。


② 攀谈甚欢

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

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

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

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

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

回来看下 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”


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

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


再往上查,发现这个类就在 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-id="AndroidToolsGroupExtension"/>
    </action>
  </actions>
</idea-plugin>

以上已经省略了我们暂时不关心的几个节点,可以看到注册的相关节点和 action,FirebaseOpenSidePanel 应该就是拿来打开小助手了,我们看到 FirebaseBundleCreator 中有一行代码:

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」 就完成了。



④ 部署「教程」

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


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


------END------