天天看点

Android系统架构Android系统架构Android 层间调用JNI(Java Native Interface)NDK

Android系统架构

Android系统架构Android系统架构Android 层间调用JNI(Java Native Interface)NDK

(一)Linux Kernel(/kernel,/bootable,/devices)

Android内核 对Linux内核进行了增强,增加了一些面向移动计算的特有功能。例如:

  • 低内存管理器LMK(Low Memory Keller)。源代码位于 drivers/staging/ android/lowmemorykiller.c
  • 匿名共享内存(Ashmem),mm/ashmem.c。
  • 轻量级的进程间通信Binder机制,源代码位于drivers/staging/android/binder.c。等。

这些内核的增强使Android在继承Linux内核安全机制的同时,进一步提升了内存管理,进程间通信等方面的安全性。

Android Linux Kernel 特征:

1.它没有glibc支持

由于Android最初用于一些便携的移动设备上,所以,可能出于效率等方面的考虑,Android并没有采用glibc作为

C库,而是Google自己开发了一套Bionic Libc来代替glibc。

2.它并不包括一整套标准的Linux使用程序

Android并没有完全照搬Liunx系统的内核,除了修正部分Liunx的Bug之外,还增加了不少内容,比如:它基于ARM

构架增加的Gold-Fish平台,以及yaffs2 FLASH文件系统(如果学习了嵌入式的话就会知道yaffs2 FLASH文件系

统已经在基于linux的很多嵌入式设备上采用了,技术已经非常成熟)等。

3.它没有本地基于X服务的窗口系统

什么是本地窗口系统呢?本地窗口系统是指GNU/Linux上的X窗口系统,或者Mac OX X的Quartz等。不同的操作系统

的窗口系统可能不一样,Android并没有使用(也不需要使用)Linux的X窗口系统(对原作者的这个观点不是很赞

同,原文章这一点放在第一条,并说“这是Android不是Linux的一个基本原因”,这个不敢苟同,由于作者 没有

指明android用的什么显示系统,我也不好说)。

4.Android专有的驱动程序

除了上面这些不同点之外,Android还对Linux设备驱动进行了增强,主要如下所示。

1)Android Binder 基于OpenBinder框架的一个驱动,用于提供 Android平台的进程间通信(InterProcess

Communication,IPC)功能。源代码位于drivers/staging/android/binder.c。

2)Android电源管理(PM) 一个基于标准Linux电源管理系统的轻量级Android电源管理驱动,针对嵌入式设备做

了很多优化。源代码位于:

kernel/power/earlysuspend.c

kernel/power/consoleearlysuspend.c

kernel/power/fbearlysuspend.c

kernel/power/wakelock.c

kernel/power/userwakelock.c

3)低内存管理器(Low Memory Killer) 比Linux的标准的OOM(Out Of Memory)机制更加灵活,它可以根据需要

杀死进程以释放需要的内存。源代码位于 drivers/staging/ android/lowmemorykiller.c。

4)匿名共享内存(Ashmem) 为进程间提供大块共享内存,同时为内核提供回收和管理这个内存的机制。源代码位于

mm/ashmem.c。

5)Android PMEM(Physical) PMEM用于向用户空间提供连续的物理内存区域,DSP和某些设备只能工作在连续的物

理内存上。源代码位于drivers/misc/pmem.c。

6)Android Logger 一个轻量级的日志设备,用于抓取Android系统的各种日志。源代码位于

drivers/staging/android/logger.c。

7)Android Alarm 提供了一个定时器,用于把设备从睡眠状态唤醒,同时它还提供了一个即使在设备睡眠时也会

运行的时钟基准。源代码位于drivers/rtc/alarm.c。

8)USB Gadget驱动 一个基于标准 Linux USB gadget驱动框架的设备驱动,Android的USB驱动是基于gaeget框

架的。源代码位于drivers/usb/gadget/。

9)Android Ram Console 为了提供调试功能,Android允许将调试日志信息写入一个被称为RAM Console的设备

里,它是一个基于RAM的Buffer。源代码位于drivers/staging/android / ram_console.c。

10)Android timed device 提供了对设备进行定时控制的功能,目前支持vibrator和LED设备。源代码位于

drivers/staging/android /timed_output.c(timed_gpio.c)。

11)Yaffs2 文件系统 Android采用Yaffs2作为MTD nand flash文件系统,源代码位于fs/yaffs2/目录下。

Yaffs2是一个快速稳定的应用于NAND和NOR Flash的跨平台的嵌入式设备文件系统,同其他Flash文件系统相比,

Yaffs2能使用更小的内存来保存其运行状态,因此它占用内存小。Yaffs2的垃圾回收非常简单而且快速,因此能表

现出更好的性能。Yaffs2在大容量的NAND Flash上的性能表现尤为突出,非常适合大容量的Flash存储。

(二)硬件抽象层HAL(/hardware)

Android系统架构Android系统架构Android 层间调用JNI(Java Native Interface)NDK
  • 对下:对linux内核驱动程序封装,这样,对硬件的操作分成两层,抽象层位于用户空间,驱动程序位于内核。为了避免硬件信息的公开,只开源驱动层的代码即可。
  • 对上:对上层应用提供一个统一的简单的查询硬件设备的接口。它所谓的抽象,基本上也就仅限于这一功能,它通常并不提供对硬件的实际操作,对硬件的操作,还是由应用程序来完成。

Linux内核源代码版权遵循GNU License,而android源代码版权遵循Apache License,前者在发布产品时,必须公布源代码,而后者无须发布源代码。如果把对硬件支持的所有代码都放在Linux驱动层,那就意味着发布时要公开驱动程序的源代码,而公开源代码就意味着把硬件的相关参数和实现都公开了,内核驱动层只提供简单的访问硬件逻辑,例如读写硬件寄存器的通道,至于从硬件中读到了什么值或者写了什么值到硬件中的逻辑,都放在硬件抽象层中去了,

(三)系统运行时库(/libcore,/dalvik,/bionic,/system)

  • 程序库:C/C++库,这些库能被Android系统中不同的组件使用。

    它们通过Android Framework为开发者提供服务。

  • 运行库:

    Core Libraries 提供了JAVA编程语言核心库的大多数功能,API,会调用native方法, android.os,android.NET,android.media

    Dalvik虚拟机 每一个 Android应用程序都在它自己的进程中运行,都拥有一个独立的Dalvik虚拟机实例。

(四)Android 应用程序框架(/framework)

应用程序框架层是我们从事Android开发的基础,很多核心应用程序也是通过这一层来实现其核心功能的,该层简化了组件的重用,开发人员可以直接使用其提供的组件来进行快速的应用程序开发,也可以通过继承而实现个性化的拓展。

(五)Android 应用程序(/packages)

包括各类与用户直接交互的应用程序,或由java语言编写的运行于后台的服务程序,例如,智能手机上实现的常见基本功能 程序,诸如SMS短信,电话拨号,图片浏览器,日历,游戏,地图,web浏览器等程序,以及开发人员开发的其他应用程序。

Android 层间调用

Android系统架构Android系统架构Android 层间调用JNI(Java Native Interface)NDK

以Audio为例:(应用程序调用硬件设备)

应用程序调用了应用框架层的Runtime Service(这里是MediaPlayer),然后通过JNI调用与之绑定的Runtime Library (这里是MediaPlayer)。这时MediaPlayer又分别调用MediaFramework,和通过Binder IPC 的方式调用AudioFlinger(原生服务),而后通过AudioFlinger调用指定的库(libaudio.so),最后才调用Kernel Driver 。

JNI(Java Native Interface)

它提供了若干的API实现了Java和其他语言的通信(主要是C&C++)

上层Java(Framework)要调用底层的C/C++函数库(Libraries)必须通过Java的JNI来实现。

Java通过JNI机制和C/C++沟通的具体步骤

1、编写包含native本地方法的java类(.java)

2、通过javah工具生成C/C++语言的头文件(.h)

3、使用C/C++语言实现头文件(.c)

4、使用交叉编译工具对C/C++本地代码进行编译,最后通过链接生成*.so可执行的C/C++库(.so)

5、实际执行Java代码去和本地的C/C++代码互相沟通

NDK

NDK是Google公司推出的帮助Android开发者通过C/C++本地语言编写应用的开发包,包含了C/C++的头文件、库文件、说明文档和示例代码,我们可以理解为Windows Platform SDK一样,是纯C/C++编写的,但是Android并不支持纯C/C++编写的应用,同时NDK提供的库和函数功能很有限,仅仅处理些算法效率敏感的问题

简单点说,用C语言生成一个库文件,在java中调用这个库文件的函数。JNI的过程比较复杂,生成.so需要大量操作,而NDK就是简化了这个过程。
Android系统架构Android系统架构Android 层间调用JNI(Java Native Interface)NDK
Android系统架构Android系统架构Android 层间调用JNI(Java Native Interface)NDK