Android Things
Google于12月13日对外发布了其新一代物联网操作系统Android Things,它的愿景是为各种消费、零售和工业应用程序提供互连的设备,并提供完整立即可用的硬件解决方案,以进一步实现If you can build an app, you can build a device。
Android Things的前身是Google在其2015年I/O全球开发者大会上推出的基于Android的物联网项目Brillo。然而经过一年多的发展,由于使用C/C++基于NDK进行开发,并且缺乏相应的开发工具,Brillo项目未能吸引足够的开发人员加入。Android Things吸取了Brillo项目的反馈,通过Java API面向广大的Android和Java开发者,并加入了熟悉的工具,如Android Studio,Android SDK,Google Play服务和Google云平台等。
Android Things架构
先看Brillo(上)和Android Things(下)的架构图对比:
可以很清楚的看出来:
- Brillo是一个非常精剪的Androd运行时环境,没有ART,可以看成只运行Linux内核和部分Android本地库的Android系统,可以运行的硬件最低配置为32M内存和128M存储,使用C/C++基于NDK进行开发,开发和部署明显不同于核心Android。Android Things与核心Android框架大致相同,支持Google APIs for Android的一个子集,并通过引入Things Support Library提供了额外的API,这些API支持创建用户驱动程序,允许应用集成原先没有的新硬件。
- Android Studio,Google Play服务,Firebase,Weave和活跃的开发者社区形成了完整的开发生态。如果你喜欢,你甚至可以在Android Studio中使用C/C++进行开发。
- 利用Android系统的OTA更新机制,设备能够及时收到Google官方安全更新、bug fixes等,开发人员能够集中精力于构建产品本身。
- 不管是Brillo还是Android Things均运行于Linux之上,而Linux是一个使用虚拟内存技术的操作系统。这意味着Android Things所运行的处理器必须支持虚拟内存,换句话说,Android Things所运行的处理器是一个拥有完MMU的处理器。
Android Things协议
Android Things默认集成Weave协议。Weave是一个物联网通讯协议,不仅支持设备与设备连接,还支持手机与设备连接,手机、设备连接至Google服务的强大能力。同时,Weave也不依赖于任何通信协议,它可以运行在Wi-Fi,BLE,Zigbee等常见的通信协议之上。 由于Weave被设计为一个平台无关的通信协议,针对不同的目标设备,包括资源受限的嵌入式设备,Weave通过引入不同的实现方式来应对。这些不同目标设备上的代码或组件,共同组合了Weave。
Weave提供了一套标准的设备操作命令(叫做Schema),以及对应的认证机制。Weave对常见的物联网设备,当前主要是智能家居设备,进行了总结和抽象,并形成了一套固定的操作命令集合,内部叫做Schema,并以JSON格式进行描述。Weave这样做的目标,是希望达到不同设备厂商的设备之间,只要使用了Weave,就可以相互操作的目的。同时Weave还引入了一套认证机制,不在标准schema框架内的设备及操作,可以经过Google的认证后,添加到标准schema中。这样就确保了整个schema框架的可扩展性,长此以往,就可以形成一个完整和丰富的生态链。
Android Things硬件
Android Things与SoC厂商合作,通过提供包含SoMs(System-on-Modules)的认证开发板使得开发者即使不了解嵌入式系统设计也能够快速开发完整的产品。SoMs将SoC,内存,Flash存储,WiFi,蓝牙等整合在一块开发板上。一站式硬件解决方案、Google管理BSP支持以及基于Android SDK、Android Studio的软件开发平台,极大的降低了开发门槛及成本。
Android Things现在官方支持的开发板包括Intel Edison,Intel Joule(Android Things Developer Preview 2新增),NXP Pico i.MX6UL,Raspberry Pi 3,厂商可以通过Partner ToolKit来申请Android Things的官方认证。
Android Things SDK
Android Things通过Things Support Library提供额外的APIs扩展了核心Android的功能,这些APIs允许应用程序整合新的硬件类型。同时,Android Things平台被设计为单应用模式的线性结构,应用程序开机自动启动,没有其他系统应用。
Things Support Library
Things Support Library主要包括外设I/O API和用户驱动API。外设I/O API使得应用能够使用业界标准的协议和接口(当前包括GPIO,PWM,I2C,SPI,UART)与传感器、电动机等通信。用户驱动API允许应用程序注入硬件事件到系统框架,以便其他应用程序能够通过标准APIs感知这些硬件事件。
相比核心Android行为变更
- Android Things不包含标准的系统应用和内容提供者套件,所以开发Android Things应用应避免使用common intents,以及内容提供者,包括CalendarContract,ContactsContract,DocumentsContract,DownloadManager,MediaStore, Settings,Telephony,UserDictionary,VoicemailContract。
- Android Things不强制要求显示屏,且即使在图形模式下,Android Things并不包含系统状态栏和底部导航栏。
- Android Things要求应用程序在menifest文件中导出”home activiy“作为系统主入口,以便设备启动时能够自动启动。Activity可以通过添加一个包含
CATEGORY_DEFAULT
和IOT_LAUNCHER
的intent filter即可实现。 - Android Things支持部分Google Service APIs,通常,那些需要用户输入和证书认证的APIs是不可用的。同时,Android Things不支持Google Play Store,所以设备中的Play Services版本是静态的、不会自动更新的。
- Android Things不支持动态权限,因为嵌入式设备不确定是否有显示屏来接受运行时对话框。应用程序在manifest文件中声明的所有权限都会在应用程序安装时全部授权。
- Android Things因为没有系统状态栏,所有也不支持系统通知。
Android Things开发
Android Things应用程序与核心Android应用程序有相同的结构,所以你可以通过修改现有应用程序或基于现有应用程序创建新的应用来开发Android Things应用程序。同时,你还需要一块运行Android Things的开发板。
先决条件
- SDK工具版本24及以上。
- 平台版本Android 7.0(API 24)及以上。
- 设置应用程序的targetSdkVersion设置为Android 7.0(API 24)及以上。
添加Things Support Library依赖库
1.在应用级别的build.gradle添加依赖:
dependencies {
...
provided 'com.google.android.things:androidthings:0.2-devpreview'
}
provided
依赖配置表明应用程序在设备上运行时应使用设备上已存在的共享库。
2.在manifest文件中声明使用共享库:
<application ...>
<uses-library android:name="com.google.android.things"/>
...
</application>
声明Home Activity
Android Things上运行的应用程序必须在manifest文件里声明一个activity作为系统启动后的主入口。声明一个包含如下属性的intent filter:
- Action:ACTION_MAIN
- Category:CATEGORY_DEFAULT
- Category:
IOT_LAUNCHER
为了方便开发,同一个Activity应包含一个CATEGORY_LAUNCHER intent filter,以便Android Studio能默认启动它。
<application
android:label="@string/app_name">
<uses-library android:name="com.google.android.things"/>
<activity android:name=".HomeActivity">
<!-- Launch activity as default from Android Studio -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
<!-- Launch activity automatically on boot -->
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.IOT_LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
</activity>
</application>
参考