当前位置: 首页 > news >正文

漳州建设银行网站成都分销网站建设

漳州建设银行网站,成都分销网站建设,js不能打开插件wordpress,贵阳网站微信建设公司当按下Android系统的开机电源按键时候#xff0c;硬件会触发引导芯片#xff0c;执行预定义的代码#xff0c;然后加载引导程序(BootLoader)到RAM#xff0c;Bootloader是Android系统起来前第一个程序#xff0c;主要用来拉起Android系统程序#xff0c;Android系统被拉起…       当按下Android系统的开机电源按键时候硬件会触发引导芯片执行预定义的代码然后加载引导程序(BootLoader)到RAMBootloader是Android系统起来前第一个程序主要用来拉起Android系统程序Android系统被拉起首先肯定会启动Linux内核。 备注 我们再刷机时候经常看到工具软件会让我们切换bootloader/loader模式其实就是重新激活bootloader程序然后再拷贝新的镜像文件重新刷机就是通过这个程序重新初始化硬件设备建立内存空间映射。 我们也知道一个系统肯定会存在一些重要服务和进程来支持整个系统正常运作。  那么Android系统中肯定也存在这种重要进程如下   序号进程名称概述1init进程Linux系统中用户空间第一个进程2zygote进程所有App进程的父进程Zygote Init 3system_server进程各大系统服务的载体forkSystemServer / SystemServer4servicemanager进程binder服务的大管家守护进程循环运行在binder_loop  内核启动首先会第一个创建init进程进程号是1是所有用户空间的鼻祖init进程又会启动servicemanagerbinder服务管家 和zygote进程Java进程鼻祖zygote进程会创建system_server进程以及各种app进程大致启动关系如下  源码分析基于 android10  inity源码分析 /system/core/init/main.cpp   int main(int argc, char** argv) {#if __has_feature(address_sanitizer)__asan_set_error_report_callback(AsanReportCallback);#endifif (!strcmp(basename(argv[0]), ueventd)) {return ueventd_main(argc, argv);}if (argc 1) {if (!strcmp(argv[1], subcontext)) {android::base::InitLogging(argv, android::base::KernelLogger);const BuiltinFunctionMap function_map;return SubcontextMain(argc, argv, function_map);}if (!strcmp(argv[1], selinux_setup)) {return SetupSelinux(argv);}if (!strcmp(argv[1], second_stage)) {return SecondStageMain(argc, argv);}}return FirstStageMain(argc, argv);} main函数有四个参数入口  1.参数有ueventd进入 uevent_main   2. 参数中有subcontext,进入InitLogging和 SubcontextMain  3. 参数中有selinux_setup,进入SetupSelinux  4. 参数中有second_state,进入SecondStageMain  执行顺序如下 首先会进入FirstStateMain 主要执行是初始化环境变量挂载和创建基本的文件系统并设置访问权限挂载system、cache、data等系统分区 。 之后进入  SetupSelinxu 根据源码我们可以看到FirstStateMain最后传送了参数selinux_setup  int FirstStageMain(int argc, char** argv) {....... const char* path /system/bin/init;const char* args[] {path, selinux_setup, nullptr};execv(path, const_castchar**(args));// execv() only returns if an error happened, in which case we// panic and never fall through this conditional.PLOG(FATAL) execv(\ path \) failed;return 1;} SetupSelinux主要工作谁设置SELinux安全策略之后进入SecondStageMain 。   int SecondStageMain(int argc, char** argv) {..... // oom_scroe_adj 为-1000时候相当与关闭OOM机制。 范围 -1000 - 1000 if (auto result WriteFile(/proc/1/oom_score_adj, -1000); !result) {LOG(ERROR) Unable to write -1000 to /proc/1/oom_score_adj: result.error();}// 启用全局Seccomp GlobalSeccomp();// 设置所有进程都可以访问的会话密钥环keyctl_get_keyring_ID(KEY_SPEC_SESSION_KEYRING, 1);// 标记booting中 close(open(/dev/.booting, O_WRONLY | O_CREAT | O_CLOEXEC, 0000));//初始化属性服务指定文件读取属性property_init();....... // 为第二阶段设置 SELinux。SelinuxSetupKernelLogging();SelabelInitialize();SelinuxRestoreContext();// android封装好的Epoll开始初始化 Epoll epoll;if (auto result epoll.Open(); !result) {PLOG(FATAL) result.error();}// 注册singelfd信号为创建handler处理子进程终止信号 InstallSignalFdHandler(epoll);..... // 注册property_set_fd, 设置其他系统属性并开启系统属性服务 StartPropertyService(epoll);MountHandler mount_handler(epoll);....... ActionManager am ActionManager::GetInstance();ServiceList sm ServiceList::GetInstance();//解析init.rc 等文件建立rc文件的actionservice启动其他进程。 LoadBootScripts(am, sm);..... am.QueueBuiltinAction(SetupCgroupsAction, SetupCgroups);//rc文件中触发器为 on earyly-init 语句 am.QueueEventTrigger(early-init);// 等待冷插拔设备初始化完成 am.QueueBuiltinAction(wait_for_coldboot_done_action,wait_for_coldboot_done);// so that we can start queuing up actions that require stuff from /dev.am.QueueBuiltinAction(MixHwrngIntoLinuxRngAction, MixHwrngIntoLinuxRng);am.QueueBuiltinAction(SetMmapRndBitsAction, SetMmapRndBits);am.QueueBuiltinAction(SetKptrRestrictAction, SetKptrRestrict);// 设备组合键初始化操作 Keychords keychords;am.QueueBuiltinAction([epoll, keychords](const BuiltinArguments args) - ResultSuccess {for (const auto svc : ServiceList::GetInstance()) {keychords.Register(svc-keycodes());}keychords.Start(epoll, HandleKeychord);return Success();},KeychordInit);am.QueueBuiltinAction(console_init_action, console_init);// 开始触发rc文件中为 on init 的语句 am.QueueEventTrigger(init);// Starting the BoringSSL self test, for NIAP certification compliance.am.QueueBuiltinAction(StartBoringSslSelfTest, StartBoringSslSelfTest);// Repeat mix_hwrng_into_linux_rng in case /dev/hw_random or /dev/random// wasnt ready immediately after wait_for_coldboot_doneam.QueueBuiltinAction(MixHwrngIntoLinuxRngAction, MixHwrngIntoLinuxRng);// Initialize binder before bringing up other system servicesam.QueueBuiltinAction(InitBinder, InitBinder);//不要在充电器模式下挂载文件系统或启动核心系统服务。.std::string bootmode GetProperty(ro.bootmode, );if (bootmode charger) {am.QueueEventTrigger(charger);} else {am.QueueEventTrigger(late-init);} // 根据属性的当前状态运行所有属性触发器。.am.QueueBuiltinAction(queue_property_triggers_action, queue_property_triggers);while (true) {//进入死循环s.auto epoll_timeout std::optionalstd::chrono::milliseconds{};if (do_shutdown !shutting_down) {do_shutdown false;if (HandlePowerctlMessage(shutdown_command)) {shutting_down true;}}if (!(waiting_for_prop || Service::is_exec_service_running())) {am.ExecuteOneCommand();}if (!(waiting_for_prop || Service::is_exec_service_running())) {if (!shutting_down) {auto next_process_action_time HandleProcessActions();// 如果有一个进程需要重新启动请及时唤醒。if (next_process_action_time) {epoll_timeout std::chrono::ceilstd::chrono::milliseconds(*next_process_action_time - boot_clock::now());if (*epoll_timeout 0ms) epoll_timeout 0ms;}}// 如果还有更多工作要做请立即醒来。if (am.HasMoreCommands()) epoll_timeout 0ms;}// 这里一直等待循环事件 过来if (auto result epoll.Wait(epoll_timeout); !result) {LOG(ERROR) result.error();}}return 0;} 其中最关键就是解析init.rc 文件并且按照rc文件定义去启动服务然后开启死循环用于接受epoll事件   init.rc文件 init.rc文件在 /system/core/rootdir/init.rc  import /init.environ.rcimport /init.usb.rcimport /init.${ro.hardware}.rcimport /vendor/etc/init/hw/init.${ro.hardware}.rcimport /init.usb.configfs.rcimport /init.${ro.zygote}.rc zygote服务启动 Zygote是由init进程通过解析init.zygote.rc文件而创建 我们可以看到/system/core/rootdir/下有4个init.zygote.rc文件通过ro.zygote配置得值去读取对应配置文件这里以init.zygote64.rc  为例子  service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-serverclass mainpriority -20user rootgroup root readproc reserved_disksocket zygote stream 660 root systemsocket usap_pool_primary stream 660 root systemonrestart write /sys/android_power/request_state wakeonrestart write /sys/power/state ononrestart restart audioserveronrestart restart cameraserveronrestart restart mediaonrestart restart netdonrestart restart wificondwritepid /dev/cpuset/foreground/tasks 对应的可执行程序是app_process64 对应的源文件是/frameworks/base/cmds/app_process/app_main.cpp zygote启动过程如下  1.创建了AppRuntime并且调用了start方法。  2. AndroidRuntime调用了startVm创建了虚拟机调用startReg注册JNI函数。  3.通过JNI调用ZygoteInit.main 进入Java  。 4. 建立socket通道zygote作为通讯服务端用于响应客户端请求。  5. 预加载通用类drawablecolor资源共享库等用于提高app启动效率。  6. forksytem_server进程上层java framework的运行载体。  参考文章Android系统启动-zygote篇 - Gityuan博客 | 袁辉辉的技术博客袁辉辉, Gityuan, Android博客, Android源码, Flutter博客Flutter源码http://gityuan.com/2016/02/13/android-zygote/
http://www.w-s-a.com/news/585611/

相关文章:

  • 温州做网站哪儿新云网站模版
  • 网站开发 视频存在哪检察院前期网站建设
  • 备案中的网站信息怎么填如何做分享赚钱的网站
  • 网站行程表怎么做注册公司费用要多少
  • 常见电子商务网站基本模式南山网站公司定
  • 网站搭建代码网站里面送礼物要钱怎么做代码
  • 大学英文网站建设举措wordpress 学院 模板
  • 爱 做 网站吗php网站作业模版
  • wordpress代码乱吗台州做网站seo的
  • 做ptt网站wordpress中文企业网站
  • 深圳雨棚制作深圳 网站优化公司排名
  • 深圳优秀网站建设价格wordpress没人用
  • 国企网站建设需要注意沈阳招标信息网
  • 东莞360推广的网站是谁做的上海网络推广产品
  • 网站可以换主机吗中国十大网站建设企业
  • 怎么做盗版小说网站官网做有下拉列表的网站的图片
  • 邢台网站建设电话网站界面类型
  • 网站制作合同模板做一个网站能挣多少钱
  • 汶上1500元网站建设互联网高端官网
  • 广州做公司网站网站开发培训机构
  • 网站建设与维护 课件网页版qq安全中心登录入口
  • 做三个月网站广告收入dw如何制作网页
  • ...课程网站建设简介工信部 网站备案查询
  • 网站代码建设 实例企业网站建设大概的费用
  • 制作网站软件排行榜过年做啥网站致富
  • 哪里有做网站企业seo关键词优化
  • 上海金山网站建设公司手机淘宝客网站怎么做的
  • 网站开发需要公司做网站费用计入什么科目
  • 网站优化有哪些类型免费制作app的傻瓜软件
  • 如何做网站咨询wordpress get