AICon全球人工智能与机器学习技术大会9折特惠中,点击立减¥480>> 了解详情
写点什么

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

2017 年 1 月 21 日

我与 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 )关注我们。

2017 年 1 月 21 日 18:002209
用户头像

发布了 321 篇内容, 共 114.2 次阅读, 收获喜欢 116 次。

关注

评论

发布
暂无评论
发现更多内容

阿里架构师经验分享!Android面试知识点总结宝典助你通关!顺利通过阿里Android岗面试

欢喜学安卓

android 程序员 面试 移动开发

dubbo-go 白话文 | 从零搭建 dubbogo 和 dubbo 的简单用例

阿里巴巴云原生

Java 云原生 dubbo 中间件 dubbogo

怎么提升写代码的能力

阿里巴巴云原生

程序员 个人成长 方法论 云原生 自我思考

架构师 3 期 3 班 -week8- 作业

zbest

作业 week8

《我想进大厂》之分布式事务篇

艾小仙

Java 面试 后端

使用Apollo升级一下yml文件管理和发布

Sky彬

springboo

云原生 DevOps 的 5 步升级路径

阿里巴巴云原生

Serverless 容器 DevOps 微服务 云原生

给跨专业程序员的一些建议

Ryan Zheng

iOS音视频--视频合集

程序员 音视频 OpenGL ES GPUImage Metal

从根上理解高性能、高并发(五):深入操作系统,理解高并发中的协程

JackJiang

网络编程 高并发 协程 高性能 即时通讯

SpringCloud 从入门到精通 12---Nacos配置中心

Felix

新年Flag 中奖名单公布|如何科学的从55人中随机选出11个中奖名额

InfoQ写作平台官方

活动专区

首次公开!阿里技术团队编写的“大厂面试参考指南”v1.0版本

Crud的程序员

Java 程序员 架构

COCO聊天挖矿系统开发|COCO聊天挖矿软件APP开发

开發I852946OIIO

系统开发

阿里巴巴2021年最新开源十亿级Java高并发系统设计手册

Java架构追梦

Java 阿里巴巴 架构 并发 系统架构设计手册

盘点2020 | 百度AI的2020

百度大脑

盘点2020

有内味了!阿里内部Tomcat高阶调优笔记成功刷新了我的认知

Java架构之路

Java 程序员 架构 面试 编程语言

安装Android系统 missing operating system

mengxn

android

Kubernetes安装篇(上):基于Minikube方式部署本地环境

xcbeyond

Kubernetes 安装 minikube 28天写作 Kubernetes从入门到精通

基于gRPC的注册发现与负载均衡的原理和实战

万俊峰Kevin

Go 微服务 go-zero

惊喜来袭!253页全彩免费电子书《Python 编程参考》正式上线发布

穿甲兵

Python Go redis 程序设计

架构师训练营第八周作业

zamkai

案例加源码:万字长文带你彻底搞懂MySQL的索引优化

程序员小毕

MySQL sql 源码 性能优化 索引

热情空前,家长纷纷变身“寒假规划师”,如何抓住这波热潮?

ZEGO即构

AI 在线教育 在线课堂

是找茬?还是装B?阿里面试每轮必问的“Spring Boot”意义何在?

比伯

Java 编程 架构 面试 计算机

WebRTC 的现状和未来:专访 W3C WebRTC Chair Bernard Aboba

阿里云视频云

阿里云 WebRTC 视频云

阿里架构师深入讲解Android开发!教你一种更清晰的Android架构!BAT大厂面试总结

欢喜学安卓

android 程序员 面试 移动开发

案例集锦|科技赋能,华为云GaussDB助千行百业数字化转型

华为云开发者社区

数据库 华为云 企业应用

2020中国ToB独角兽:估值逆势起飞,寡头效应加剧

ToB行业头条

【有奖调研】中国人工智能开发者调研

百度大脑

限量!腾讯高工用4部分讲清楚了Spring全家桶+微服务

996小迁

Java 架构 面试 springboot SpringCloud

数据cool谈(第1期)数据库寻路,开源有态度

数据cool谈(第1期)数据库寻路,开源有态度

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