面向嵌入式领域的Android教学方法探讨

2016-05-14 20:29邓招奇郝亚茹邓春健
计算机教育 2016年6期
关键词:Android系统

邓招奇 郝亚茹 邓春健

摘要:根据Android系统本身的开源特性以及脱胎于Linux系统的继承特性,提出一种横向借鉴Linux系统知识进行扩展、纵向挖掘Android系统知识进行延伸的教学方法,说明教学思路,结合实例阐述教学过程。

关键词:Android教学;Linux系统;Android系统;横向借鉴;纵向挖掘

引言

物联网的发展如火如荼,大有赶超互联网的势头,而物联网本身基于物物相联的理念,催生了众多的智能嵌入式设备。但是,智能嵌入式设备并不是空中楼阁,而是基于低功耗精简指令的硬件设备辅以高度可定制化开源系统的一种软硬结合体。Android作为一种开源且专门面向移动嵌入式设备的系统,无疑成为众多智能嵌入式设备的首选,成为物联网不可或缺的一个环节。因此,Android相关教学日益凸显其重要性。

不过,目前的Android教学多注重系统层面之上APP开发的实践,而没有深入Android系统内部,学生往往知其然不知其所以然,对底层的知识没有完整系统的概念。这种教学显然无法适应当前物联网迅猛发展、智能嵌入式设备呈井喷之势的现状。因为不管是物联网还是智能嵌入式设备,其关注的不仅仅是上层的APP应用,更需要深入Android系统的底层,在完全了解其机制的基础上,才能定制开发出适应嵌入式物联网需求的智能设备,更好地实现物物相联的理念。另外,传统的嵌入式设备多以Linux作为首选系统,而Android系统脱胎于Linux系统,二者之间有着千丝万缕的联系。面对老牌的嵌入式可定制系统Linux,在进行Android系统的教学和实践时,肯定存在许多可以举一反三的例子。因此,Android相关教学除了可以在应用开发的层面深入系统底层,还可以从Linux的教学中汲取更多的知识。

1教学思路

图1是Android系统结构图,可以看到Android的底层是Linux内核,中间层是和Linux兼容的标准C库,同时加入核心库和虚拟机构成Android特有的runtime环境。目前的Android教学一般只关注最上层的应用程序及其需要调用的应用程序框架接口,并没有深入Android系统的底层。不过Android系统本身是开源的,这为我们深入其底层提供了前提条件。另外,从图1可以看到,Android系统是基于Linux内核的衍生版本,许多Linux系统的理念可以直接借鉴,这就为深入理解Android系统提供了一面镜子。基于上述想法,我们设计开发了以全智A20为核心的教学实验板,同时兼容Linux和Android两套系统,且可以很方便地进行系统切换。在实际教学过程中,应以此实验板为基础,进行从应用到底层的全方位的知识传授。

由于Android系统以及其上的应用都是实践性很强的知识,因此我们采用项目驱动的教学模式,将诸多知识点分散于各种项目需求中。针对项目需求,通过对Android系统的深入理解以及对Android和Linux关系的完整把握,我们首先分析该需求所要实现的功能如何在Linux系统上通过调用库函数以及使用脚本来实现:然后考虑如何在Android的应用层调用应用程序框架的接口完成上述功能,最后综合上述两个方案,研究如何深入Android系统的内部,在系统层面借鉴Linux的思想,通过修改底层源代码来实现项目需求的功能。对于每个项目需求,都可以从三方面来分析和实现,最终可以实现借鉴Linux的系统知识、融会贯通Android的上层应用开发、深入理解Android系统底层原理的教学目的。

2教学实例

前述的教学实验板,可以用外接电池供电,且Linux和Android系统的底层均实现了电源管理模块的驱动,另外板载一组5个LED灯;通过GPIO与核心A20连接。下面就以LED灯显示电池电量为例,分别从3个方面进行教学方法的分析,其中在Linux系统下主要用udev规则和shell脚本实现。在Android系统下实现电池电量的管理,主要有两种方案:一是直接在应用层开发App,另外一种是在Android系统的源码层寻求突破。这两种方案的本质是一样的,都是被动地获得电池电量变化的信号,来改变LED的显示。

1)Linux系统的电池电量管理实现。

Linux系统分为内核态和用户态,在用户态运行的程序调用底层的c库。如图2所示,Udev是Linux系统用户态的一个守护进程,用来动态管理外部设备。系统启动后,它就一直在后台运行,与内核保持socket通讯,监听内核上报的uEvent事件。一个很直观的例子是,如果有U盘插入USB接口,内核就会上报acRon=add的事件。而此处,如果电池电量发生了变化,负责监控电池的芯片就会上报powersupply事件。相应的处理方法是在udev的规则目录/etc/udev/rule.d/下创建一个规则文件10-ba.t-monitor.roles,在其中监听power_supply事件,并且指明相应的处理脚本。当电池电量变化时,udev就会根据规则调用处理脚本,读取当前的电池电量,然后根据比例点亮或熄灭LED灯,如此就实现了Linux系统下的电池电量管理。

2)Android系统应用层的电池电量管理实现。

Android是在Linux系统上的扩展,它的层次结构简图如图1所示,上层是应用程序框架(AF),最上层的APP应用主要通过Java编写,使用框架提供的API控制接口和资源。为了正确地设置LED灯暗灭来反应电池的电量变化,需要实时获取电池的电量值。在Android的AF层提供了各种系统广播信号,当内核态的某些状态发生变化时,就会发布相应的广播事件ACTION BATTERY CHANGED,注册了这个广播事件的接收器就会收到该广播,如图3所示。在广播接收器内部可以查询实时的电量,并且设置LED灯的亮灭,最终实现Android应用层的电池电量管理。

3)Android系统底层的电池电量管理实现。

按照前面的方案,Android系统可以在电池电量变化时发出广播,其后台有一个服务不断监视电池的变化,一旦变化,就会在AF层发出广播,我们可以直接利用这个服务,找到电池变化的关键点,在广播前或后读取电量,并设置LED的亮灭。通过深入理解Android源码,可以发现随着Android系统的启动,系统会启动一系列的服务,其中就包括电池服务BatteryService,如图3所示,电池服务内部实例化一个观察者,按照udev的规则注册uevent子系统power_supply然后HAL层的uevent维持一个死循环,与内核层通过socket通讯,一旦内核驱动检测到电池电量的变化,就会上报HAL层,uevent就会触发观察者的onUevent函数,最终调用到电池服务的onUevent,发布电量变化的广播。按照前面的方案,如果注册了电池电量变化的广播,此时就可以收到广播消息,然后就可以做出相应的处理。而这就是我们要寻找的关键点,只要在这里调用查询电量并且设置LED灯的脚本即可,此处等同于Linux系统的处理方式。

对比Linux和Android系统的电池电量管理,二者本质上是相同的,最终都是通过监听power_supply,被动地等待系统触发,实现时只需要注册触发事件,设置好处理函数即可。对比Android的两个方案,应用层方案比源码层方案多出一个service和一个广播接收,这样就消耗了更多的资源,相对来说,源码层的方案直接使用AF框架层的service,不需要注册广播,仅仅执行电量设置的逻辑即可。从中可以看到Android开源的益处,我们可以深入系统源码的内部,进行全方位的定制,实现所需的功能。深入了解Android底层的源码,在使用AF层的API之前,不断深入地挖掘其背后的东西,可以更深刻地理解API本身的功能,从而更好更正确地使用它。

3教学效果

我们以计算机学院嵌入式专业的学生为对象,开展Android教学方法的实践和教学评估。此教学方法开展的前提是学生已经完成了Linux系统的相关课程,并且对Linux系统的上层开发和底层原理有一定程度的理解。我们按照前述项目驱动的教学模式,将整个Android课程划分成16个具体项目,分别开展16周32学时的理论课程和16周32学时的实验课程。采用这种知识讲授和上机操作相结合的方法,促使学生借鉴已经学过的Linux知识,深入理解Android系统的底层原理,定制实现Android上层应用。对比往年的Android教学效果,学生不仅能够掌握Android上层应用的开发方法,还可以深入Android系统内部,加深对Linux系统知识的理解,为嵌入式系统定制开发打下基础。这些教学效果不仅仅体现在上机实验结果和期末教学评估,更重要的是使学生在面对实际的嵌入式项目开发时能够从底层机制思考问题,从根本上提高学生解决具体问题的能力。

4结语

物联网的蓬勃发展对嵌入式领域Android教学提出了新的要求,仅仅掌握Android应用层的开发技巧已经力不从心,必须深入Android系统的底层核心,了解其内部的实现原理。Android系统衍生于Linux系统,是一个实践性很强的系统,处于不断演化更新之中,上层的应用程序框架还没有达到稳定期,但其底层的Linux内核却坚如磐石。因此,我们采用项目驱动的教学模式,将Android的知识点分散到各个实际项目之中,开发设计用于教学的嵌入式实验板,分别从Linux系统层面、Android系统应用程序层面和Android系统底层3个方面寻求每个具体项目的解决方案。在不断学习和实践的过程中,学生不仅能够开发出Android的上层应用,更可以借鉴Linux系统的知识,深入Android系统底层,理解和修改系统源码,实现对Android系统的定制,从而满足嵌入式系统定制的要求。这样,我们就实现了一种横向借鉴Linux系统知识进行扩展、纵向挖掘Android系统知识进行延伸的教学方法。下一步,我们将开展深入的研究,逐步完善该教学方法,以期达到更好的教学效果。

猜你喜欢
Android系统
掌游西塘APP设计与实现
基于污点传播动态分析的Android安全系统研究
Android系统上的移动互联网集成平台开发机制
Android系统核心管理工具设计与实现
Android下的机械式电表数字识别技术研究
基于GPS和iBeacon的智能校园信息发布平台设计与实现
基于增强现实技术的导航系统研究
面向移动终端的语音签到系统
基于Android系统的“掌上图书馆”的设计与实现
Android应用异常检测方法研究