相比移动领域,Android 能否也为物联网打开一片新天地

  • Carl Whalley
  • 薛命灯

2017 年 1 月 21 日

话题:移动Android语言 & 开发架构物联网

我与 Android Things 的 24 小时

我正在参与一个基于 Android 的物联网商用项目,它运行在 Raspberry Pi 3 上。最近发生了一件很有意思的事情,Google 发布了Android Things的第一个预览版,他们的 SDK 主要针对 3 个开发板(Single Board Computers),Pi 3、Intel 的 Edison 和 NXP Pico。在 Pi 和 Android 之间无法建立端口连接,我们只能忍受自制固件的各种问题,这种痛苦真的是无以言表。其中一个最大的问题是它们不支持触摸屏,甚至连Element 14官方出售的版本也不行。我知道 Android 正在向 Pi 靠拢,而之前 Google 向 AOSP 项目提交的一个声明更是让每个人为之动容。2016 年 12 月 12 号,Google 发布了“Android Things”,外加一个可下载的 SDK。于是我开始着手研究,并在门上挂上“勿扰”的牌子……

关于 Android Things 的疑问

在经历了大量 Android 工作和一些 Pi 项目之后(包括现在的这个项目),对于 Android 和 Pi,我不禁有很多疑问。后面我会逐个说明,不过第一个最大的疑问现在已经得到了回答——Android Studio 完全支持 Pi,Pi 正式成为一个支持 ADB 连接的设备。是的!Android Studio 那些超级好用的强大特性最终支持了真实的物联网硬件,我们可以使用布局预览、调试系统、源代码检查器、自动化测试等等。我为此感到很激动。直到现在,我的很多 Pi 板载程序都是使用 Python 来开发,使用运行在 Pi 上面的编辑器(MC)来进行 SSH 连接。这种方式是可行的,而且毋庸置疑,Pi 和 Python 大神们会提出更好的方式,不过这仍然会让人感觉回到了 80 年代的软件开发时代。我的项目需要为控制 Pi 的手持设备编写 Android 程序,如果使用之前的方式等于往伤口上洒盐,而我后来使用 Android Studio 来开发“真正”的 Android 程序,然后使用 SSH 来完全其它工作,一直到现在。

所有的例子都是有关上述的 3 个开发板,Pi 3 是其中一个。通过 Build.DEVICE 常量可以在运行时决定是哪一种设备,所以你会看到很多类似这样的代码:

 public static String getGPIOForButton() {
     switch (Build.DEVICE) {
         case DEVICE_EDISON_ARDUINO:
             return "IO12";
         case DEVICE_EDISON:
             return "GP44";
         case DEVICE_RPI3:
             return "BCM21";
         case DEVICE_NXP:
             return "GPIO4_IO20";
         default:
             throw new IllegalStateException(“Unknown Build.DEVICE “ + Build.DEVICE);
     }
 }

这里对 GPIO 的处理很有意思,因为我只对 Pi 比较熟悉,所以我只能假设其它开发板也是以这种方式工作的。可以在这些地方定义输入和输出,并作为到外部世界的主要接口。Pi 所使用的 Linux 发行版完全支持 Python 的读写操作,但对于 Android 来说,你必须使用 NDK 来编写 C++ 驱动,然后通过 JNI 与 Java 进行交互。这样做不仅增加了难度,还让构建过程变得更加复杂。Pi 设计了两个针脚的 I2C 接口,分别是时钟和数据,需要额外的工作来处理它们。I2C 是一个强大的可寻址总线系统,它可以把多个针脚的数据串行化到一个针脚上面。让我们感到惊喜的是,我们现在可以直接在 Android Things 里完成这些工作。你只需要调用 read() 或 write() 方法来访问 GPIO 针脚,而 I2C 的操作也很简单:

public class HomeActivity extends Activity {
    // I2C Device Name
    private static final String I2C_DEVICE_NAME = ...;
    // I2C Slave Address
    private static final int I2C_ADDRESS = ...;
    private I2cDevice mDevice;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // Attempt to access the I2C device
        try {
            PeripheralManagerService manager = new PeripheralManagerService();
            mDevice = manager.openI2cDevice(I2C_DEVICE_NAME, I2C_ADDRESS)
        } catch (IOException e) {
            Log.w(TAG, "Unable to access I2C device", e);
        }
    }
    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (mDevice != null) {
            try {
                mDevice.close();
                mDevice = null;
            } catch (IOException e) {
                Log.w(TAG, "Unable to close I2C device", e);
            }
        }
    }
}

Android Things 是基于哪个 Android 版本?

应该是 Android 7.0,我们因此可以使用完整的 Material Design UI、优化工具、安全增强以及之前版本的所有特性,真是太棒了!那么问题来了:未来的平台更新将以什么方式放出?我们需要单独对它们进行管理吗?不要忘了,这些设备不会一直在线,我们也无法奢望总是有移动网络或 WiFi 可用,哪怕是不稳定的无线网络。

我所担心的另一个问题是,从名字上看,Android Things 只是 Android 的一个衍生产物,它的诞生只是为了振奋 Arduino 市场,而并非为了做出一个强大的操作系统。不过它所给出的示例立马打消了这个疑虑,示例里有些地方甚至使用 SVG 作为 resource(这是 Android 最近才有的),而不是使用传统的位图,虽然使用传统的位图也很方便。

既然 Android Things 是基于 Android 的,那么 Android 的一些问题也会不可避免地出现在 Android Things 上,比如权限问题。Android Things 是为了固定的硬件设备而设计的,一旦构建完成,用户一般不会在上面安装应用,所以用户不会被询问权限问题,因为设备上可能连 UI 都没有!所以,在应用被安装到设备上时,它会被授予所有的权限。一般情况下,这些设备都是单应用设备,在设备启动时,只有一个应用会在上面运行。

Brillo 发生了什么?

Brillo 是前 Google 物联网操作系统的代号,看起来应该是 Android Things 之前的代号。事实上,你还是能够看到很多地方在使用 Brillo 这个名字,特别是 GitHub 上 Android Things 示例代码里的源代码文件夹名称。不过这样的情况会越来越少,因为一切正在向新的王者看齐!

UI 指南?

Google 发行了大量关于 Android 智能手机和平台应用的指南,比如如何在屏幕上布局按钮等等。当然,如果能够遵循这些最佳实践是再好不过了,不过现在我们再也不能像以前那样。默认情况下,屏幕上什么也没有,应用开发者需要自己管理所有的组件。包括顶部的状态栏、底层的导航栏以及其它所有的组件。多年来,Google 告诉 Android 应用开发者不要自己去渲染一个返回按钮,因为平台会为我们提供一个这样的按钮,不过现在连这个按钮也没有了,因为Android Things 有可能连 UI 都没有

关于 Google 将会提供的服务支持,我们将作何期待?

我们可以有很多期待,但不包括所有事情。Android Things 的首个预览版不支持蓝牙,也不支持 NFC,而对于物联网来说,蓝牙和 NFC 是非常重要的。而开发板就支持这些功能,所以我认为在不久的将来 Android Things 也会支持它们。因为没有通知栏,所以也不会有通知。地图也不会有。没有默认的软键盘,需要自己安装一个。因为没有应用商店,所以必须通过 ADB 安装应用,还要做很多其它操作。

在使用 Android Things 进行开发时,我尝试着把为 Pi 开发的 APK 安装到普通的设备上,但没有成功。有个错误被抛了出来:“com.google.android.things”库不存在,说明为 Android Things 设备开发的应用无法安装到其它设备上。这个看起来是合理的,因为只有 Android Things 设备需要这些东西,不过这也会有点局限,因为不仅仅智能手机或平台没有这些库,其它的模拟器也没有。也就是说,你只能在 Android Things 物理设备上运行和测试 Android Things 应用……直到 Google 在它的物联网开发者社区上回答了我所提出的疑问,并提供了一个变通方案。

关于 Android Things 生态系统的演化,我们将做何期待?

我期待能够看到更多的基于传统 Linux 服务器的应用被移植到 Android Things 平台上,虽然这些应用对于智能手机和平板来说毫无意义。例如,Web 服务器。现在已经有一些这样的服务器,不过还没有像 Apache 或 Nginx 这样的重型服务器。物联网设备可能不会有本地的 UI,不过可以通过浏览器来管理它们,这样做是可行的,所以需要一种方式来展现 Web 面板。对于那些著名的通信应用来说,它们需要麦克风和扬声器,从理论上说,可以支持任何一款视频通话应用,比如 Due、Skype、Facebook 等等。事态将会发展到何种程度都只是我们的猜测。是否会出现应用商店?是否会出现广告?我们能够避免被黑客控制?从消费者的角度来看,物联网设备就是一些具有触摸屏的联网设备,而且每个人都习惯了智能手机的工作方式。

我期待能够看到硬件的飞速发展,特别是开发板设备,而且能够处在一个较低的成本水平。Raspberry Pi Zero 只要 5 美元,这个价格低得让人不可思议,不过它那可怜的 CPU 和内存甚至都无法保证能够运行 Android Things。它们什么时候才能运行 Android Things?很显然,很多开发板产商把目标瞄准了 Android Things,而且随着规模化生产,一些外围设备,比如触摸屏,很可能只需要 2 美元左右。

不过,我不认为我们会如飞一般跳跃。如果我们把 Android Things 看成一个无所不包的物联网操作系统,那么知道一些 Android 架构方面的知识有助于我们了解这个系统。它仍然使用 Java 语言开发,Java 因为它的垃圾回收停顿时间饱受诟病。不过这只是其中的一个方面。一个真正的实时操作系统对时效性具有非常严格的要求,它不能是一个关键性任务系统。想想那些医疗应用、安全监视器、工业控制器等。从理论上说,如果有必要,Android 系统上的 Activity 或服务随时会被停掉。对于手机来说,用户可以重启应用,清除其它应用,或者重启设备。拥有一个心跳监测器是很重要的。如果前台的 Activity 或服务正在监听一个 GPIO 针脚,而信号得不到及时的处理,就会发生错误。Android 需要做一些很基础的修改来支持心跳监测,不过到目前为止还没有听说有这方面的计划。

过去的 24 小时

那么,让我们回到我的项目上来。我想我可以把之前所做的工作尽可能地移植过来,如果不可避免地碰到一些问题,我可以到 G+ 开发社区上寻求帮助。不过除了无法在非 Android Things 设备上运行应用这个问题以外,还没有碰到其它问题。目前一切运行良好!这个项目还用了一些奇怪的东西,比如自定义字体和一些精准的计时器,这些东西在 Android Studio 里都得到了完美的支持。我这次给 Google 打满分。之后我会做一些实实在在的原型,而不只是视频或截图。

蓝图

物联网操作系统目前看起来非常的碎片化。这个领域目前还没有出现市场领导者,虽然我们经常听到一些天花乱坠的大肆宣传,但这些还为时过早。Google 能否在物联网领域也能做得像他们在移动领域所做的那样?要知道,他们已经占据了 90% 的移动市场。我相信他们会的。而如果这个成为现实,那么 Android Things 的出现就是一个起点。

让我们想想开放软件和私有软件之间的战争,比如 Apple 和 Google。Apple 从来没有完整开放过他们的软件,而 Google 的开源软件已经为很多人带来了好处。现在这个问题又出现了,要让 Apple 开发出一个免费的物联网系统,就好比让它发布一款免费的 iPhone 一样难。

物联网操作系统的游戏已经开始了,而竞争对手们甚至都还没有做好准备……

Android Things 的开发者预览版现在已开放下载。

本文已获得原作者翻译授权,查看英文原文:Will Android do for the IoT what it did for mobile?


感谢徐川对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们。

移动Android语言 & 开发架构物联网