且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

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

更新时间:2022-04-27 18:05:57

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

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 有点好玩呀,嵌入式的类 WebView 的信息展示体验给小M留下了非常好的印象。


② 攀谈甚欢

今天,小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-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」 就完成了。
介绍一位不太熟的老友: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 提供的能力能更好的服务到所有的移动开发者。


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

访问2020阿里巴巴双11技术全观专题页
了解更多关于2020双11的技术干货内容