fWX228941 / project

all by myself
1 stars 0 forks source link

Android 启动过程 #32

Open fWX228941 opened 5 years ago

fWX228941 commented 5 years ago

1.第一个系统进程init (PID-0) 1.1.设备启动:Boot Loader -> Linux kernel -> Android 系统服务。 1.2.开机启动流程,定制init.rc,Android 系统服务程序大多是在这个rc脚本中描述并被相继启动的。包括 ServiceManager / Zygote / SystemServer 1.3.源码目录:system/core/init

2.系统服务 2.1.ServiceManager 1)负责域名(Binder服务在SeriviceManager注册时提供的名称)到IP地址(底层Binder驱动分配的值)的解析。 2)linux程序 存储位置:system/bin/ 源码: frameworks/native/cmds

2.2.Zygote 1) 源码位置:framworks/base/cmds framworks/base/core 2) 孵化步骤 2.1.当有新程序需要运行时,系统会通过socket在第一时间通知“管家”,并由它负责实际的进程孵化过程。 2.2.预加载虚拟机运行时所需的各类资源 【fraworks.jar preloaded-classes】 2.3.启动各种System Server ,zygote运行在虚拟机,需要考虑费时的垃圾回收机制,每循环10次才会调用一次gc( )操作。 2.4.zygote 基于socket连接,zygote 需要为每一个新启动的应用程序生成自己独立的进程,尽心尽责,不愧为守护进程,并且引导系统各个重要服务的启动。 2.5.zygote 检测内存泄露的一个优化点:Zygote 不会执行exec() 无法使用valgrind 来检测程序内存泄露的情况,有一种wrapper实现,通过parsedArgs.invokeWith来加以控制。 2.6.Process 进程管家,Zegote 主动执行的类是ActivityThread ,这个就是应用进程的主线程。 2.7.nativeZygoteInit主导的本地系统服务和applicationInit负责java层系统服务的启动。 2.8.本地系统服务,JNI机制 ,Native函数会在Java层有一个声明,然后在本地层得到实现,通常情况下Native中的C++文件名是以java层的package包名为基础。 2.9.Android 系统服务会被分成两类,其一是Java层,其二是本地层System.loadLibrary(“system_server”) 加载到内存

2.2.3.SystemServer 1)提供Java层系统服务 2)SystemServiceManager : 统一管理所有的System Services,安装服务InstallService 优先初始化,完成data/user目录的创建,其次是AMS,PowerM,DM,PackageM 3)Server分类 1.1. BootStrap Services :引导程序 services 之间耦合依赖关系强,需统一管理,如果自己添加的系统服务和其他服务有较强的依赖关系,则需要统一放置。 1.2.Core Services :LED和背光管理器,电池电量管理器,应用程序使用情况管理器。 1.3.Other Services :AccountManagerService 账户管理/ VibratorService 震动/ MountService 挂载/ NetWorkManagement 网咯管理/NetWorkState 网站状态/ Connectivity 连接/ WindowManager 窗口管理/ Usb /Serial 序列化 / Audio音频

3.存储 3.1.内存Internal Storage :data存储目录。 3.2.外存External Storage :除此之外的其他可存储区域,由Vold/MountService来管理 图片9 图片10

3.3.SDcard daemon 属于Fuse Service 用户态实现的一种FileSystem in Userspace 处理层次多,不足在于执行效率,优点在于其灵活性。 3.4.完整的调用过程:当调用使用者,希望访问FUSE文件系统时,这个请求会经过Kernel 的VFS 首先传递给FUSE 对应的驱动模块,然后再通知到用户层的fuse管控程序,后者处理请求完成后会将结果数据返回给最初的调用者。 3.5.权限管理:6.0以前 Install Time Permission 应用程序需要的权限是在安装或者版本升级过程中赋予的,一刀切。6.0以后 Runtime permission 允许用户在程序运行到某些特别功能时再动态决定是否赋予程序相应的权限,对用户透明管理。 3.6.多用户管理:5.0以后多用户的特性默认关闭,需要修改config.xml 修改配置项