文章目录
关注 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

最低0.47元/天 解锁文章
441

被折叠的 条评论
为什么被折叠?



