nullnullnull概述概述Android系统是基于Linux内核的手机操作系统平台,要深入系统的学习Android,不仅仅是有Java和Android应用开发,必须要具备Linux,C/C++高级编程才能深入的涉及Android Framework和Android内核开发。nullApplicationsApplicationsAndroid装配一个核心应用程序集合,包括电子邮件客户端、SMS程序、日历、地图、浏览器、联系人和其他设置。所有应用程序都是用Java编程语言写的,它们的源代码是开放的,代码存放的位置在android_root/packages/apps。更加丰富的应用程序有待我们去开发!Application FrameworkApplication FrameworkAndroid应用框架的核心代码在android_root/frameworks/base目录下,是用java和c/c++语言编写的可重用类和组件,它提供一系列的服务和系统,包括视图、内容提供器、资源管理器、通知管理器、活动管理器等。
* 视图(View)——丰富的、可扩展的视图集合,包括列表、网格、文本框、按钮,甚至是内嵌的网页浏览器
* 内容提供者(Content Providers)——使应用程序能访问其他应用程序(如通讯录)的数据,或共享自己的数据
* 资源管理器(Resource Manager)——提供访问非代码资源,如本地化字符串、图形和布局文件
* 通知管理器(Notification Manager)——使得程序可以在状态栏中显示自定义的提示信息
* 活动管理器(Activity Manager)——管理应用程序生命周期,提供通用的导航回退功能
LibrariesLibrariesAndroid包含一个C/C++库的集合,供Android系统的各个组件使用。这些功能通过Android的应用程序框架(application framework)暴露给开发者。下面列出一些核心库:
* 系统C库—— 标准C系统库(libc)的BSD衍生,调整为基于嵌入式Linux设备
* 媒体库——基于 PacketVideo的OpenCORE。这些库支持播放和录制许多流行的音频和视频格式,以及静态图像文件,包括MPEG4、 H.264、 MP3、 AAC、 AMR、JPG、 PNG
* 界面管理——管理访问显示子系统和无缝组合多个应用程序的二维和三维图形层
* LibWebCore——新式的Web浏览器引擎,驱动Android 浏览器和内嵌的web视图
* SGL——基本的2D图形引擎
* 3D库——基于OpenGL ES 1.0 APIs的实现。库使用硬件3D加速或包含高度优化的3D软件光栅
* FreeType ——位图和矢量字体渲染
* SQLite ——所有应用程序都可以使用的强大而轻量级的关系数据库引擎
null Android 的运行环境(Android Runtime),这个也应该属于这个框架里
面的,android 的虚拟机叫做Dalvik,运行环境就是由这个虚拟机和基础
的java 类库组成。
Linux Kernel
Linux Kernel
Android基于Linux 2.6提供核心系统服务,例如:安全、内存管理、进程管理、网络堆栈、驱动模型。Linux Kernel也作为硬件和软件之间的抽象层,它隐藏具体硬件细节而为上层提供统一的服务。小结小结 总结一下,我们可以把android 分为四个层次,从底层往上依次为:linux 内核、C/C++库、java 框架和java 应用程序。简单的从上到下,android应用程序需要有java框架支持,比如它要发送短信,就需要java框架,java框架其实就是将C/C++库包装成为了一个JNI(Java Native Interface),而实现具体的功能是C/C++库,最后驱动硬件完成功能,这也就是linux内核部分。
从Android的架构可以知道,android设备的开发主要是Linux内核层的驱动开发、framework层的系统级开发和applications层的应用程序开发。虽然android的framework开发比较少,但是对其了解后更有利于整体开发的进行,当然很多设备厂商还是非常需要这些的。 Android系统启动过程Android系统启动过程 Android系统启动可以分为两个阶段,分别是linux启动和android启动。它们分别代表了Linux内核启动过程和android服务的启动过程。下面我们以mt6573平台为例,大致描述下linux启动过程,想知道详细的代码级的启动过程,需要个人研究代码,这里不打算从代码去分析它们。
Linux包括了bootloader和kernel(vmlinux)两部分。Mt6573平台为例, bootloader = preloader + uboot。在mt6573中,kernel (vmlinux)和ramdisk(ramdisk.img)被一起包裹在bootimage(boot.img)中,所以,kernel启动就是bootimage的启动。Linux启动Linux启动Mt6573开始上电到Linux系统运行完成,分成下面的几步:
1) 上电开始,运行常驻在boot rom中的boot code,boot code代码会
把烧入在Nand中的preloader拷贝到ISRAM中,跳转到Preloader
执行;
2) 执行preloader,preloader代码将烧入在Nand中的uboot拷贝
DRAM中,然后跳转到uboot执行
3) uboot对硬件进行初步的初始化,比如关闭 WATCHDOG、改变系
统时钟、初始化存储控制器、初始化lcd控制器等,然后从NAND中
装入bootimg,跳转到bootimg,引导kernel执行。
4) kernel会进一步初始化硬件,比如内存、irq、timer、console和
cache初始化等,载入built-in 设备驱动,完成启动。Kernel启动后
会创建若干内核线程(kernel thread),之后装入并执行程序
/sbin/init/,装入init process,切换至user space。
Android启动Android启动Android从Linux系统启动有4个步骤;
(1) init进程启动
(2) Native服务(Linux运行空间的进程或服务,最重要的一个服务就是 servicemanager)启动
(3) System Server,Android服务启动
(4) Home启动
第一步:initial进程(system/core/init/init.c)init进程,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构等)之后,就通过启动一个用户级程序init的方式,完成引导进程。init始终是第一个进程. Init进程首先初始化log系统,然后根据init.rc和 init.XX.rc(硬件平台相关,比如marvell平台,init.marvell.rc)脚本建立了几个基本的服务:
1) servicemanamger
2) zygote
3) …
最后Init并不退出,而是担当起property service的功能。
第一步:initial进程(system/core/init/init.c)1.1脚本文件1.1脚本文件init@System/Core/Init
Init.c: parse_config_file(Init.rc)
@parse_config_file(Init.marvel.rc)
解析脚本文件:Init.rc和Init.xxxx.rc(硬件平台相关)
Init.rc是Android自己
规定
关于下班后关闭电源的规定党章中关于入党时间的规定公务员考核规定下载规定办法文件下载宁波关于闷顶的规定
的初始化脚本(Android Init Language, System/Core/Init/readme.txt)
该脚本内容包含:
Commands:命令
Actions:动作
Triggers:触发条件
Services:服务
Options:选项
Properties:属性
null(1) Commands是一些基本的操作,例如: mkdir /sdcard 0000 system system mkdir /system mount tmpfs tmpfs /sqlite_stmt_journals size=4m 这些命令在init可执行程序中被解析,然后调用相关的函数来实现。
(2) Actions(动作)表示一系列的命令,通常在Triggers(触发条件)中调用,动作和触发条件的形式为: on
动作的使用示例如下: on init export PATH /sbin:/system/sbin:/system/bin:/system/xbin mkdir /system init表示一个触发条件,这个触发事件发生后,进行设置环境变量和建立目录的操作称为一个“动作”
null(3) Services(服务)通常表示启动一个可执行程序,Options(选项)是服务的附加内容,用于配合服务使用。
service vold /system/bin/vold socket scket stream 0660 root mount
service bootsound /system/bin/playmp3 user media group audio oneshot vold和bootsound分别是两个服务的名称,/system/bin/vold和/system /bin/playmp3分别是他们所对应的可执行程序。 socket、user、group、oneshot就是配合服务使用的选项。socket表示为vold程序分配一个socket资源,这里是创建一个名字为scket,类型为stream的socket。oneshot选项表示该服务只启动一次,而如果没有oneshot选项,这个可执行程序会一直存在--如果可执行程序被杀死,则会重新启动。
null(4) Properties(属性)是系统中使用的一些值,可以进行设置和读取。
setprop ro.FOREGROUND_APP_MEM 1536 setprop ro.VISIBLE_APP_MEM 2048 on property:ro.kernel.qemu=1 start adbd setprop 用于设置属性,on property可以用于判断属性,这里的属性在整个Android系统运行中都是一致的。
init脚本的关键字可以参考init进程的system/core/init/keyword.h文件 init.rc的使用方法,可以参考说明文件system/core/init/readme.txt
如果想要修改启动过程只需要修改init.c(system/core/init)或者init.rc里的内容即可.
1.2 服务启动机制
1.2 服务启动机制
我们来看看Init是怎样解析.rc文件开启服务的。
(1)打开.rc文件,解析文件内容@ system/core/init/init.c
将service信息放置到service_list中。@ system/core/init/parser.c
(2)restart_service()@ system/core/init/init.c
service_start
execve(…).建立service进程。
ServicemanagerServicemanager ServiceManager在init.rc文件中的服务启动项:
service servicemanager /system/bin/servicemanager
Android中ServiceManager的源码位于:
platform\frameworks\base\cmd\servicemanager\Service_manager.cpp ,我们发现了main函数,说名它本身也是一个进程。
ServiceManager服务是负责管理服务。客户端(应用程序)需要
向ServiceManager来查询和获得所需要服务。服务也需ServiceManager
注册自己以供客户端查询。可以看出ServiceManager是服务的大管家。
ServiceManager是通过字符驱动设备/dev/binder,在客户端和server之
间的传递数据。
第二步 Zygote
第二步 ZygoteServicemanager和zygote进程就奠定了Android的基础。Zygote这个进程起来才会建立起真正的Android运行空间,初始化建立的Service都是Navtive service.在.rc脚本文件中zygote的描述:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
所以Zygote从main(…)@frameworks/base/cmds/app_main.cpp开始
(1) main(…)@frameworks/base/cmds/app_main.cpp建立Java Runtime
runtime.start("com.android.internal.os.ZygoteInit", startSystemServer);
(2) runtime.start@AndroidRuntime.cpp
建立虚拟机通过运行:com.android.internal.os.ZygoteInit:main函数。
null(3)main()@com.android.internal.os.ZygoteInit//正真的Zygote。
代码位置在frameworks/base/core/java/com/android/internal/os/
zygoteInit.java,内部调用下面语句。
registerZygoteSocket();//登记Listen端口
startSystemServer();
这样进入Zygote服务框架。
经过这几个步骤,Zygote就建立好了,利用Socket通讯,接收ActivityManangerService的请求,Fork应用程序。
第三步 System Server(frameworks/base/services/java/com/android/server/systemserver.java)第三步 System Server(frameworks/base/services/java/com/android/server/systemserver.java) startSystemServer@com.android.internal.os.ZygoteInit在Zygote上fork了一个进程: com.android.server.SystemServer.于是
SystemServer@(SystemServer.java)就建立了。Android的所有服务循
环框架都是建立 SystemServer@(SystemServer.java)上。在
SystemServer.java中看不到循环结构,只是可以看到建立了init2的实现
函数,建立了一大堆服务,并AddService到service Manager。
main() @ com/android/server/SystemServer { init1(); } Init1()是在Native空间实现的(frameworks\base\services\jni\com_andoird_server_systemServer.cpp)。我们一看这个函数就知道了,init1->system_init() @System_init.cppnull 在system_init()我们看到了循环闭合管理框架。 { Call "com/android/server/SystemServer", "init2" ... ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool(); }
init2()@SystemServer.java中建立了Android中所有要用到的服务。
这个init2()建立了一个线程,来New Service和 AddService来建立服
务