历史原因使Android系统有了HAL,它的角色相当于一个中间人,对上层,它负责给JNI提供调用kernel的方法,对下层,它所提供的方法包含能够访问kernel的函数,即kernel提供给上层的API,如:open、read、write、ioctl等;

下面,我们通过对比Android系统架构和Linux系统架构来增加理解:

Android系统架构(HAL)

Android系统架构(无HAL)

Linux系统架构

补充一下基础概念:所谓的API函数,被包含在用户层的函数库中,API对kernel是产生系统调用,对用户程序是提供产生系统调用的方法;所谓的接口,是对外公开声明的函数、变量,即汇编语言中所说的标号或符号,外部程序通过接口可以引用某些自己不具备的服务

1、Linux系统架构

Android是基于Linux的扩展,所以我们先来看一下Linux系统架构;

从软件架构的角度来看,Linux分为user层、kernel层,这两层是C实现的(应用层还可用C++实现);

从系统服务流程的角度来看,Linux有调用服务的user层、执行系统调用的服务层、支持系统调用的内核函数(服务模块);

所以,在Linux系统中访问设备的流程为:用户层程序直接产生系统调用(系统开发人员)或者通过API函数间接产生系统调用陷入kernel层,在kernel层找到用户程序所需的服务,这里说的是访问设备,则找的是device driver,通过device driver最终实现对硬件设备的访问;

以代码示意整个流程:

---------------------------------------------------------------

main()

{

operation();

}     

extern system_call();
operation()

{

system_call();

}                                            user层

---------------------------------------------------------------

kernel层

system_call()

{

datatype (*system_service)();

system_service = find_sys_service();

system_service();

}

device_operateion()    // this is one of system service module functions(methods)

{

}

---------------------------------------------------------------

device                         硬件层

---------------------------------------------------------------

2、Android系统架构

从Android系统架构(无HAL)框图可知,Android系统架构比Linux系统架构多了Application、Application Framework两层,这就是android的应用层(JAVA);

Android将Linux的应用层(用户C程序+函数库)添加一个Android Runtime作为其中间层,并将中间层和kernel层统称Android的系统层(C/C++);

HAL所调用的API来自Libraries,真正能和kernel打交道的是API,所以,Android系统架构(HAL)框图并不准确,HAL并非一个独立的具有隔离作用的层,而是从某方面性质上宣称它是一个Layer,其实它相当于Linux系统中的用户C程序组,只是它不仅要完成在Linux系统中用户C程序所要完成的工作,还要向上给JNI提供完成这些工作的接口,实现从JAVA调用C获取kernel系统服务的机制;因此,我个人认为Android系统架构(无HAL)框图更为恰当,HAL的存在只是为了在概念上更好的表述和理解Android系统而已;

Android的整个系统服务调用流程我只从HAL开始往下较为清晰,对JNI方法有初步了解,尚未完全清晰理解,JAVA层则几乎未涉及,此次学习只能暂时到此为止了!

android hal 诠释的更多相关文章

  1. android HAL 教程(含实例)

    http://www.cnblogs.com/armlinux/archive/2012/01/14/2396768.html Android Hal 分析                       ...

  2. 整理: Android HAL

    这篇文章整理来自http://bbs.chinaunix.net/thread-3675980-1-1.html 在论坛中看到的Android HAL讨论,有个ID描述的比较清楚,摘录如下: temp ...

  3. 【转】Android HAL实例解析

    原文网址:http://www.embedu.org/Column/Column339.htm 作者:刘老师,华清远见嵌入式学院讲师. 一.概述 本文希望通过分析台湾的Jollen的mokoid 工程 ...

  4. Android Hal 分析

    本文是基于android4.0.3.对应其他低版本的代码,可能有所差异,但基本大同小异. Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚.思路是把控 ...

  5. Android Hal层简要分析

    Android Hal层简要分析 Android Hal层(即 Hardware Abstraction Layer)是Google开发的Android系统里上层应用对底层硬件操作屏蔽的一个软件层次, ...

  6. 〖Android〗OK6410a的Android HAL层代码编写笔记

    一.编写LED灯的Linux驱动程序代码 之所以使用存在HAL层,是为了保护对硬件驱动过程的逻辑与原理: 所以,残留在Linux驱动层的代码,只保留了基本的读写操作,而不含有关键的逻辑思维: 1. l ...

  7. I.MX6 GPS Android HAL Framework 调试

    I.MX6 GPS Android HAL Framework 调试 一.参考文章: android4. GPS定位问题 http://blog.csdn.net/bzw073/article/det ...

  8. Android HAL实例解析

    一.概述 本文希望通过分析台湾的Jollen的mokoid 工程代码,和在s5pc100平台上实现过程种遇到的问题,解析Andorid HAL的开发方法. 二.HAL介绍 现有HAL架构由Patric ...

  9. Android HAL模块实现

    1. HAL介绍 Android的HAL(Hardware Abstract Layer硬件抽象层)是为了保护一些硬件提供商的知识产权而提出的.是为了避开linux的GPL束缚. 思路是把控制硬件的动 ...

随机推荐

  1. POJ-2236.WireleseNetwork.(并查集)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 43199   Accepted: 178 ...

  2. 大数据学习笔记5 - Spark

    Spark是一个基于内存计算的大数据并行计算框架.所以,Spark并不能完全替代Hadoop,主要用于替代Hadoop中的MapReduce计算模型. 在实际应用中,大数据处理无非是以下几个类型: 复 ...

  3. shell中脚本调试----学习

    1.使用dos2unix命令处理在windows下开发的脚本 将windows下编辑的脚本放置到linux下执行的情况如下: [root@ks ~]# cat -v nginx.sh #!/bin/b ...

  4. redis集群搭建及设置账户(转)

    Redis集群搭建以及为集群设置密码 介绍安装环境与版本 用两台虚拟机模拟6个节点,一台机器3个节点,创建出3 master.3 salve 环境. redis 采用 redis-3.2.4 版本. ...

  5. windows下Docker的安装

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...

  6. docker 删除所有none的镜像

    docker images|grep none|awk '{print $3}'|xargs docker rmi

  7. dskinlite自适应dpi

    调试了好久,mfc CDialog终于搞定,付费支持,qq: 80101277 效果图:

  8. docker--容器和镜像的导入导出及部署

    一.镜像导出 save 1.查看镜像 docker images 2.导出镜像 docker save -o test.tar image_name 或 docker save image_name ...

  9. weblogic linux环境下新建domain

    1. cd /home/weblogic/Oracle/Middleware/wlserver_10.3/common/bin 2. ./config.sh -mode=console(用控制台模式安 ...

  10. 代码简洁的滑动门(tab)jquery插件

    < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org ...