Android启动

个人学习笔记,勿喷!
如有错误请大佬留言纠错,感谢!

因为学习的是上层的开机流程,所以bootloader的就跳过了。

init.cpp(源码1)中调用了loadbootscripts()方法,在该方法中会调用init.rc文件。
init.rc(源码2)就会创建很多目录和文件,并且赋予权限。其中重要的是init.rc里面会启动zygote。
zygote(源码3)会fork出一个新的进程,来开启系统服务,启动systemserver、audioserver、cameraserver、media、netd、wifi等一系列重要服务。
systemserver(源码4)中,会启动各种各样的服务。
其中,startbootstrapservices()方法中,就会开启activitymangerservier/displaymanagerservice/powermanagerservice/等其他重要服务。

源码1
/system/core/init/init.cpp

static void loadbootscripts(actionmanager& action_manager, servicelist& service_list) {
  parser parser = createparser(action_manager, service_list);
  std::string bootscript = getproperty("ro.boot.init_rc", "");
  if (bootscript.empty()) {
      parser.parseconfig("/system/etc/init/hw/init.rc");
      if (!parser.parseconfig("/system/etc/init")) {
          late_import_paths.emplace_back("/system/etc/init");
      }
      // late_import is available only in q and earlier release. as we don't
      // have system_ext in those versions, skip late_import for system_ext.
      parser.parseconfig("/system_ext/etc/init");
      if (!parser.parseconfig("/vendor/etc/init")) {
          late_import_paths.emplace_back("/vendor/etc/init");
      }
      if (!parser.parseconfig("/odm/etc/init")) {
          late_import_paths.emplace_back("/odm/etc/init");
      }
      if (!parser.parseconfig("/product/etc/init")) {
          late_import_paths.emplace_back("/product/etc/init");
      }
  } else {
      parser.parseconfig(bootscript);
  }
}

源码2
/system/core/rootdir/init.rc

# now we can start zygote for devices with file based encryption
 trigger zygote-start

源码3
/system/core/rootdir/init.zygote64.rc

service zygote /system/bin/app_process64 -xzygote /system/bin --zygote --start-system-server --socket-name=zygote
 class main
 priority -20
 user root
 group root readproc reserved_disk
 socket zygote stream 660 root system
 socket usap_pool_primary stream 660 root system
 onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
 onrestart write /sys/power/state on
 # note: if the wakelock name here is changed, then also
 # update it in systemsuspend.cpp
 onrestart write /sys/power/wake_lock zygote_kwl
 onrestart restart audioserver
 onrestart restart cameraserver
 onrestart restart media
 onrestart restart media.tuner
 onrestart restart netd
 onrestart restart wificond
 task_profiles processcapacityhigh maxperformance
 critical window=${zygote.critical_window.minute:-off} target=zygote-fatal

源码4
/frameworks/base/services/java/com/android/server/systemserver.java

private void run() {
try {
          t.tracebegin("startservices");
          startbootstrapservices(t);  //启动关键服务
          startcoreservices(t);       //启动必要服务
          startotherservices(t);      //启动其他服务
          startapexservices(t);
    }
}
posted on 2025-08-27 16:00  EasMan  阅读(11)  评论(0)    收藏  举报