Android之IPC通信中的UID和PID识别
PCThreadState对象维护了2个变量
pid_t mCallingPid;
uid_t mCallingUid;
从变量名称来看,这2个变量保存了进程的PID和UID,并且由于这两个变量由IPCThreadState对象维护,可见它们是与IPC相关的。具体它们保存的是IPC发送方的PID和UID还是当前进程的IPD和UID,视情况而定。
在IPC调用过程中,被调用方需要知道调用方的UID和PID,以便被调用方用于权限检测;所以需要一种方式来提供调用方的UID和PID,因此上述2个变量的主要作用就是用于权限检测。
那么我们想象一下,下面描述的情况下,mCallingPid和mCallingUid又应该保存谁的UID和PID?假如有2个进程process A和process B,我们站在process B的角度来分析,process A IPC调用process B, 而process B 又调用同样处于process B的Service的接口(尽管此时实际上不是远程调用,并且开发者是知道的,但是对于Binder调用机制来说,它本身并不知道当前的调用是否为远程调用,前几篇文章中有分析系统如何确定是否为远程调用,这个过程是在binder driver中实现的),那么此时mCallingPid和mCallingUid是不是应该保存process B的UID和PID?
1. process B在被process A IPC调用时, process B需知道process A的UID和PID,来检查process A的访问权限,此时mCallingUid和mCallingPid保存的是process A的UID和PID。
2. 在IPC远程调用process B的过程中,process B的方法调用了同进程中的service的接口,process B既是调用方也是被调用方,虽然这个过程比较无聊,但是鉴于IPC过程的不透明性,因此process B仍然需要进行权限检测。
前面的文章中分析过,binder driver会判断当前的Binder调用是否为远程调用,如果是同进程调用的话,BD就不会再向应用提供进程的PID和UID。因此在process B中需要显示的设置当前的PID和UID。
为实现以上case, Android提供了一组函数
public static final native long clearCallingIdentity();
public static final native void restoreCallingIdentity(long token);
process B的方法调用了同进程中的service的接口前,clearCallingIdentity()方法会清除process A的UID和PID,重置为process B的UID和PID。
process B的方法调用了同进程中的service的接口后,此时仍然处在process A远程调用process B方法的过程中,此时需要restore process A的UID和PID。
本文描述的case,虽然在application 开发中并不常见,但是在system_server中很常见,比如client调用ActivityManagerService的方法,而ActivityManagerService又调用了PackageManagerService的方法,并且ActivityManagerService和PackageManagerService均会运行在system_server进程中。
Android之IPC通信中的UID和PID识别相关推荐
- android IPC通信(下)-AIDL
android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇 ...
- ANDROID 中UID与PID的作用与区别
ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...
- 传统的Linux中IPC通信原理
在了解 Binder 跨进程通信原理之前, 我们先了解一下 Linux 传统的进程间通信的概念和基本原理, 这样有助于我们更好的理解 Binder 的通信原理. 这个部分基本都是理论, 基础不是很好的 ...
- ipc原理linux,传统的Linux中IPC通信原理
在了解 Binder 跨进程通信原理之前, 我们先了解一下 Linux 传统的进程间通信的概念和基本原理, 这样有助于我们更好的理解 Binder 的通信原理. 这个部分基本都是理论, 基础不是很好的 ...
- Android - 跨进程通信(IPC) 另一种便捷实现 详解
文章目录 1. 写在前面 2. 跨进程通信的实现 3. 扩展思考 4. 参考资料 1. 写在前面 看到此图有何感想,这是另一种便捷的实现方式,我们先来看看其它的几种方式. Android 进程间通信 ...
- Android Binder IPC机制
之前有很多人问过我TaintDroid的内容,所以一点点吧涉及的思路整理一下. 今天又看了一遍,确实需要很多的技术支持以及扎实的功底,不管是Java的还是Android,从系统底层一直到顶层,涉及的知 ...
- 02.Android之IPC机制问题
目录介绍 2.0.0.1 什么是Binder?为什么要使用Binder?Binder中是如何进行线程管理的?总结binder讲的是什么? 2.0.0.2 Android中进程和线程的关系?什么是IPC ...
- 【朝花夕拾】Android跨进程通信总结篇
前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...
- 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇
前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10256379.html],谢谢! 只要是面试高级工程师岗位,Android跨进程通信就是最受面 ...
最新文章
- 微软无解!Win10用户突然减少:装回Win7
- 成功解决tensorflow.python.framework.errors_impl.NotFoundError: FindFirstFile failed for: ../checkpoints
- 阿里云 EventBridge 事件驱动架构实践
- 计算机二级vfp模拟考试题,计算机等级考试二级VFP模拟练习题[10]
- Linux 系统线程数量上限是多少?
- 在SAP CDS view上添加扩展字段后激活,背后的实现原理
- 前端学习(3120):item中的key
- 操作系统真实的虚拟内存是什么样的
- keepalived nginx 双机热备图文讲解
- 美团王兴有意向理想汽车投资3亿美元? 回应:不予置评
- Java 时间处理 DateTimeFormatter
- linux脚本怎么退出while,linux中的while命令
- 【Vue2.0】— 插件(十六)
- 关闭mongodb数据库 (netstat -lanp | grep “27017“)
- Python爬虫自学系列(一)
- 芯准TTE“宏时隙”调度机制 ——策略与参数
- solidity 循环语句
- 微信小程序版本自动更新
- Warning FailedScheduling 30s (x2 over 108s) default-scheduler 0/3 nodes are available
- 批处理打开指定路径下的所有文件
热门文章
- c# 通过内存映射实现文件共享内存
- 如何在 NET 程序万种死法中有效的生成 Dump (下)
- 微信适配国产操作系统:原生支持 Linux
- 对 Redis 中的有序集合SortedSet的理解
- lin-cms-dotnetcore功能模块的设计
- C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!
- AI Boot Camp 分享之 ML.NET 机器学习指南
- 致所有.Net者和有梦想的朋友们 - 共勉
- .Net Core AA.FrameWork应用框架介绍
- .NetCore中三种注入生命周期的思考