安卓程序员,Linux,java,有趣的架构。

作者 : 开心源码 本文共2745个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共83人阅读

先来看常见的Linux系统架构,你可以参考Linux的架构

内核是系统的底层。Linux开机后,内核即启动,并存活于属于自己的内存空间,即内核空间(kernel space)。内核的一大功能是和硬件通信。内核中包含各种驱动程序,这些驱动程序既能实现底层的硬件读写操作,又包含硬件用逻辑。比方一台打印机的驱动,会把打印指令放在内存中的A位置,把打印数据放在内存中的B位置。打印机读取指令后,会从B位置获得数据打印。在内核上层,驱动程序的功能被笼统为函数调使用,比方printx(data)。这个函数调使用隐藏了许多细节,比方如何执行读写,以及A和B的具体位置。

除了笼统硬件外,内核还维护着Linux的许多重要运行机制,比方虚拟内存、调度器、信号以及进程间通信(IPC)。内核的功能接口是系统调使用(system call)函数。

使用户用C或者者C++编写的程序,将编译成机器码,运行成为一个进程(process)。每个进程都会有一个自己的进程空间。进程空间存活于内核空间之外的使用户空间(user space)。进程空间中包含程序的代码和数据。不同进程的进程空间相互独立。进程间假如想要相互交流,需要借使用特殊的进程间通信(IPC)机制。进程空间中有栈(stack)和堆(heap)。当执行到新的函数调使用时,栈顶会添加一帧(stack frame),使用于记录该函数的数据和返回地址。当函数执行完成时,该帧会弹出,并根据返回地址接着执行母程序的指令。堆中的空间由程序自由分配。你可以进一步参考Linux从程序到进程。

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 一个进程空间

Linux的程序大多是C和C++编写。代码被编译为机器码,以便计算机了解。常使用的代码被编译成库(library)。程序员可以从自己的程序中调使用库函数,来重复利使用已有代码。程序中调使用库函数时,库中包含的机器代码会加载入程序对应的进程空间。

Android架构

我们现在来看看安卓的架构。Android的底层用的是Linux内核。在使用户空间中,每个应使用也会运行为一个进程。但安卓细节方面和传统Linux差别很大。

HAL

安卓驱动硬件的方式与Linux不尽相同。传统Linux的驱动完全存活于内核空间。Android则在内核外部添加了硬件笼统层(HAL, Hardware Abstraction Layer),把一部分驱动功能放到HAL层中。你或者许会奇怪,安卓为什么费尽麻烦添加一个HAL呢?为了保护源代码。Linux内核采使用了GPL协议,所以硬件生产商想要支持Linux系统,必需遵照GPL协议公开硬件驱动的源代码。但这些源代码中包含有许多硬件的设计信息,牵涉到硬件生产商的核心利益。而添加了HAL层之后,硬件厂商就不需要开放所有的驱动代码了。

我们来看看HAL的具体工作方式。安卓的HAL存活在使用户空间,它与内核驱动通信。但HAL是个“空壳”,安卓会根据需要,加载不同的动态库,比方调使用计算机时,载入libprinter.so。这个动态库是由硬件厂商提供的。比方上面的打印机,硬件厂商可以把读写功能做成驱动。而“指令写入位置A、数据写入位置B”这样的高层逻辑,则编译成库文件(.so)。当我们用打印机打印时,我们将打印需求和数据发送给HAL。HAL加载对应的动态库,通过内核驱动的读写功能,将指令写入打印机的内存位置A,数据写入位置B。打印机预装的程序从位置A读到打印指令,就会从位置B读取数据,实现打印。这样,HAL实际上把部分驱动功能放入到动态库中,内核中的驱动只保留最基本的读写操作功能。部分驱动功能从内核空间转移到了使用户空间。因为高层逻辑是编译好的.so文件,打印机厂商不使用担心如指令位置A、数据位置B这样的信息泄露。

左为Linux,右为安卓HAL

安卓的HAL板块是从Linux内核导出的,所以源代码公开。HAL是Apache协议,并不要求它的配套程序,如硬件驱动的源码公开。因为这些库函数没有直接调使用内核,所以不需要释放源代码。通过HAL层,安卓保护了硬件厂商的商业利益,鼓励了硬件厂商对安卓系统的支持。

当然,Linux开发小组对此很不高兴,把安卓的开发分支从Linux内核中删除。

Dalvik虚拟机

安卓的应使用是由Java编写的,而包括HAL在内的Linux的库都是由C/C++编写的,这个落差由Dalvik虚拟机衔接的。当一个应使用运行时,进程空间内将包含一个Dalvik虚拟机。Java程序编译为字节码文件,运行在Dalvik虚拟机中。根据Java代码中的要求,Dalvik通过JNI(Java Native Interface)调使用底层的C/C++编写的功能。JNI是从Java中调使用C/C++板块的接口。因为上层接口的标准化,字节码可以畅通无阻的跨平台运行。

Dalvik VM

Dalvik虚拟机内部是一个“虚拟”进程空间,有自己的栈和堆,管理代码的运行流程。假如这以“虚拟”进程空间不足,Dalvik内建的垃圾回收(garbage collection)机制会自动清空堆上不再用的对象。自动的垃圾回收简化了程序员的工作,但速度较慢。手动内存管理效率高,但需要更多的编程,且容易犯错。垃圾回收的具体原理可参考Java内存管理与垃圾回收。

当然,Oracle不高兴,认为Dalvik是对JVM赤裸裸的抄袭。

Core Library和Android Framework

Android程序员的主要工作是编写Dalvik上运行的Java程序。Google提供了核心类库(Java core library),它包括Java的常使用类库,如:

java.lang

java.util

java.math

java.net

这些类库的API,与Oracle的官方API相同,所以你可以按照同样的方法调使用。

核心类库中还包括Dalvik虚拟机的调使用接口:

dalvik.annotation

dalvik.bytecode

dalvik.system

安卓程序员还可以调使用少量针对安卓的类库,即安卓框架(Android Framework)。这些类库对应安卓的特定功能。通过它们,我们可以操纵安卓上的各个功能板块,从触屏到GPS,从视图元素到数据库。如:

android.database

android.bluetooth

android.gesture

安卓相关的类库列表

核心类库和安卓框架是安卓程序员的左膀右臂。再加上Java语言本身的逻辑,这就是安卓程序员战斗着的世界了。我会在以后的文章中,继续深入这个战场。

如有什么建议和疑问,欢迎留言探讨。

欢迎大家加群技术交流:367685933

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 安卓程序员,Linux,java,有趣的架构。

发表回复