【Java精品源码栏目提醒】:网学会员鉴于大家对Java精品源码十分关注,论文会员在此为大家搜集整理了“android开机启动流程说明 - 其它资料”一文,供大家参考学习
android 开机启动流程说明第一步:启动 linux1.Bootloader2.Kernel第二步 android 系统启动:入口为 init.rcsystemcorerootdir1./system/bin/service manager: Binder 守护进程;2.Runtime3.Zygote :app-process/app-main4.Start VM5.Start server6.Start android service:Register to service Manager7.Start Launcher第三步:应用程序启动:运行 package Manager l Init 进程 Android 系统在启动时首先会启动 Linux 系统,引导加载 Linux Kernel 并启动init 进程。
Init 进程是一个由内核启动的用户级进程,是 Android 系统的第一个进程。
该进程的相关代码在 platformsystemcoreinitinit.c。
在 main 函数中,有如下代码: open_devnull_stdio log_init INFOquotreading config filenquot init_parse_config_filequot/init.rcquot / pull the kernel commandline and ramdisk properties file in / import_kernel_cmdline0 get_hardware_namehardware amprevision snprintftmp sizeoftmp quot/init.s.rcquot hardware init_parse_config_filetmp 这里会加载解析 init.rc 和 init.hardware.rc 两个初始化脚本。
.rc 文件定义了在 init 进程中需要启动哪些进程服务和执行哪些动作。
其详细说明参见platformsystemcoreinitreademe.txt。
init.rc 见如下定义: service servicemanager /system/bin/servicemanager user system critical onrestart restart zygote onrestart restart media service vold /system/bin/vold socket vold stream 0660 root mount ioprio be 2 service netd /system/bin/netd socket netd stream 0660 root system socket dnsproxyd stream 0660 root inet service debuggerd /system/bin/debuggerd service ril-daemon /system/bin/rild socket rild stream 660 root radio socket rild-debug stream 660 radio system user root group radio cache inet misc audio sdcard_rw service zygote /system/bin/app_process -Xzygote /system/bin --zygote--start-system-server socket zygote stream 666 onrestart write /sys/android_power/request_state wake onrestart write /sys/power/state on onrestart restart media onrestart restart netd service drm /system/bin/drmserver user drm group system root inet 具体解析过程见 platformsystemcoreinitInit_parser.c。
解析所得服务添加到 service_list 中,动作添加到 action_list 中。
接下来在 main 函数中执行动作和启动进程服务: execute_one_command restart_processes 通常 init 过程需要创建一些系统文件夹并启动 USB 守护进程、Android DebugBridge 守护进程、Debug 守护进程、ServiceManager 进程、Zygote 进程等。
l ServiceManager 进程 ServiceManager 进程是所有服务的管理器。
由 init.rc 对 ServiceManager 的描述 service servicemanager /system/bin/servicemanager 可知 servicemanager进程从 platformframeworksbasecmdservicemanagerService_manager.cpp 启动。
在 main 函数中有如下代码: int mainint argc char argv struct binder_state bs void svcmgr BINDER_SERVICE_MANAGER bs binder_open1281024 if binder_become_context_managerbs LOGEquotcannot become context manager snquot strerrorerrno return -1 svcmgr_handle svcmgr binder_loopbs svcmgr_handler return 0 首先调用 binder_open打开 Binder 设备/dev/binder,调用binder_become_context_manager把当前进程设置为 ServiceManager。
ServiceManager 本身就是一个服务。
int binder_become_context_managerstruct binder_state bs return ioctlbs-gtfd BINDER_SET_CONTEXT_MGR 0 最后 binder_loop进入循环状态,并设置 svcmgr_handler 回调函数等待添加、查询、获取服务等请求。
l Zy