zoukankan      html  css  js  c++  java
  • Android的开机流程及对应源码位置分析

    1.系统引导bootloader
      1)源码:bootable/bootloader/*
      2)说明:加电后,CPU将先执行bootloader程序,此处有三种选择
        a)开机按Camera+Power启动到fastboot,即命令或SD卡烧写模式,不加载内核及文件系统,此处可以进行工厂模式的烧写
        b)开机按Home+Power启动到recovery模式,加载recovery.img,recovery.img包含内核,基本的文件系统,用于工程模式的烧写
        c)开机按Power,正常启动系统,加载boot.img,boot.img包含内核,基本文件系统,用于正常启动手机(以下只分析正常启动的情况)


    2.内核kernel
      1)源码:kernel/*
      2)说明:kernel由bootloader加载


    3.文件系统及应用init
      1)源码:system/core/init/*
      2)配置文件:system/rootdir/init.rc,
      3)说明:init是一个由内核启动的用户级进程,它按照init.rc中的设置执行:启动服务(这里的服务指Linux底层服务,如adbd提供adb支持,vold提供SD卡挂载等),执行命令和按其中的配置语句执行相应功能


    4.重要的后台程序zygote
      1)源码:frameworks/base/cmds/app_process/app_main.cpp等
      2)说明:zygote是一个在init.rc中被指定启动的服务,该服务对应的命令是/system/bin/app_process
      a)建立Java Runtime,建立虚拟机
      b)建立Socket接收ActivityManangerService的请求,用于Fork应用程序
      c)启动System Server


    5.系统服务system server
      1)源码:frameworks/base/services/Java/com/Android/server/SystemServer.java
      2)说明:被zygote启动,通过System Manager管理android的服务(这里的服务指frameworks/base/services下的服务,如卫星定位服务,剪切板服务等)

      Android 5.1中SystemServer.java的代码中的startOtherServices方法有相关变量开关决定是否启动服务

    boolean disableStorage = SystemProperties.getBoolean("config.disable_storage", false);
    boolean disableMedia = SystemProperties.getBoolean("config.disable_media", false);
    boolean disableBluetooth = SystemProperties.getBoolean("config.disable_bluetooth", false);
    boolean disableTelephony = SystemProperties.getBoolean("config.disable_telephony", false);
    boolean disableLocation = SystemProperties.getBoolean("config.disable_location", false);
    boolean disableSystemUI = SystemProperties.getBoolean("config.disable_systemui", false);
    boolean disableNonCoreServices = SystemProperties.getBoolean("config.disable_noncore", false);
    boolean disableNetwork = SystemProperties.getBoolean("config.disable_network", false);
    boolean disableNetworkTime = SystemProperties.getBoolean("config.disable_networktime", false);
    boolean isEmulator = SystemProperties.get("ro.kernel.qemu").equals("1");


    6.桌面launcher
      1)源码:ActivityManagerService.java为入口,packages/apps/launcher*实现
      2)说明:系统启动成功后SystemServer使用xxx.systemReady()通知各个服务,系统已经就绪,桌面程序Home就是在ActivityManagerService.systemReady()通知的过程中建立的,最终调用startHomeActivityLocked()启launcher


    7.解锁
      1)源码:frameworks/base/policy/src/com/android/internal/policy/impl/keyguard/KeyguardServiceDelegate.java
      2)说明:系统启动成功后SystemServer调用wm.systemReady()通知WindowManagerService,进而调用PhoneWindowManager的systemReady()

      在Android5.1中,keyguard本身不再是一个独立的apk,而是跟SystemUI进行了合并,作为SystemUI的静态库进行调用。所以,系统调试锁屏,只需要单独编译SystemUI模块,然后替换SystemUI.apk即可。

      参考:http://blog.csdn.net/wzy_1988/article/details/49659935


    8.开机自启动的第三方应用程序
      1)源码:

    frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java


      2)说明:系统启动成功后SystemServer调用ActivityManagerNative.getDefault().systemReady()通知ActivityManager启动成功,ActivityManager会通过置变量mBooting,通知它的另一线程,该线程会发送广播android.intent.action.BOOT_COMPLETED以告知已注册的第三方程序在开机时自动启动。

      Android5.1中的finishBooting方法设置“sys.boot_completed”系统属性为“1”,并且发送android.intent.action.BOOT_COMPLETED广播

    final void finishBooting() {
           ....
           ....
           ....
           ....
    
           
                    SystemProperties.set("sys.boot_completed", "1");
    
                    // And trigger dev.bootcomplete if we are not showing encryption progress
                    if (!"trigger_restart_min_framework".equals(SystemProperties.get("vold.decrypt"))
                        || "".equals(SystemProperties.get("vold.encrypt_progress"))) {
                        SystemProperties.set("dev.bootcomplete", "1");
                    }
                    for (int i=0; i<mStartedUsers.size(); i++) {
                        UserStartedState uss = mStartedUsers.valueAt(i);
                        if (uss.mState == UserStartedState.STATE_BOOTING) {
                            uss.mState = UserStartedState.STATE_RUNNING;
                            final int userId = mStartedUsers.keyAt(i);
                            Intent intent = new Intent(Intent.ACTION_BOOT_COMPLETED, null);
                            intent.putExtra(Intent.EXTRA_USER_HANDLE, userId);
                            intent.addFlags(Intent.FLAG_RECEIVER_NO_ABORT);
                            broadcastIntentLocked(null, null, intent, null,
                                    new IIntentReceiver.Stub() {
                                        @Override
                                        public void performReceive(Intent intent, int resultCode,
                                                String data, Bundle extras, boolean ordered,
                                                boolean sticky, int sendingUser) {
                                            synchronized (ActivityManagerService.this) {
                                                requestPssAllProcsLocked(SystemClock.uptimeMillis(),
                                                        true, false);
                                            }
                                        }
                                    },
                                    0, null, null,
                                    android.Manifest.permission.RECEIVE_BOOT_COMPLETED,
                                    AppOpsManager.OP_BOOT_COMPLETED, true, false,
                                    MY_PID, Process.SYSTEM_UID, userId);
                        }
           ....
           ....
           ....
           ....
                    
                    
                }
            }
        }


    9.总结
      综上所述,系统层次关于启动最核心的部分是zygote(即app_process)和system server,zygote它负责最基本的虚拟机的建立,以支持各个应用程序的启动,而system server用于管理android后台服务,启动步骤及顺序。


    10. 参考

    http://blog.csdn.net/basonjiang_sz/category/648399.aspx

     

     

      

  • 相关阅读:
    lr 增强窗格中,如何生成调试信息?
    lr 自带的例子,如何进行关联,通过代码的函数进行实现
    lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?
    loadrunner11 录制脚步不成功,在录制概要出现“No Events were detected”,浮动窗口总是显示“0 Events”,解决办法
    loadrunner11 安装及破解教程来自百度文库
    安装loadrunner11 ,出现如下错误如何解决?
    回收站数据删除了,如何进行恢复?
    网管工作方面——————打印机删除了然后开机重启他依然存在,如何解决
    Windows 不能在 本地计算机 启动 SQL Server 服务 错误代码126
    Sorry, the page you are looking for is currently unavailable. Please try again later. Nginx
  • 原文地址:https://www.cnblogs.com/l2rf/p/6605987.html
Copyright © 2011-2022 走看看