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

百度域名服务器网站怎么优化关键词排名

百度域名服务器,网站怎么优化关键词排名,网站制作公司 云南,程序员培训机构最新排名当按下Android系统的开机电源按键时候,硬件会触发引导芯片,执行预定义的代码,然后加载引导程序(BootLoader)到RAM,Bootloader是Android系统起来前第一个程序,主要用来拉起Android系统程序,Android系统被拉起…

       当按下Android系统的开机电源按键时候,硬件会触发引导芯片,执行预定义的代码,然后加载引导程序(BootLoader)到RAM,Bootloader是Android系统起来前第一个程序,主要用来拉起Android系统程序,Android系统被拉起首先肯定会启动Linux内核。

备注: 我们再刷机时候,经常看到工具软件会让我们切换bootloader/loader模式,其实就是重新激活bootloader程序,然后再拷贝新的镜像文件重新刷机,就是通过这个程序重新初始化硬件设备,建立内存空间映射。

        我们也知道一个系统肯定会存在一些重要服务和进程来支持整个系统正常运作。  那么Android系统中肯定也存在这种重要进程,如下:  

序号进程名称概述
1init进程Linux系统中用户空间第一个进程
2zygote进程所有App进程的父进程,Zygote Init 
3system_server进程各大系统服务的载体,forkSystemServer / SystemServer
4servicemanager进程binder服务的大管家,守护进程循环运行在binder_loop 

内核启动首先会第一个创建init进程,进程号是1,是所有用户空间的鼻祖,init进程又会启动servicemanager(binder服务管家) 和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_cast<char**>(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文件的action,service,启动其他进程。 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) -> Result<Success> {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// wasn't 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::optional<std::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::ceil<std::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. 预加载通用类,drawable,color资源,共享库等,用于提高app启动效率。 

6. forksytem_server进程,上层java framework的运行载体。 

参考文章:Android系统启动-zygote篇 - Gityuan博客 | 袁辉辉的技术博客袁辉辉, Gityuan, Android博客, Android源码, Flutter博客,Flutter源码http://gityuan.com/2016/02/13/android-zygote/

http://www.qdjiajiao.com/news/918.html

相关文章:

  • 个体工商户可以做网站吗百度app下载链接
  • 公司代办注册要多少钱windows优化大师使用方法
  • 建设部网站资质升级公示腾讯会议多少钱一个月
  • 天津外贸网站建设2024年瘟疫大爆发
  • 做网站上怎么推广呢网络营销推广的总结
  • 网站如何做排名优化厦门百度竞价
  • 长寿做网站百度怎样免费发布信息
  • 敦煌做网站 条件网络优化包括
  • 新手搭建做网站网站为什么要做seo
  • 贵州网站建设设计东莞关键词排名优化
  • b2b商贸网站系统seo零基础视频教程
  • 广州淘宝网站建设网站自动推广软件
  • 创意平面设计公司简介搜索引擎优化排名工具
  • 不会代码怎么做网站搜索引擎app
  • 免费的舆情网站入口有哪些网络搜索关键词
  • 青岛的网站建设公司哪家好企业管理咨询培训
  • 做网站技术服务费属于什么科目企业培训考试系统app
  • 广西东晋建设有限公司网站站长工具传媒
  • 广西宏泰成建设集团网站怎样建立一个网络销售平台
  • 网站开发公司北京有哪些可以推广的平台
  • 做地税电子签章的网站搜索引擎技巧
  • 做的好的排版网站推广app的单子都在哪里接的
  • 旅游网站项目评估电商运营培训哪个机构好
  • 公司网站用哪个软件做北京朝阳区
  • 凡科门店通收费多少seo推广外包
  • 武汉市住房和城乡建设局网站seo引擎优化平台培训
  • 公司网站建设如何做账小程序开发工具
  • 南京金九建设集团网站互联网营销顾问
  • 建设网站公司那家好登封网站设计
  • 石家庄seo网站优化公司湖北百度seo