Android系统移植:开发概述

【导语】Android系统的发展现在已经达到世界级的了,Android系统的应用方向也从传统的手机、平板发展到机顶盒、车载系统、智能家居以及虚拟现实、人工智能。

时代选择了Android,而Linux成就了Android。

1.1 Android从Linux中发展而来

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踢出去了。

1.2 Android软件系统架构

看一下经典的Android系统架构图:
Android系统移植:开发概述_第1张图片
其软件层次结构自上而下分为以下4层:
- [x] 1.Linux操作系统层
- [x] 2.本地库和Android运行环境
- [x] 3.Android应用程序框架
- [x] 4.应用程序app

  • 第1层和第2层:通过Android API使得开发者可以很方便的调用系统的API来获取Android框架组件;
  • 第2层和第3层:本地和Java接口;
  • 第3层和第4层:从Linux操作系统的角度来看,分为内核空间和用户空间,第2,3,4层都是用户空间层;

第3层中:

加上了一个Dalvik Virtual Machine(Android程序的虚拟机),它是Android中Java程序的运行基础。每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行。Dalvik虚拟机依赖于Linux内核的一部分功能——线程机制、内存管理机制,能高效使用内存,并在低速CPU上表现出的高性能。

第4层:

看Android系统的最下面一层,是Android按标准的Linux内核修改而来,保留了Linux内核的主要架构,同时Android按照移动设备的需求,在文件系统、内存管理、进程间通信机制和电源管理方面进行了修改,添加了相关的驱动程序和必要的新功能。

1.3 Android移植的概念

Android系统移植:在特定的硬件平台上,实现各个外部设备的功能,以使新Android系统正常稳定工作。

现在安卓智能手机已经非常普遍了,App现在基本上是周周更有些甚至日日更,但是 每当Google发布Android新版SDK之后,很长一段时间市面上才会出现携带最新Android系统的手机出现。这是为什么?其实在这段SDK已经发布,但是市面上却并没有最新版android系统手机出现的空白时间,各大厂商紧赶紧做的一件事情就是——Android系统移植。

1.4 Android移植的主要任务

从之前的Android软件系统架构图,可以看出, Android是一个体量很大的系统,我们可以从四个方面对Android系统进行移植。

1.4.1 BootLoader

BootLoader启动加载程序,系统在上电或复位时通常都从地址0x00000000处开始执行的一段短小的启动程序,它所做的事情就是初始化硬件,CPU时钟之类的,以及加载内核文件。

BootLoader既然要做硬件初始化之类的,必然和硬件相关,所以它的代码并非通用的,不同的硬件需要不同的BootLoader代码,各大厂商可能都有自己的,并且加入开机画面之类的。最常听说的是u-boot和h-boot,后者是htc的bootloader。我们常说的刷机,是不会动bootloader的,只会动这之后的系统部分。

1.4.2 Linux驱动和Android硬件抽象

(1).Linux中的相关设备驱动程序

驱动程序是硬件和上层软件的接口。在Android手机系统中,需要基本的屏幕、触摸屏、键盘等驱动程序,以及音频、摄像头、电话的Modem、Wi-Fi、蓝牙等多种设备驱动程序。

(2).Android本地框架中的硬件抽象层(HAL)

在Android中硬件抽象层工作在用户空间,介于驱动程序和Android系统之间。Android系统对硬件抽象层通常都有标准的接口定义,在开发过程中,实现这些接口也就给Android系统提供了硬件抽象层。

1.4.3 Android framework

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/

1.5 Android系统源码的编译与调试

解压后的Android源码一般会占用10GB以上的硬盘空间,如此庞大的系统,它是如何编译,以及是全部编译还是部分编译,哪些文件先编译哪些文件后编译,最后如何生成烧录到机器的image镜像。这些问题都有赖于android的编译系统。Android的编译系统,按我的理解,就是有利用Makefile以及 Kconfig文件组织统领文件的加载,再利用shell脚本对文件进行有序编译。

版权声明:本文为【limin13215】原创文章,欢迎转载, 转载请注明链接地址:http://blog.csdn.net/limin2928/article/details/72628555

你可能感兴趣的:(android系统移植)