Android13-系统服务大管家-ServiceManager进程-启动篇


关注 ServiceMager 原因

  • 理解实现的原理

  • Framework层核心内容Service,绝绝大部分离不开ServiceManager的,framework层的各种Service
    都和ServiceManager打交道的。应用层调用系统Service也是和ServiceManager 关联的,

  • 方便后面理解各种Service源码

  • Binder 机制了解 怎么可能不去熟悉ServiceManager

ServerManager需要掌握的知识

  • ServiceManager的启动
  • ServiceManager的注册
  • ServiceManager的获取

资料参考

ServiceManager(Native)启动分析
系统服务大管家-ServiceManager
启动ServiceManager

ServiceManager 进程启动

我们需要从两方面分析,Native层和framework层,本章我们作为 ServiceManager 源码的开篇,仅关注启动相关源码分析
为什么把ServiceManager 启动单独拿出来:方便分析,一步一个脚印理解。

启动脚本

涉及到的相关源码文件

为了方便理解,暂不用实际平台项目作为参考,直接用谷歌一套来check 源码的开篇,仅关注启动相关源码分析
部分路径和平台源码路径不一致很正常,在实际开发中以实际各个OEM厂商源码 位置为准。

在线源码XrefAndroid:
init.rc
servicemanager

/bootable/recovery/etc/init.rc 
/frameworks/native/cmds/servicemanager/servicemanager.rc

源码跟踪

ServiceManager脚本启动位置

ServiceManager是在rc脚本中启动的:

/bootable/recovery/etc/init.rc 中

    # Start essential services
      start servicemanager
ServiceManager关联脚本

servicemanager服务定义在frameworks\native\cmds\servicemanager\servicemanager.rc。
可以看到,servicemanger是一个Linux程序,它在设备中的存储路径是/system/bin/servicemanager,源码路径则是/frameworks/native/cmds/servicemanager。

在这里插入图片描述

 service servicemanager /system/bin/servicemanager
     class core animation   #表示这是一个核心服务,系统启动时优先运行
     user system            # 以 system 用户身份运 
     group system readproc
     critical               # 标记为关键服务,如果退出会触发系统重启
     onrestart restart apexd                             # 如果servicemanager重启 则 apexd也会重启
     onrestart restart audioserver                       # 如果servicemanager重启 则  audioserver
     onrestart restart gatekeeperd                       # 如果servicemanager重启 则  audioserver
     onrestart class_restart --only-enabled main          
     onrestart class_restart --only-enabled hal
     onrestart class_restart --only-enabled early_hal
     task_profiles ServiceCapacityLow
     shutdown critical 

简单介绍下这个文件脚本:
满足条件后执行程序 /system/bin/servicemanager,去Android 下面查看,果然有。
在这里插入图片描述

Native层源码分析

上面已经分析了servicemanager.rc 脚本了,我们看看该模块下的编译文件Android.bp
在这里插入图片描述

cc_binary {
   
   
name: "servicemanager",
defaults: ["servicemanager_defaults"],
init_rc: ["servicemanager.rc"],
srcs: ["main.cpp"],
}

这里就定位到了资源文件 main.cpp

main.cpp

     int main(int argc, char** argv) {
   
   
  #ifdef __ANDROID_RECOVERY__
      android::base::InitLogging(argv, android::base::KernelLogger);
  #endif

      if (argc > 2) {
   
   
          LOG(FATAL) << "usage: " << argv[0] << " [binder driver]";
      }

      const char* driver = argc == 2 ? argv[1] : "/dev/binder";  //检查输入参数,如果参数为空,则driver为"/dev/binder"

      sp<ProcessState> ps = ProcessState::initWithDriver(driver);   //创建ProcessState对象(进程唯一),并进行open、ioctl、mmap操作态
      ps->setThreadPoolMaxThreadCount(0);                 // 设置Binder线程池的最大线程数为0(表示使用默认设置)
      ps->setCallRestriction(ProcessState::CallRestriction::FATAL_IF_NOT_ONEWAY);

      sp<ServiceManager> manager = sp<ServiceManager>::make(std::make_unique<Access>()); //创建自己这个对象,构造自己时构造Access对象,这个是用于权限检测

      //先注册自己作为服务   
      if (!manager->addService("manager", manager, false /*allowIsolated*/, IServiceManager::DUMP_FLAG_PRIORITY_DEFAULT).isOk()) {
   
   
          LOG(ERROR) << "Could not self register servicemanager";
      }

      //保存ServiceManager作为BBinder对象到IPCThreadState实例中
      IPCThreadState::self()->setTheContextObject(manager);

      //向驱动注册自己成为全局唯一的ContextManager,全局只有一个ServiceManager
      ps->becomeContextManager();

      sp<Looper> looper = Looper::prepare(false /*allowNonCallbacks*/);  //获取一个Looper

      BinderCallback::setupTo(looper);              //将binder fd添加到Looper中监听,当驱动有事件时,回调handleEvent()处理
      ClientCallbackCallback::setupTo(looper, manager);      //这个是用于告知客户端当前服务端有多少个客户端绑定的回调监听

       //循环等待事件到来
      while
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

野火少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值