`
yinter
  • 浏览: 244608 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android启动过程

阅读更多
1. Boot系统初始化, 具体过程参见(system\core\init\Init.c)中的main函数,这时候,手机或者模拟器出现的画面是一个console,显示“ANDROID”msg。

2. 初始化成功后,就开始mounting系统,具体参见(system\core\mountd\Mountd.c)  中的main函数。

3.接下来运行androidRuntime,并开始启动java虚拟机dalvikvm。

4. Java虚拟机启动成功后,开始系统初始化。系统初始的第一步是用JNI方式实现的,对应java代码为(frameworks\base\services\java\com\android\server\SystemServer.java) init1(Native)函数,对应的JNI C++代码为(frameworks\base\core\jni\server\com_android_server_SystemServer.cpp),而实现的C++代码为

(frameworks\base\cmds\system_server\library\ System_init.cpp)   中的system_init()函数。

5. system_init调用SurfaceFlinger,SurfaceFlinger的readyToRun()函数用BootAnimation来实现开机动画,这时候手机或者模拟器显示是一副背景图加一个动态的小机器人。

6. 系统初始化的第二步,将启动ServerThread进程,参见SystemServer.init2()。ServerThread将启动各种系统服务,如Power Manager、Activity Manager等等,具体参见ServerThread的run函数,ServerThread同在SystemServer.java中。

7.这之后的事,应该就是进入系统了。(这部分没有调查过)。

--------------------------------------------------------------------------------

对于关注Android底层的朋友来说,其具体的启动过程应该是比较吸引我们的。但是很多启动文件什么的,都得adb push到host上来看,挺不方便的,都怪Android自带的Toolbox太简略了。所以在深入了解Android的启动流程之前,我们来把Busybox安装到Android上去,这样,就有很多工具供我们使用了。

  首先去busybox主页 下载最新版本的源代码,然后用arm的交叉编译器编译出busybox的可执行程序,编译的时候需要注意一些设置选项,例如

  Build Options —>

  Build BusyBox as a static binary (no shared libs) 这个要选上,因上这样子编译出来的busyBox才是可以独立运行的。

  │Do you want to build BusyBox with a Cross Compiler? │ │

  │ │(/HOME/toolchains/gcc-4.0.2-glibc-2.3.5/arm-9tdmi-linux-gnu/bin/arm-9tdmi-linux-gnu│ 这是交叉编译器的路径,要根据具体的情况来设置。

  Installation Options —>

  Don’t use /usr

  这样子编译出来的busybox才不会安装到你主机的/usr目录下。一定要选上。

  busybox的功能选项根据需要自选,但是不要太贪心.

  OK,这里就不纠缠于编译busybox的东西了,网上资料无数。接下来,我们把busybox安装到模拟器上去。先在模拟器上随便建一个busybox的文件夹,然后进入busybox可执行文件目录,使用命令

  adb push busybox.asc /data/busybox/busybox

  然后进入adb shell,chmod 777 ./busybox,就可以直接使用了。但现在还是不方便,总不能每用一个命令就输一次busybox吧?所以,我们可以先用./busybox --install将程序都安装到当前目录下,然后把当前目录添加到PATH变量中即可。暂时使用export来添加吧,如果想永久添加,往下看。

  好了,准备工作完成,开始研究的工作了。既然是研究启动过程,那当然是先看看init.rc文件。去etc目录打开它,分析一下内容,首先是对 env的定义,也就是全局环境变量的定义,接下来的建立和初始化里面的内容目前还不清楚什么意思,紧接着就是系统启动时运行的初始进程信息,这个比较有意思,包括了usbd-config和qemu,qemu自不用说,而usbd-config作为初始启动的进程,应该就是和上一篇文章猜的一样,用来调试或者usb通信的。往下看,是在初始启动进程完成之后开始启动的服务进程,这些进程如果因故退出,会自动重启。这里面包括了console控制台,adbd监护进程,usbd监护进程,debuggerd监护进程等.除去这些守护进程,能引起我们注意的,是runtime和zygote。这两个进程似乎掌管着其他进程以及应用程序的启动。

  现在,来让我们做一个实验吧,将自动调用的启动过程变成手动,看看启动流程具体是什么样的。想达到这个目的,首先就是要修改init.rc文件,当然不是在模拟器的console中改,一是不能改,二是你改了也没用,下次加载就会给你覆盖了。所以,我们要从原始镜像ramdisk.img入手了。从2.6标准Linux内核开始,initrd.img都采用cpio压缩,猜测ramdisk.img也一样,需要使用gunzip解压缩,然后再使用cpio解包。好,进入tools/lib/images目录下,先用file命令看看ramdisk.img的类型,没错,系统提示

  ramdisk.img: gzip compressed data, from Unix

  很好,然后将ramdisk.img复制一份到任何其他目录下,将其名称改为ramdisk.img.gz,并使用命令

  gunzip ramdisk.img.gz

  然后新建一个文件夹,叫ramdisk吧,进入,输入命令

  cpio -i -F ../ramdisk.img

  这下,你就能看见并操作ramdisk里面的内容了。当然你也可以直接在外面进行操作,但是还是建议把cpio解压缩出来的内容全部集中在一个文件夹里面,因为一会我们还要将其压缩成新的ramdisk.img。

  OK,现在开始修改步骤吧。用任何一款编辑器打开init.rc,首先在PATH那里加上你的Busybox安装路径,然后注释内容,我们要手工启动他们。

  # zygote {   # exec /system/bin/app_process   # args {   # 0 -Xzygote   # 1 /system/bin   # 2 –zygote   # }   # autostart 1   # }# runtime {   # exec /system/bin/runtime   # autostart 1   # }

  在这里需要注意,不要同时把两者都注释了,注释某一个,再试验手工启动它,如果两者同时注释我这里有问题,无法启动。

  好,接下来,使用下列命令重新打包成镜像

  cpio -i -t -F ../ramdisk.img > list

  cpio -o -H newc -O lk.img < list

  当前目录下生成的lk.img就是我们的新镜像了。使用自己的镜像启动emulator;

  emulator -console -ramdisk lk.img

  如果我们注释的是zygote,那么在#后输入

  app_process -Xzygote /system/bin –zygote

  手工启动,命令行中输出的信息是

  Prepping: /system/app/AlarmProvider.apk:/system/app/Browser.apk:/system/app/
Calendar.apk:/system/app/Camera.apk:/system/app/Contacts.apk:

  /system/app/Development.apk:/system/app/GDataFeedsProvider.apk:/system/app/
Gmail.apk:/system/app/GmailProvider.apk:/system/app/GoogleApps.apk:

  /system/app/GoogleAppsProvider.apk:/system/app/Home.apk:/system/app/ImProvider.apk:
/system/app/Maps.apk:/system/app/MediaPickerActivity.apk:

  /system/app/MediaProvider.apk:/system/app/Phone.apk:/system/app/PimProvider.apk:/system/
app/ApiDemos.apk:/system/app/SettingsProvider.apk:

  /system/app/Sms.apk:/system/app/SyncProvider.apk:/system/app/TelephonyProvider.apk:
/system/app/XmppService.apk:/system/app/YouTube.apk

  File not found: /system/app/AlarmProvider.apk

  File not found: /system/app/Calendar.apk

  File not found: /system/app/Camera.apk

  File not found: /system/app/GDataFeedsProvider.apk

  File not found: /system/app/Gmail.apk

  File not found: /system/app/GmailProvider.apk

  File not found: /system/app/MediaPickerActivity.apk

  File not found: /system/app/PimProvider.apk

  File not found: /system/app/ApiDemos.apk

  File not found: /system/app/Sms.apk

  File not found: /system/app/SyncProvider.apk

  File not found: /system/app/YouTube.apk

  Prep complete

  嘿嘿,从File not found的信息中可以看到一些Google可能会即将推出的应用,比如Gmail什么的。当然,这些都是Java框架的启动信息,我们以后还要借助其他工具来进行进一步探索。

  如果我们注释的是runtime,那么输出信息是:

  +++ post-zygote

  老实说,没有明白这是啥意思,呵呵,吃饭时间到了,懒得看了。

  好了,今天就说到这,基本的方法就是这样,有兴趣的朋友可以进一步深入研究。我们下一篇文章见。


原文地址:http://www.eepw.com.cn/article/89567.htm
分享到:
评论
1 楼 gaogaf 2010-09-07  
2. 初始化成功后,就开始mounting系统,具体参见(system\core\mountd\Mountd.c)  中的main函数。

这个文件我总是找不到。

相关推荐

    Android 启动过程详解

    ### Android启动过程详解 #### 一、概述 Android操作系统启动过程是一个复杂且精细的过程,它涉及到从硬件层面的初始化到最终用户界面的呈现。整个启动流程可以大致分为以下几个阶段: 1. **init进程启动** 2. **...

    Android 启动过程相关资料

    Android启动过程是一个复杂而有序的系统初始化阶段,涵盖了操作系统内核加载、系统服务启动、用户界面呈现等多个步骤。在这个过程中,Makefile起着至关重要的作用,它是构建Android系统的基石之一。 首先,Android...

    Android启动过程分析

    ### Android启动过程深入解析 Android启动过程是操作系统与硬件初始化、系统服务启动及应用程序环境建立的复杂流程。本文将从Init进程的启动入手,详细解析Android设备如何从电源开启到用户界面呈现的整个过程。 #...

    Android启动过程详解[借鉴].pdf

    Android 启动过程详解 Android 启动过程可以分为四个步骤:init 进程启动、Native 服务启动、System Server 启动和 Home 启动。 第一步:init 进程启动 init 进程是 Android 启动的第一个进程,由内核启动的用户...

    android 核心分析之------Android 启动过程详解

    ### Android核心分析之Android启动过程详解 Android启动过程是一个复杂且有序的流程,涉及多个关键阶段,从硬件初始化到最终的用户界面呈现。这一过程可以分为四大步骤:init进程启动、Native服务启动、...

    android核心分析之------Android启动过程详解.pdf

    Android启动过程详解主要分为四个关键步骤,这四个步骤构建了Android系统的基石。下面将详细阐述这些步骤以及涉及的重要组件。 第一步:初始化init进程 init进程是Android系统启动的第一个用户级进程,由Linux内核...

    android启动流程

    android启动流程,以uml图的方式显示了android的启动流程

    Android_启动过程分析

    下面是详细的Android启动过程分析: 1. **Bootloader阶段**: Bootloader是设备启动时运行的第一段软件,通常由制造商定制,负责加载Linux内核。Bootloader如uboot,会检查设备状态,加载必要的固件,然后将控制权...

    Android 启动过程分析

    此文档是根据sundy讲解的android启动视频而进行整理的,主要是跟踪andoird的系统开机过程,

    浅谈android性能优化之启动过程(冷启动和热启动)

    Android 应用程序启动优化之冷启动和热启动详解 一、应用程序启动方式 ...了解 Android 应用程序的启动过程对于优化应用程序的性能非常重要,可以根据应用程序的启动方式和启动过程来进行相应的优化处理。

    android启动优化.pdf

    ### Android启动过程优化详解 #### 一、Android启动过程概览 Android的启动过程是一个复杂且有序的过程,涉及多个核心组件和服务的初始化。下面将详细解释Android启动过程的关键步骤。 ##### 1. Init进程的启动 ...

    android启动源代码分析(init.c)

    Android启动源代码分析是一个深入探讨Android系统启动机制的重要途径,本文将重点分析Android启动过程中的关键源代码文件init.c,该文件位于system/core/init目录下,主要负责启动和管理系统进程,以及解析init.rc...

    Android_开机启动流程

    - [Android启动过程详解](http://blog.csdn.net/basonjiang_sz/category/648399.aspx) Android从Linux系统启动的过程大致分为以下几个步骤: 1. `init`进程启动 2. Native服务启动 3. `SystemServer`启动 4. 应用...

Global site tag (gtag.js) - Google Analytics