@xuemingdeng
2017-01-20T15:53:42.000000Z
字数 5271
阅读 526
我与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?