首页 > 代码库 > Tom's Android Course

Tom's Android Course


Android底层框架解析与

       Java&C/C++软硬整合开发技术

 

主讲人:高焕堂 (台湾Android教父级专家)

 

课程简介:

    在智能&大数据时代,系统开发不仅仅攸关软件设计与开发,还涉及深度软硬整合的智能硬件设计与开发。在当今产业的成功方程式:(((硬件+ 软件) + 内容) + 电信)潮流下,如何将硬件、软件、内容和通信等一群<不会飞>的组件,以一种神奇的创新架构(Architecture)来组织起来,创造神奇的整体,像飞机一样<能飞>起来。

      在本课程里,将基于新一代的<组合创新>架构设计思维与方法,细腻地将设计师思维与开发工程师思维相互衔接;让学员在讨论中,渐入佳境,追求用户<想摸、想玩、想抱>的亲密智能硬件,拓展身为架构师的视野和技能。

       自从Google公布AndroidOpen Accessory(Android开源配件)计划的AndroidIOIO技术以来,我们可运用它的新技术,拓展新视野,让上述愿景迅速落地,梦想成真。AndroidIOIO技术让各厂商根据其API接口开发出适用于Android为主的外设装备,硬件开发公司则可根据API接口来设计适用的产品。这对接口设备公司带来新商机,可利用Android设备连接到其硬件商品,完全不需CPU或 ARM 7 芯片即可顺利运作。此外,还可整合ArduinoIDE,藉其免费开放代码,与很多感应器做结合。

        本课程也将教导学员如何藉由感应器与IOIO相接,并透过蓝芽或USB线与Android设备进行沟通。期望学员藉此接触新技术并体验现有产品所带来的新机会与蓝海商机。

 培训对象:

l Android-based软硬整合的产品经理和架构师

l 想探索开放平台的软硬整合商机和实践技术者

培训期间: 7/23 ~ 24日 两天(12小时)

学员条件:

l  需具备:对程序设计有兴趣且具相关经验者

l  具备Android 基础知识与 C/C++程序开发经验者更佳。

 

课程大纲:

Day-1(上午)  复习:Android的整体架构


1.  Android软硬整合流程简介

    Step-1. 以驱动呈现硬件创新特色

n  Android/Linux驱动程序概念

n  简介Hal-based驱动开发技术

    Step-2. 修改或扩充Android C/C++层的本地(Native)服务

n  介绍 JNI的角色和特点

n  JNI程序开发的简单范例

    Step-3. 修改或扩充Android Java层框架的API

n  简介框架的意义和结构

n  Android框架的简单范例

n  以车载语音软硬模块说明软硬整合流程

2.   Android 上层框架及其API介绍

l   Android 上层框架的基本组件

n    如何使用Intent启动Activity

n    从Activity绑定(Bind)远距Service

n    实例解说:建立Service应用程序,以播放背景MP3歌曲

l  API的分类

n    主动型API与被动型API

n    实例解说::以Activity和Service的基类API为例

l  如何开发小领域的基类及其API

n    设计上层领域框架(基类)的API

n    以Java实现上层领域基类及其API 

3.  Android跨进程(IPC)的API介绍

l   活用Android跨进程IPC机制

n     进程(Process)观念

n     调用IBinder接口的transact()函数

n     实作Binder类别onTransact()函数

n    AIDL机制

l   活用Android线程(Thread)模式

n     Android的主线程(Main Thread)

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

n    如何诞生Java层子线程

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

 


Day-1(下午Android底层框架解析


4.   解析HAL-based驱动框架

     l HAL程序开发与实际范例

            n  HAL框架与Stub开发

    n  HAL Stub实作步骤

    n  HAL 的 Open Interface

  l HAL-based LED驱动程序

    n   JNI & Native Method

    n   整合驱动程序至Android  框架

    n   撰写Android应用程序以控制LED

    n   以标准的Android架构实作

5.   解析Android核心服务框架

l  认识Android核心服务

n    Android的两层服务:Java层服务与C++层服务

n    以多媒体Mediaplayer为例介绍C++层服务

n    C++层服务:衔接Java层应用与底层驱动

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

n    C++层服务的幕后机制:Binder  Kernel

n    撰写你的第一个C++层服务

n    撰写C++层服务的Proxy及Stub

6. 如何封装IBinder接口:AndroidProxy-Stub机制

       l Java层的IBinder封装方法

           n    撰写Java层Proxy类来封装IBinder,并提供新接口

           n    撰写与Proxy相搭配的Stub类

       l  C++层核心服务IBinder封装方法

           n  复习C++的范本(Template)技术

           n  使用BpInterface<T>来撰写Proxy类

           n  使用BnInterface<T>来撰写Stub类

 


Day-2(上午)  Java&C/C++软硬整合开发技术


7.   Java类呼叫既存的(Existing)程序库(*.so)

l     移植及载入*.so程序库

n    将既存的*.so库的移植到手机里

n    撰写Java代码,要求VM将*.so载入手机里

n    讨论VM(虚拟机)的角色

l    初步运用JNI接口

n    定义Java基类的JNI 本地接口

n    Java基类透过JNI调用*.so库里的C函数

n    将C函数回传结果显示于UI画面上

8.   JNI Native进阶开发:雕龙妙技

l   控制点的抉择

     n   控制点在Java层:复习Java呼叫Native C函数

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

     n   控制点在C/C++:Native C函数如何诞生Java物件

l   JNI Native  C的执行绪模式

     n   Native C程序的执行绪模式

     n   Native C程序的执行绪安全设计

9.  解析Android的Java&C/C++整合框架范例

l     SurfaceView框架范例解析

           n    一般View与SurfaceView的区别

           n    SurfaceView的执行绪模式

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

l    SurfaceFlinger核心服务的角色

    n  SurfaceFlinger的任务

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

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

 


Day-2(下午如何在C/C++之上建立Java层框架


10. 平台架构设计的十个法则

      ☆ 法则-1.好莱坞大明星原则(Don’t call me, I’ll call you back!)

      ☆ 法则-2. <通用性接口>与<特殊性接口>的衔接法则

      ☆ 法则-3. 协天子以令诸侯法则

      ☆ 法则-4.   Command flow和Data  flow分离法则

      ☆ 法则-5.  集装箱式抽象法则

      ☆ 法则-6.  基类创建子类对象法则

      ☆ 法则-7.  把基类当礼物送别人法则

      ☆ 法则-8.  从简单组合出复杂法则

      ☆ 法则-9.  从简单中叫出复杂法则

      ☆ 法则-10. 没钱就改版,改版就有钱法则

 


Day-2(下午实践案例&讨论


11. 软硬整合实践:Android+HTML5+智能TV+家庭物联网 

   l   实现智能家庭 

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

         n  将 i-Jetty安装到智能TV    

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

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

 l   案例:手机与Android TV的多机整合系统设计与开发

        ☆  目的:这是会议开幕时,嘉宾以自己的手机上网访问会议厅中Android TV里的i-Jetty网页,再通过Android App发出Zigbee信号,打开会议厅的主灯和电视墙,如图:

wKiom1PApbuRWPofAADdyLpHQ7A407.jpg

        ☆  做法:在这个范例里,为了让各种移动终端皆能来访问Android TV,就不特别去开发iPhone客户端的App了,而是直接采取通用的一般浏览器(Browser)作为这个案例的手机客户端软件了。

       ☆  使用:由i-Jetty提供Servlet接口来与iPhone手机上的浏览器对接。在i-Jetty里,转换成为<doGet,doPost>接口,再使用Context接口,调用它的startService()函数,来取得IBinder接口,进而通过IBinder接口与ZigbeeAppActivity&硬件驱动互相通信。完成了iPhone手机与Android TV两端的对接与整合任务了。

      ☆ 讨论:如何藉由感应器与IOIO相接。

wKioL1PApavBQbnHAAD2x-ud7L0262.jpg

       透过蓝芽或USB线与Android 设备进行多机整合的产品创新,进而结合内容创意,藉此体验软硬整合产品所带来的新价值与蓝海商机。 


12. 智能硬件的跨平台策略   

 l  跨(底层)芯片平台的实践策略       

       n  一个造形:EIT造形      

       n  三个策略     

              ☆ 策略-1:把它”EIT(设计)”了

              ☆ 策略-2:挟天子以令诸侯      

              ☆ 策略-3:建立中间件(middleware)  

       n  善用Android 4.x核心多层框架体系及其API     

       n   摆脱底层别人芯片的束缚      

       n   整合自己的底层Linux/Android软件和硬件组件


 l  跨Android脆片化版本的机制

      n  问题:Android升级和版本变更频繁,终端必须随之而更新

  n  关键:Android是一个多层级<E&I>结构,各层都是由Google所开发,Google是强龙,位居天子角色,其设计<I>来控制您的插件<T>

      n  策略:拿EIT造形搭配Proxy-Stub设计模式,规划Stub类别(曹操类),制定自己的<I>,让<T>脱离Android的<E&I>所牵制;实现”挟天子以令诸侯”的效果。



~ End  ~