1.3 主要操作系统与Linux的对比
1.3.1 Linux和Android
Linux操作系统一般指常见的发行版,例如Ubuntu、OpenSuse、Fedora等,另外,Linux操作系统还存在大量的、不常见的发行版,例如Kali等。每一个Linux嵌入式硬件都可以看作携带了一个专用的Linux发行版。
一个Linux操作系统主要包括Linux内核、系统服务和其对应的配置文件、系统目录结构、常用库、程序包、命令工具和图形设施。Linux与Android都有基础的init、libc、常用命令、图形系统、Binder与Ashmem,但是采用了不同的实现,这些共有的部分可以看作一个最小Linux系统,在此之上的系统服务和组件是Linux桌面系统与Android系统的主要区别。
1.init
Linux内核规定要有一个init进程存在,通常init进程承担系统服务管理的职责。继承自System V风格的init系统比较简单,目前仍被应用在嵌入式系统中。后来,大部分的发行版都采用了systemd软件作为系统服务管理程序,而Android采用了自己编写的init工具,通过自定义的一套配置文件管理Android中系统服务的启动。大部分的系统服务都会有配置文件,配置文件被用来改变系统服务的行为,在桌面Linux发行版下的大部分系统服务的配置文件都位于/etc/目录下,而Android的则位于/system/etc/目录下,Android为了与Linux目录结构兼容,将根目录的etc目录链接到/system/etc目录,以此能方便地复用Linux下的一些工具。因此从目录结构上看,Android与其他发行版虽然区别很大,但是有很多相似的地方。
2.libc
所有的Linux系统都会有一个libc库,即运行时的加载器。大部分的桌面Linux发行版的libc库都是glibc,在嵌入式系统中有uClibc、newlib等小型化的libc库,而Android单独开发了一个libc库,叫作Bionic。glibc太过复杂,并且固定了很多操作系统的行为方式,例如DNS的解析缓存也在glibc中实现。Android系统对自定制的需求很强,所以进行了自研,运行加载器ld.so也是重新开发的。Android在ELF的文件格式上做了扩充,并且对应地设计了Android专用的linker程序。在应用层方面,Android可以兼容Linux,但是Linux不能直接兼容Android。
3.常用命令
Linux系统包含系统管理的常用命令,在POSIX中也规定了要包含的这些命令。在桌面Linux发行版中通常包含大量的命令和常用库,而在小型发行版中通常只包含必需的命令和共享库,甚至只包含一个集成必需的命令Busybox。在UNIX中的POSIX约定的命令,在Linux和Android中也会发现类似的结构。
大部分的桌面Linux发行版都会基于yum或者apt的方式进行包管理,一个包就是一个工具,或者说一个软件。在桌面版Linux中的组件大部分都是通过包的形式进行安装后使用的。这种类似的包管理软件有很多,很多发行版都在乐此不疲地推出自己专用的包管理软件。在Android中,由于Android的设计对于使用者来说是封闭的,甚至不允许使用者使用root权限,所以Android不允许动态地安装、卸载系统组件,常用的包管理的方法在Android中被去除了,取而代之的是纯粹的应用市场和对应的应用程序包的管理方式。
4.图形系统
在图形系统上,大部分的桌面Linux发行版都基于X窗口协议(或者Wayland协议),而Android则基于SurfaceFlinger的组件。Android的图形化没有网络传输的需求,但是有跨进程渲染的需求,SurfaceFlinger会完成桌面相关的混合渲染,而在X协议中,所有的渲染都集中传输渲染指令给X服务,由X服务进行渲染。SurfaceFlinger的设计允许应用本身在自己的窗口内调用渲染指令进行内部渲染,而SurfaceFlinger只负责组装渲染后期的呈现效果,这种架构节省了大量的渲染指令传输的开销。
5.Binder与Ashmem
Linux内核还添加了两个比较显著的改动:一个是Binder,另一个是Ashmem。Binder是为了高性能且安全的跨进程通信的需求而设计的,这是因为Android的系统服务层的设计需要大量的性能敏感的跨进程系统调用,而Binder设计了一个SystemServer组件,大量的系统服务存在于SystemServer进程中,对系统服务的需求需要跨进程地去SystemServer中寻求支援,但Linux已有的跨进程通信方案不能满足Android的系统设计需求。高性能且安全的跨进程通信方式几乎是每个系统都要面对的问题。Ashmem是匿名共享内存的实现,其实现方式比较简单,主要作用也是跨进程地共享内存块和提供给Java虚拟机使用。