【导语】Android系统的发展现在已经达到世界级的了,Android系统的应用方向也从传统的手机、平板发展到机顶盒、车载系统、智能家居以及虚拟现实、人工智能。
时代选择了Android,而Linux成就了Android。
Linux kernel 的版权是GPL(General Public License)——通用性公开许可证 , 也就是说开源; Android最早作为Linux下的一个分支也是遵循这一协议开源的,但是Google公司为了在商业上适应其在移动设备上的发展,Google采用了一些手法来绕过这问题。
他们把驱动程序移到 “userspace”,也就是说,把驱动程序变成在 Linux kernel 上头跑,而不是一起跑的东西,这样就可以避过GPL。然后,在 kernel 这边开个小门,让本来不能直接控制到硬件的 “userspace” 程序也可以碰得到,这样只要把”开个小门”的程序代码公布就行啦。”
为了得到更多厂商的支持,Google有意 选择了这样做,并且特意修改Kernel,使得原本应该包括在kernel中的某些功能,都被转移到了userspace之中,因此得以避开开源。
Android修改了Linux内核,但又不提供修改细节,这就违背了开源的精神,因此,Linux Kernel就把Android踢出去了。
看一下经典的Android系统架构图:
其软件层次结构自上而下分为以下4层:
- [x] 1.Linux操作系统层
- [x] 2.本地库和Android运行环境
- [x] 3.Android应用程序框架
- [x] 4.应用程序app
第3层中:
加上了一个Dalvik Virtual Machine(Android程序的虚拟机),它是Android中Java程序的运行基础。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。Dalvik虚拟机依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。
第4层:
看Android系统的最下面一层,是Android按标准的Linux内核修改而来,保留了Linux内核的主要架构,同时Android按照移动设备的需求,在文件系统、内存管理、进程间通信机制和电源管理方面进行了修改,添加了相关的驱动程序和必要的新功能。
Android系统移植:在特定的硬件平台上,实现各个外部设备的功能,以使新Android系统正常稳定工作。
现在安卓智能手机已经非常普遍了,App现在基本上是周周更有些甚至日日更,但是 每当Google发布Android新版SDK之后,很长一段时间市面上才会出现携带最新Android系统的手机出现。这是为什么?其实在这段SDK已经发布,但是市面上却并没有最新版android系统手机出现的空白时间,各大厂商紧赶紧做的一件事情就是——Android系统移植。
从之前的Android软件系统架构图,可以看出, Android是一个体量很大的系统,我们可以从四个方面对Android系统进行移植。
BootLoader启动加载程序,系统在上电或复位时通常都从地址0x00000000处开始执行的一段短小的启动程序,它所做的事情就是初始化硬件,CPU时钟之类的,以及加载内核文件。
BootLoader既然要做硬件初始化之类的,必然和硬件相关,所以它的代码并非通用的,不同的硬件需要不同的BootLoader代码,各大厂商可能都有自己的,并且加入开机画面之类的。最常听说的是u-boot和h-boot,后者是htc的bootloader。我们常说的刷机,是不会动bootloader的,只会动这之后的系统部分。
驱动程序是硬件和上层软件的接口。在Android手机系统中,需要基本的屏幕、触摸屏、键盘等驱动程序,以及音频、摄像头、电话的Modem、Wi-Fi、蓝牙等多种设备驱动程序。
在Android中硬件抽象层工作在用户空间,介于驱动程序和Android系统之间。Android系统对硬件抽象层通常都有标准的接口定义,在开发过程中,实现这些接口也就给Android系统提供了硬件抽象层。
android framework的移植,主要是针对Android源码中的 frameworks/base 目录下的代码的移植调试,对它进行编译之后在out目录下的system/framework文件夹中主要生成以下几个文件:
[x] (1).framework.jar
android的sdk中核心代码,提供了应用层调用的各种API的实现。
[x] (2).services.jar
services.jar是一些核心服务Java层的实现,比如ActivityManagerService, PackageManagerService等,这些服务大都运行在system_server进程中。配合libandroid_servers.so在机器启动时通过SystemServer以循环闭合管理的方式将各个service添加到ServiceManager中。
[x] (3).android.policy.jar
android.policy.jar提供了锁屏的实现以及手机窗口管理策略的实现。
[x] (4).framework-res.apk
android系统资源库,包括系统全局样式(style)与主题(theme)等等,在一些刷机论坛上提供的ROM包,一般都会对framework-res.apk进行反编译,修改里面的资源文件之后在重新打包。
这几个文件,通过usb连接手机,使用adb shell命令,进入到system/framework/目录可以看到。
看一下,android SDK源码frameworks/base目录下有哪些文件:
mli@ubuntu:~/work/source_ANDROID6.0.1/frameworks/base$ ll
total 336
drwxrwxr-x 32 mli mli 4096 Oct 17 2016 ./
drwxrwxr-x 17 mli mli 4096 Jun 15 2016 ../
-rwxrwxr-x 1 mli mli 51083 Oct 17 2016 Android.mk*
drwxrwxr-x 2 mli mli 4096 Oct 17 2016 api/
-rw-rw-r-- 1 mli mli 22688 Oct 17 2016 CleanSpec.mk
drwxrwxr-x 24 mli mli 4096 Oct 17 2016 cmds/
drwxrwxr-x 6 mli mli 4096 Oct 17 2016 core/
drwxrwxr-x 7 mli mli 4096 Oct 17 2016 data/
drwxrwxr-x 6 mli mli 4096 Oct 17 2016 docs/
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 drm/
drwxrwxr-x 2 mli mli 4096 Oct 25 2016 .git/
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 graphics/
drwxrwxr-x 6 mli mli 4096 Oct 17 2016 include/
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 keystore/
drwxrwxr-x 8 mli mli 4096 Oct 17 2016 libs/
drwxrwxr-x 5 mli mli 4096 Oct 17 2016 location/
drwxrwxr-x 7 mli mli 4096 Oct 17 2016 media/
-rw-rw-r-- 1 mli mli 0 Jun 15 2016 MODULE_LICENSE_APACHE2
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 native/
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 nfc-extras/
-rw-rw-r-- 1 mli mli 18182 Jun 15 2016 NOTICE
drwxrwxr-x 3 mli mli 4096 Oct 17 2016 obex/
drwxrwxr-x 3 mli mli 4096 Oct 17 2016 opengl/
drwxrwxr-x 21 mli mli 4096 Oct 17 2016 packages/
drwxrwxr-x 3 mli mli 4096 Oct 17 2016 policy/
-rw-rw-r-- 1 mli mli 112975 Oct 17 2016 preloaded-classes
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 rs/
drwxrwxr-x 3 mli mli 4096 Oct 17 2016 samples/
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 sax/
drwxrwxr-x 14 mli mli 4096 Oct 17 2016 services/
drwxrwxr-x 3 mli mli 4096 Oct 17 2016 telecomm/
drwxrwxr-x 3 mli mli 4096 Oct 17 2016 telephony/
drwxrwxr-x 4 mli mli 4096 Oct 17 2016 test-runner/
drwxrwxr-x 62 mli mli 4096 Oct 17 2016 tests/
drwxrwxr-x 2 mli mli 4096 Oct 17 2016 third-party/
drwxrwxr-x 12 mli mli 4096 Oct 17 2016 tools/
drwxrwxr-x 3 mli mli 4096 Oct 17 2016 wifi/
解压后的Android源码一般会占用10GB以上的硬盘空间,如此庞大的系统,它是如何编译,以及是全部编译还是部分编译,哪些文件先编译哪些文件后编译,最后如何生成烧录到机器的image镜像。这些问题都有赖于android的编译系统。Android的编译系统,按我的理解,就是有利用Makefile以及 Kconfig文件组织统领文件的加载,再利用shell脚本对文件进行有序编译。
版权声明:本文为【limin13215】原创文章,欢迎转载, 转载请注明链接地址:http://blog.csdn.net/limin2928/article/details/72628555