【Binder 机制】Native 层 Binder 机制分析 ( 查找 Binder 服务 | svcmgr_handler | do_find_service )

简介: 【Binder 机制】Native 层 Binder 机制分析 ( 查找 Binder 服务 | svcmgr_handler | do_find_service )

文章目录

前言

一、查找 Binder 服务

二、service_manager.c | do_find_service

前言

在上一篇博客 【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse ) 中 , 简单介绍了 在 service_manager.c 中的 main 函数中调用了 binder_loop 方法 , 在 binder_loop 方法中 , 传入了 svcmgr_handler 方法作为回调函数 , svcmgr_handler 中可以接收不同的消息 , 处理不同的业务 ;






一、查找 Binder 服务


参考 【Binder 机制】Native 层 Binder 机制分析 ( binder_loop | svcmgr_handler | binder.c | binder_parse ) 二、binder_loop 方法参数 svcmgr_handler 章节 ;


在 svcmgr_handler 方法中 , 查找 Binder 服务 , 需要执行如下逻辑 : 接收到 SVC_MGR_CHECK_SERVICE 消息 , 查找 Binder 服务 , 主要调用 do_find_service 方法 ;


int svcmgr_handler(struct binder_state *bs,
                   struct binder_transaction_data *txn,
                   struct binder_io *msg,
                   struct binder_io *reply)
{
  // 链表 
    struct svcinfo *si;
  // 根据不同的 txn->code 执行不同的方法 
    switch(txn->code) {
    case SVC_MGR_CHECK_SERVICE:
        s = bio_get_string16(msg, &len);
        if (s == NULL) {
            return -1;
        }
        handle = do_find_service(s, len, txn->sender_euid, txn->sender_pid);
        if (!handle)
            break;
        bio_put_ref(reply, handle);
        return 0;
    }
    return 0;
}


完整代码参考 /frameworks/native/cmds/servicemanager/service_manager.c






二、service_manager.c | do_find_service


do_find_service 方法 , 主要用于查找之前是否有注册过 Service 服务 ;


uint32_t do_find_service(const uint16_t *s, size_t len, uid_t uid, pid_t spid)
{
  // 查找服务 
    struct svcinfo *si = find_svc(s, len);
    if (!si || !si->handle) {
        return 0;
    }
    if (!si->allow_isolated) {
        // If this service doesn't allow access from isolated processes,
        // then check the uid to see if it is isolated.
        uid_t appid = uid % AID_USER;
        if (appid >= AID_ISOLATED_START && appid <= AID_ISOLATED_END) {
            return 0;
        }
    }
  // 如果没有找到服务 , 返回 0 
    if (!svc_can_find(s, len, spid, uid)) {
        return 0;
    }
  // 如果找到服务 , 直接返回 
    return si->handle;
}


完整代码参考 /frameworks/native/cmds/servicemanager/service_manager.c


目录
相关文章
|
7月前
|
Android开发 移动开发 小程序
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
binder机制原理面试,安卓app开发教程
|
7月前
|
数据采集 Python SQL
2024年校花转学到我们班,于是我用Python把她空间给爬了个遍!(1),binder机制面试题
2024年校花转学到我们班,于是我用Python把她空间给爬了个遍!(1),binder机制面试题
2024年校花转学到我们班,于是我用Python把她空间给爬了个遍!(1),binder机制面试题
|
存储 Java Android开发
听说你Binder机制学的不错,来面试下这几个问题(二)
听说你Binder机制学的不错,来面试下这几个问题(二)
302 0
听说你Binder机制学的不错,来面试下这几个问题(二)
|
存储 Java 大数据
听说你Binder机制学的不错,来面试下这几个问题(一)
听说你Binder机制学的不错,来面试下这几个问题(一)
746 0
听说你Binder机制学的不错,来面试下这几个问题(一)
|
存储 缓存 Java
听说你Binder机制学的不错,来面试下这几个问题(三)
听说你Binder机制学的不错,来面试下这几个问题(三)
300 0
听说你Binder机制学的不错,来面试下这几个问题(三)
|
7月前
|
安全 Java 定位技术
Android 浅度解析:AIDL & Binder (1)
Android 浅度解析:AIDL & Binder (1)
253 0
|
5月前
|
缓存 安全 Java
Android深入Binder拦截问题分析
【7月更文挑战第1天】Android Binder 拦截可实现虚拟化、测试、SDK检测、逆向分析及ROM扩展。通过Java层aidl代理,利用IBinder接口规范来拦截通信。拦截步骤包括:替换Binder服务缓存对象,如ActivityManagerService;代理ServiceManager以控制服务获取。此操作需系统权限,可能涉及安全风险和版本差异,非必要时应谨慎。
|
Java API Android开发
Android中Binder在项目中的具体使用详解
Android中Binder在项目中的具体使用详解
208 0
|
Java Android开发 C++
Android中的Binder概述
Android应用的开发离不开四大组件(Activity,Service,BroadcastReceiver,ContentProvider),而这四大组件所涉及的通信底层都是依赖于Binder IPC机制的。例如当进程A中的Activity要向进程B中的Service通信,这便需要依赖于Binder IPC。不仅如此,整个Android系统架构中,大量采用了Binder机制作为IPC方案,当然也存在部分其它的IPC方式,比如Zygote通信便是采用Socket。 概念:Binder是Android中的一种IPC方式,提供远程过程调用(RFC)功能。
|
Java 开发工具 Android开发
Android中的Binder学习笔记
Android中的Binder学习笔记
Android中的Binder学习笔记