课程名称:

Android软硬整合技术:

       HAL&Framework&App 架构设计与实战开发

 

By 高焕堂

 

1. 课程目标(Objective)

    基于Android开源开放平台,让上层应用(App)开发者熟悉如何与中层系统服务(System services)和底层驱动(Drivers)流畅对接。并且让底层驱动开发者理解如何延伸到中间层系统服务和应用框架层API开发。基于这个扎实的基础,将来可进一步建置自己的中间件(Middleware),让公司迈向平台级(Platform)或生态级(Eco-systems)的企业。

   对于孰悉Linux和C/C++的工程师而言,了解HAL及其设计,是开发 Android产品的第一门课。基于Linux驱动开发的既有基础经验,透过分析HAL 的设计,建立基础的Android框架知识。顾名思义,框架(Framework)就是基于既定架构的接口(API)来协助应用开发、并框住应用的行为。HAL框架也不例外,具有上述的角色和功用。无论您是初学者或是有经验者,这个新颖的学习地图,就像一匹千里马,陪您驰聘于无垠的Android软硬整合世界,打造形形色色的创新产品。 

 

2. 课程大纲(Content)

Day-01a(早上)

Part-1Android的多层框架体系

1.1  Android的分层框架

  • 跨平台的HTML5/JS层
  • Java层

n    这是专属于Android平台的App

n    透过JNI呼叫本地C函数(属于本地C层)

l JNI / C层

n   能透过ServiceManager绑定下层的C++核心服务

n   也能直接呼叫HAL-based驱动模块

l 核心(系统)服务层

n  直接呼叫下层的HAL-based驱动模块

n  也能将讯息传送给上层本地C模块

n  核心服务也能以Java来撰写,这种核心服务属于Java层

l HAL & 驱动层

n    为了避开GPL协议,Android驱动大多写成HAL Stub模块

n    HAL Stub可透过System Call呼叫Linux内核实际控制硬件

1.2 观摩GPS(Location Service)多层框架(子)体系

l   Java层框架基类及相关类别

l   JNI界面

l   Location Service的C++层服务 & 驱动层

 

Part-2Android架构里的重要机制

2.1      Android是如何启动的?

l   Init进程

l   Init创建ServiceManager和Zygote进程

l   由Zygote创建VM(Virtual Machine)和SystemServer进程

2.2      线程模式

l Android的主线程(Main Thread)

l 主线程与ANR(Android Not Responding)对话框

l 如何诞生Java层子线程

l Java层主、子线程的通讯模式

2.3      安全机制

l Android/Linux的UID观念

l Android的Permissions机制

2.4  跨进程(IPC)机制

l  Android 的IPC幕后设计:BD(Binder Driver)驱动架构

l  以IBinder接口包装BD驱动的服务

l  包装IBinder接口的Proxy-Stub设计模式

l  Proxy和Stub类别的代码

l  设计Proxy和Stub类别的API

l  如何自动生成Proxy和Stub类别代码

 

Day-01b(下午)

Part-3 Java层框架解析

3.1      Java层框架介绍

l   常用的服务

n 简介(Overview)

n Android各项服务的启动

n Windows Manager

n Activity Manager

n Package Manager

n 其它服务介绍

l   Android框架四大基本组件:Activity, Service, Broadcast Receiver与ContentProvider

  • 通信基础:Intent

n   Intent-based Programming

n   范例:使用Intent启动Activity

  • Activity

n  使用Intent启动Activity

n  Activity的life-cycle

n  Activity间的互相传递数据

n  建立多Activity的应用程序

n  Android基本UI布局及样式(Pattern)

  • Service

n  使用Intent启动Service

n  何谓远距(remote)的Service?

n  绑定(bind)远距Service

n  建立Service应用程序,以播放背景MP3歌曲

  • BroadcastReceiver

n  何谓BroadcastReceiver?

n  以BroadcastReceiver接收SMS短信

n  建立BroadcastReceiver应用程序,以启动Service播放MP3歌曲

  • ContentProvider

n  何谓ContentProvider?

n  ContentProvier与SQLite数据库

n  使用ContentProvider进行数据的增、删、改、查。

3.2  Java层的跨进程(IPC)机制

l  Activity使用IBinder接口调用远程的Service

l  IBinder接口& AIDL方法

n  方法(一):Implementing a Binder

n  方法(二):Using a Messenger

n  方法(三):Bound Services

 

Part 4 UI框架解析与应用界面设计

4.1      解析UI框架幕后的服务机制

l    SurfaceView框架范例解析

n    一般View与SurfaceView的区别

n    SurfaceView的执行绪模式

n    以OpenGL_ES说明SurfaceView的JNI接口设计

l    SurfaceFlinger在框架里的角色

n    SurfaceFlinger的任务

n    SurfaceView如何透过JNI呼叫SurfaceFlinger核心服务

n    SurfaceFlinger核心服务如何整合多个SurfaceView的动画

4.2  解析JUnit测试框架和机制

l   Android的测试工具,都是基于JUnit测试框架的

l   JUnit框架也是由许多EIT造形所组成;其TestCase基类是<E&I>

l   从基类衍生出各子类,如ServiceTestCase就是扩充的<E&I>;其内涵的setUP()和tearDown()函数就是<I> 

l   可撰写<T>(即Test case)代码,来启动TDD机制

l   可使用TestSuite基类来管理一群相关的<T>(即Test case)

4.3       解析AndroidListView框架

l  请您观摩ListView的框架,解析其幕后的EIT造形,理解其插件<T>如何容纳用户(App)的变化

l   Step-1:需求分析,解析用户需求变化

l   Step-2:依据需求分析表,设计接口<I> 

l   Step-3:详细设计接口<I>和插件<T>

l   Step-4:将EIT造形对映到Android的程序码

4.4  解析UI的复杂<Context-View>框架_情境:Android如何播放MP4影片

l   解析架构,其含有3个EIT造形
    造形-1:{ ViewRoot,View, SurfaceView }
    造形-2:{ SurfaceView,Callback, <T> }
    造形-3:{ ActivityThread,Activity, <T> }

l   并使用到一个外来的平台:MediaPlayer播放器 

 

 

Day-02a(早上)

Part-5JNINDK

5.1      JNI和NDK初步

l    认识JNI与Android的NDK

l    JNI基础观念

l    Java与C++力与美的结合

l    如何使用JNI与NDK

5.2  从线程视角理解JNI开发

l    JNI的线程模式

l    JNI线程幕后的VM

l    JNIEnv对象的角色

l    藉Session概念理解JNIEnv对象

l    JNI多线程代码解析_范例介绍

l    JNI多线程代码解析_细说代码

l    多个线程同步技巧

5.3  JNI 进阶开发:控制点的抉择

l    制点的规划

l    控制点在Java层: Java呼叫Native C函数

l    控制点在C/C++: Native C如何呼叫Java函数

l    控制点在C/C++:Native C如何诞生Java对象 

5.4  观摩Android GPS(Location Service)服务框架体系

l    Java层框架基类及相关类别

l    JNI界面

l    Location Service的C++层服务&驱动层 

5.5 开发案例:开发一个GPS框架层服务和应用程序

l    App获取移动设备当前的地理位置。

l    手机App拍摄了一张风景照片,也获取了当前的地理位置。然后,采取H.264视频数据格式来将照片和地理位置一起传送给云服务器(Cloud Server)。 

l    此App不直接调用getSystemService()函数,如下述的代码: locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); 而是使用新建立的LBS领域框架基类,再透过SeviceManager来绑定LocationManagerService。

l    于是,手机App就能拍摄了一张风景照片,也获取了当前的地理位置;然后将照片和地理位置一起传送给云服务器(Cloud Server)。请拿起你的画笔,在下图上绘出上述location变量值的数据流(Data Flow);同时也请画出这数据流幕后的控制命令流(Cammand Flow)。

 

      

 

l   撰写一个新的LBS服务。LocationManagerService是以Java写成的Android Service。如果我们想保留这个LocationManagerService,而且想开发一个新的LocationManagerService_02服务。可以选择改用C++来撰写它。核心服务透过HAL衔接到Linux或底层GPS驱动程序。 

l   于是,App可透过SM来绑定该服务,并透过JNI而呼叫核心服务。

 

Day-02b(下午)

Part-6HAL(硬件抽象层)框架及其Stub代码开发

6.1      复习:Linux驱动开发方法

l    认识JNI与Android的NDK

l    JNI基础观念

l    Java与C++力与美的结合

l    C的函数表(Function Table)

l    C函数表与Linux驱动开发

l    驱动Stub的内涵

l    file_operation接口

l    撰写驱动Stub代码

l    Run-time的执行状态

l    撰写user-space的Client模块 

6.2   HAL-based驱动开发技术

l    认识Android的HAL(硬件抽象层)

l    HAL与开源协议

l    HAL框架设计

l    以C语言定义HAL框架API

l    以C语言撰写HAL Stub(子类)

l    执行Stub:Loading-time的初始建置活动

l    Client使用HAL框架API的调用步骤   

6.3  案例建立自已的HAL框架来包容驱动和硬件的变更

l    关心议题:随着自己的业务成长,自己新片版本变更也随之增加。架构师如何规划HAL-like框架来吸收其变更呢?

l    基本架构:这种<框架/插件>架构本身不复杂,但是常常需要以C语言来实现;但由于C语言没有提供Object-oriented机制,所以实现技术较为复杂而已。
  

Part-7Java层系统服务框架与开发技术

7.1      使用既有的服务

l    认识Android系统服务

l    简介启动过程

l    启动服务:由SM登录

l    AMS服务启动App

l    App使用系统服务的Ibinder

l    App绑定(Bind)系统服务

7.2      亲自开发系统服务

l    实现系统服务的IBinder接口:使用AIDL

l    系统服务的Stub类:使用AIDL

l    开发Android服务:Stub代码

l    开发Android服务:AudioService代码

l    开发Android服务:使用AIDL

l    开发Android服务:proxy类

7.3      布署和启动自己开发的系统服务

l    从Activity来绑定

l    Context类的任务

l    讨论:谁来写Stub类代码

 

 

Day-03a(早上)

Part-8C++(Native)系统服务和API设计

8.1 Native系统服务的开发要点

l    认识Android系统服务

l    C++层(Native)系统服务的角色

l    提供通用性的IBinder接口

l    将IBinder接口特殊化

l    设计Stub类

l    使用模板产生Stub类

l    以既有的Native服务为例 

 

8.2 撰写你的第一个Android核心服务

l   观摩天字第一号核心服务:SM(ServiceManager)

l   撰写C++类实现你的核心服务

l   创建该C++类的对象,由SM存入Binder Kernel里

l   JNI函数透过SM来绑定该核心服务

l   Java框架透过JNI而呼叫核心服务

l   核心服务透过HAL衔接到Linux或底层驱动程序

8.3       解析UI框架幕后的服务机制

l    SurfaceView框架范例解析

n    一般View与SurfaceView的区别

n    SurfaceView的执行绪模式

n    以OpenGL_ES说明SurfaceView的JNI接口设计

l    SurfaceFlinger在框架里的角色

n    SurfaceFlinger的任务

n    SurfaceView如何透过JNI呼叫SurfaceFlinger核心服务

n    SurfaceFlinger核心服务如何整合多个SurfaceView的动画

 

Day-03b(下午)

Part-9软硬整合:使用Android & HTML5 & Docker

9.1  Android + GAE云服务应用开发

l   以Google AppEngine为例,实现端云相连

n   取得云服务:以Google的AppEgine为例

n   Google的AppEgine的Servlet程序

n   目标将Image图文件存入云平台

n   撰写Android应用程序调用Servlet程序

n   Servlet程序将图文件存入云的DB里

9.2  Android + HTML5 + Android智能TV + 家庭物联网

l   实现智能家庭

n   以智能TV为中心,建立家庭云(Family Cloud)

n   将 i-Jetty安装到智能TV

n   撰写家庭云网页:将HTML(or HTML5)代码写入智能TV里

n   从手机访问家庭云主页:例如,控制IP摄像头等

9.3 范例:Android/HTML5+Docker的整合设计

l   HTML5的跨平台机制

l   PhoneGap的插件管理

l   Docker与PhoneGap插件管理一致划设计

 

~ end ~