Android软家系统架构图
核心应用层
--------------------------------------
框架层
JNI层
dalvik虚拟机
本地库
HAL
厂家适配层
--------------------------------------
Linux内核
从上到下依次为:
核心应用层:这一层就是大家平常所接触的各种各样的系统自带应用,比如联系人,电话,音乐等。应用层往下就是开发人员所接触的。
框架层:这一层是 Android 系统的核心,它提供了整个 Android 系统运作的机制,像窗口管理,程序安装包管理,开发人员所接触的 Activity, Service, broadcast 等等。
JNI 层:JNI 层是 Java 程序和底层操作系统通信的一个机制,它使得 Java 代码可以调用C/C++代码来访问底层操作系统的 API。
Dalvik 虚拟机:Android 开发使用 Java 语言,应用程序的 Java 代码会被编译成 dalvik 虚拟机字节码,这些字节码由 dalvik 虚拟机解释执行。
本地库:本地库一般是由 C/C++语言所开发,直接编译成相应 CPU 的机器码,这其中包含标准 C 库,用以绘制图形的 skia 库,浏览器核心引擎 webkit 等。
HAL:硬件抽象层,为了和各个厂家的不同硬件工作,Android 定义了一套硬件接口,比如说为了使用相机,厂家的相机驱动必须提供的接口方法。这样使得上层的代码可以
独立于不同的硬件运行。
厂家适配层:本来 Android 定义的 HAL 层是直接和厂家提供的设备驱动打交道的,但是目前厂家不想开源 HAL 部分的代码,因此很多厂家都提供了一个我称之为厂家适配
层的代码,这样在 HAL 层接口的实现只是一个简单的对厂家适配层接口函数的调用。
内核:这一层就是大家熟悉的 Linux 内核,内核中包含有各种硬件驱动,这些驱动不同的手机厂商不同的手机是不一样的。Linux 内核是支持驱动模块化机制的,简单的说就
是允许用户动态的加载或者卸载某个硬件驱动,但是目前来看,手机厂商除了提供 WIFI驱动单独加载外,其它驱动都是和内核绑定在一起的。
从这张软件结构图来看,除了内核是放在 boot 分区外,其它层的代码都是在 system 分区中。
下面结合这张图来介绍 system 分区的主要目录内容:
*system/app: app 目录下存放的是核心应用,也就是大家熟知的系统 APP,这些系统自带的程序是不能简单的卸载的,要通过一些特殊的方式才能删除
(大家熟悉的一种方法是用 RE 文件管理器)。
*system/lib: lib 目录下存放的是组成 JNI 层,Dalvik 虚拟机,本地库,HAL 层和厂家适配层的所有动态链接库(.so 文件)。
*system/framework: 该目录下存放的是框架层的 JAR 包,其中对 MIUI 移植来说有 3 个最重要的 JAR 包(framework.jar, android.policy.jar, services.jar)。
后续的文章会重点介绍这 3 个包。
*system/fonts: 该目录下存放的是系统缺省的字体文件。
*system/media:该目录下存放的是系统所使用的各种媒体文件,比如说开机音乐,动画,壁纸文件等。不同的手机该目录的组织方式可能不一样。
如何修改这些文件请参考网上对应机型形形色色的教程,这里不再赘叙。
*system/bin: 该目录下存放的是一些可执行文件,基本上是由 C/C++编写的。其中有一个重要的命令叫 app_process 下一节单独介绍。
*system/xbin: 该目录下存放的是一些扩展的可执行文件,既该目录可以为空。大家常用的 busybox 就放在该目录下。Busybox 所建立的各种符号链接命令都是放在该目录。
* system/build.prop: build.prop 和上节说得根文件系统中的 default.prop 文件格式一样,都称为属性配置文件。它们都定义了一些属性值,代码可以读取或者修改这些属性值。
属性值有一些命名规范:
ro 开头的表示只读属性,即这些属性的值代码是无法修改的。
persist 开头的表示这些属性值会保存在文件中,这样重新启动之后这些值还保留。
其它的属性一般以所属的类别开头,这些属性是可读可写的,
但是对它们的修改重启之后不会保留。
很多 ROM 制作者都会修改一下 build.prop 信息,里面的一些以 ro.build 开头的属性就
是你在手机设置中的关于手机里看到的。可以通过修改 build.prop 文件来将这个 ROM 打上自己的印记(XXX 所修改)我见过一个只是删了 system/app 的一些程序,。
然后修改 build.prop中的ro.build.display.id 和 ro.build.version.incremental 中的两个属性值打上自己的大名的ROM。
system/etc: 该目录存放一些配置文件,和属性配置文件不一样,这下面的配置文件可能稍微没那么的有规律。
一般来说,一些脚本程序,还有大家所熟悉 GPS 配置文件(gps.conf)和 APN 配置文件(apns-conf.xml)放在这个目录。
像 HTC 将相机特效所使用的一些文件也放在这个目录下。