`
yangshen998
  • 浏览: 1246822 次
文章分类
社区版块
存档分类
最新评论

Android源码学习之八—系统启动过程

 
阅读更多

Android源码数量庞大,虽然对它的学习从未停止,但是整理成这样的文字,实在是费时费力的一件事情,不过好在前文已经对其基本机制加以分析,相信以此为基础,其他的内容学习起来就没那么困难了。

今天是2010年的最后一天了,回顾这一年,从手机操作系统的角度来看,我把重点放在了Android上,对Windows PhoneIPhone没有太深入研究,正好以此做一终结,把对Android源码的学习告一段落。从软件工程或项目管理角度来看,今年感触也很多,可能会成为明年的重点吧,希望到时能在软件工程方法、过程、架构设计、项目管理方面也能成些文字以供交流。

做为Android源码学习系列的最后一文,还是应该从大的角度写点东西,想写ParcelableBinder,也想写WindowsManagerDialog,或者是系统架构、JNI,最后还是落笔为Android的系统启动过程了,原因是友人问我这方面的问题,于是偷了懒,顺手成文。

Android的启动过程可以分为两个阶段,第一阶段是Linux的启动,第二阶段才是Android的启动,下面我们分别来了解一下具体的过程。

首先是Linux启动,这一部分我想就可以略过了,无非是LinuxBootloaderKernelDriver之类的,在这里唯一要提到的就是ServiceManager,即服务管理器,这个是做为一个进程在Android加载之前就被启动了,我们可以从init.rc中看到这个配置项:

service servicemanager /system/bin/servicemanager

ServiceManagerBinder的服务管理守护进程,是Binder的核心,由其使用Binder驱动进行IPC管理,关于IPC通讯的机制,此处不再详述。在APPFramework中,应用程序使用的ServiceManager.java就是通过Proxy与这个守护进程进行的通讯。

然后是Android的启动,接下来要详细描述的部分。我们还是先看一下init.rc中的配置

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

linux启动以后,启动zygote服务进程,这个进程恰如其名:孵化器,是所有Android应用程序的孵化器。

我们来看一下app_process的代码,位置是在:

frameworks/base/cmds/app_process/app_main.cpp

main()函数中有如下代码:

if (0 == strcmp("--zygote", arg)) {

bool startSystemServer = (i < argc) ?

strcmp(argv[i], "--start-system-server") == 0 : false;

setArgv0(argv0, "zygote");

set_process_name("zygote");

runtime.start("com.android.internal.os.ZygoteInit",

startSystemServer);

}

从中可以追踪到AndroidRuntime,代码位于:

frameworks/base/core/jni/AndroidRuntime.cpp

start()函数中有如下代码:

/* start the virtual machine */

if (startVm(&mJavaVM, &env) != 0)

goto bail;

……

env->CallStaticVoidMethod(startClass, startMeth, strArray);

即先启动了虚拟机,然后利用JNI调用了zygoteInit函数。

继续追踪到frameworks/base/core/java/com/android/internal/os/ZygoteInit.javamain()函数,代码如下:

if (argv[1].equals("true")) {

startSystemServer();

} else if (!argv[1].equals("false")) {

throw new RuntimeException(argv[0] + USAGE_STRING);

}

Log.i(TAG, "Accepting command socket connections");

if (ZYGOTE_FORK_MODE) {

runForkMode();

} else {

runSelectLoopMode();

}

前一部分是在启动系统服务,后一部分是虽然是一个条件判断,但ZYGOTE_FORK_MODE被赋了false,所以进行else分支的runSelectLoopMode()函数,在该函数中,实际上是在一死循环中利用zygoteConnection类通过socket的方式进行消息处理,用于fork出新的zygote,从而以最轻量级的方式实现每个进程一个虚拟机的机制。

继续来看startSystemServer(),代码位于:

frameworks/base/services/java/com/android/server/systemserver.java

在其main()函数中调用了init1(args)这个native函数,利用JNI机制,跟踪至

frameworks/base/services/jni/com_android_server_systemService.cpp,然后到

frameworks/base/cmds/system_server/library/system_init.cpp

system_init()函数中有如下代码:

if (strcmp(propBuf, "1") == 0) {

// Start the SurfaceFlinger

SurfaceFlinger::instantiate();

}

AndroidRuntime* runtime = AndroidRuntime::getRuntime();

LOGI("System server: starting Android services./n");

runtime->callStatic("com/android/server/SystemServer", "init2");

即完成了SurfaceFlinger的实例化,然后利用运行时的callStatic()函数调用了SystemServerinit2()函数,这个函数位于:

frameworks/base/services/java/com/android/server/SystemServer.java

代码是:

public static final void init2() {

Slog.i(TAG, "Entered the Android system server!");

Thread thr = new ServerThread();

thr.setName("android.server.ServerThread");

thr.start();

}

在这个ServerThread线程中,可以看到我们熟悉的Android服务了,比如WallpaperService服务的启动:

try {

Slog.i(TAG, "Wallpaper Service");

wallpaper = new WallpaperManagerService(context);

ServiceManager.addService(Context.WALLPAPER_SERVICE, wallpaper);

} catch (Throwable e) {

Slog.e(TAG, "Failure starting Wallpaper Service", e);

}

最后,调用各服务的systemReady()函数通知系统就绪。

至此,系统的启动过程结束,借用两张图来说明问题:

从这里可以看出,linuxinit在启动若干守护进程之后,就启动了Androidruntimezygotezygote再启动虚拟机,系统服务,系统服务再启动完本地服务后,又启动了若干Android服务,并完成向ServiceManager的注册工作,最后系统启动完成。系统的进程空间如下图所示:

可见,由zygote孵化器为各进程以写时复制的方式用最小的代价实现了虚拟机。

好了,相信经过这一系列的源码跟踪,我们都能对Android的启动过程有更清晰的认识,新年即将到来,在结束本系列文章的同时,祝大家新年快乐。

——欢迎转载,转载请注明来自于http://blog.csdn.net/caowenbin,谢谢——

分享到:
评论

相关推荐

    8天快速掌握Android视频教程67集(附源码)

    8天快速掌握Android视频教程67集(附源码)课程目录:【】01_前言【】02_搭建Android开发环境【】03_创建与启动手机模拟器和学习使用ANDROID操作系统【】04_开发与运行(卸载)第一个ANDROID应用【】05_项目的目录结构...

    传智播客Android视频教程-课程源码.rar

    7&gt; 分析第一个ANDROID应用的启动过程 8&gt; 电话拔打 9&gt; 查看手机模拟器往控制台输出的日志信息 10&gt; 如何部署应用到真实手机 11&gt; 短信发送 12&gt; 布局介绍 LinearLayout (线性布局)、AbsoluteLayout(绝对布局)、...

    深入理解Android:卷I--详细书签版

     Android系统开发工程师常常需要深入理解系统的运转过程,而本书所涉及的内容可能正是他们在工作和学习中最想了解的。那些对具体模块(如Audio系统和Surface系统)感兴趣的读者 也可以直接阅读相关章节的内容。 ...

    如何深入学习AndroidFramework

    本篇文章主要介绍了什么是Framework,Framework开发学什么 ,Framework开发的主要内容 Framework开发学什么 Framework开发的...7. 系统启动过程分析 8. 应用层框架 9. 显示系统 10. Android 输入系统 11. 系统应用

    Android高级编程--源代码

    由于现有的手机应用程序的开发是构建在各手机厂家的私有操作系统之上的,所以它限制了第三方应用程序的开发,而Android为我们提供了一个开放和通用的选择。因为没有了人为制造的障碍,所以Android开发人员可以自由地...

    Android Framework实战开发篇

    广大的Android应用开发者是不是对Android系统充满着好奇,是不是很想学习Android系统开发,可惜自己学习难度又太大,本课程将手把手教你学Android Framework开发,带你走进Android系统开发的殿堂,全课程以实战为主...

    8天快速掌握Android系列视频之04_开发与 运行(卸载)第一个ANDROID应用

    运行(卸载)第一个ANDROID应用,05_项目的目录结构与安装及启动过程分析,06_电话拔号器,07_查看应用输出的错误信息 与如何部署应用到真实手机,08_短信发送器,09_深入了解各种布局技术,10_对应用进行单元测试,...

    android开发艺术探索高清完整版PDF

    , 《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然...

    Android开发艺术探索

    《Android开发艺术探索》侧重于Android知识的体系化和系统工作机制的分析,通过《Android开发艺术探索》的学习可以极大地提高开发者的Android技术水平,从而更加高效地成为高级开发者。而对于高级开发者来说,仍然...

    8天快速掌握Android系列视频之07_查看应用输出的错误信息 与如何部署应用到真实手机

    运行(卸载)第一个ANDROID应用,05_项目的目录结构与安装及启动过程分析,06_电话拔号器,07_查看应用输出的错误信息 与如何部署应用到真实手机,08_短信发送器,09_深入了解各种布局技术,10_对应用进行单元测试,...

    android-source-study:android原始码学习-android

    在分析android源码的过程中我更希望以一种有序的分析过程来分框架的源码,这里我简单的以以下的源码流程来分析:初步消息机制原始码系统核心进程启动流程源码应用进程启动流程例程apk解析与安装流程原始码活动启动...

    【推荐】超全的移动安全自学资料精编合集(43份).zip

    Android安全开发基础: Android系统的启动过程分析 Android安全开发基础: 图形界面(UI)和碎片(Fragment)(上) Android安全开发基础: 图形界面(UI)和碎片(Fragment)(下) Android安全开发基础: 持久化技术 ...

    Java版水果管理系统源码-Forward:Java+Android知识体系+Jetpack系列详解+MVVM实战(补充中......)

    Java版水果管理系统源码 Forward This project is for Study. Android学习路线 初级工程师:阅读官方文档+练习官方Demo 技术要求 四大组件使用 ...了解SystemServer的启动过程 了解主线程的消息循环模

    JAVA上百实例源码以及开源项目源代码

     Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...

    JAVA上百实例源码以及开源项目

    此时此景,笔者只专注Android、Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能。编辑音乐软件的朋友,这...

    网狐荣耀版开发使用常见问题解答

    在系统的使用与运营过程中,会有很多问题,这些教程只要认真学习,都会迎刃而解。当然在解决的过程中也要动脑。 实在解决不了,可以互相沟通Q-Q:457189 三十、网狐荣耀版服务器端启动出现“您的服务器组件没有得到...

    淘宝放单源码Java-tester-resource:测试技术资源

    淘宝放单源码Java 测试资源整理 在 GitHub ...安卓(Android)Activity启动过程性能剖视(1) Web、PC客户端和移动端APP设计自检 应用宝基于Robotium自动化测试 Unittest实现H5页面接口功能测试 Macaca-J

    java软件笔试题-MyNotebook:我大学时期的笔记本

    APP启动过程 LeakCanary源码分析 React-Native源码分析 gradle源码分析 part 2:设计模式与架构 part 3:编程语言 & 前端 & 机器学习 C++笔记 part 4: 数据结构与算法 part 5: 笔试/面试 part 6:专业基础 输入URL到...

Global site tag (gtag.js) - Google Analytics