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识别相关推荐

  1. android IPC通信(下)-AIDL

    android IPC通信(上)-sharedUserId&&Messenger android IPC通信(中)-ContentProvider&&Socket 这篇 ...

  2. ANDROID 中UID与PID的作用与区别

    ANDROID 中UID与PID的作用与区别 PID:为Process Identifier, PID就是各进程的身份标识,程序一运行系统就会自动分配给进程一个独一无二的PID.进程中止后PID被系统 ...

  3. 传统的Linux中IPC通信原理

    在了解 Binder 跨进程通信原理之前, 我们先了解一下 Linux 传统的进程间通信的概念和基本原理, 这样有助于我们更好的理解 Binder 的通信原理. 这个部分基本都是理论, 基础不是很好的 ...

  4. ipc原理linux,传统的Linux中IPC通信原理

    在了解 Binder 跨进程通信原理之前, 我们先了解一下 Linux 传统的进程间通信的概念和基本原理, 这样有助于我们更好的理解 Binder 的通信原理. 这个部分基本都是理论, 基础不是很好的 ...

  5. Android - 跨进程通信(IPC) 另一种便捷实现 详解

    文章目录 1. 写在前面 2. 跨进程通信的实现 3. 扩展思考 4. 参考资料 1. 写在前面 看到此图有何感想,这是另一种便捷的实现方式,我们先来看看其它的几种方式. Android 进程间通信 ...

  6. Android Binder IPC机制

    之前有很多人问过我TaintDroid的内容,所以一点点吧涉及的思路整理一下. 今天又看了一遍,确实需要很多的技术支持以及扎实的功底,不管是Java的还是Android,从系统底层一直到顶层,涉及的知 ...

  7. 02.Android之IPC机制问题

    目录介绍 2.0.0.1 什么是Binder?为什么要使用Binder?Binder中是如何进行线程管理的?总结binder讲的是什么? 2.0.0.2 Android中进程和线程的关系?什么是IPC ...

  8. 【朝花夕拾】Android跨进程通信总结篇

    前言 原文:https://www.cnblogs.com/andy-songwei/p/10256379.html 只要是面试高级工程师岗位,Android跨进程通信就是最受面试官青睐的知识点之一. ...

  9. 【朝花夕拾】Android性能篇之(七)Android跨进程通信篇

    前言 转载请声明,转自[https://www.cnblogs.com/andy-songwei/p/10256379.html],谢谢! 只要是面试高级工程师岗位,Android跨进程通信就是最受面 ...

最新文章

  1. 微软无解!Win10用户突然减少:装回Win7
  2. 成功解决tensorflow.python.framework.errors_impl.NotFoundError: FindFirstFile failed for: ../checkpoints
  3. 阿里云 EventBridge 事件驱动架构实践
  4. 计算机二级vfp模拟考试题,计算机等级考试二级VFP模拟练习题[10]
  5. Linux 系统线程数量上限是多少?
  6. 在SAP CDS view上添加扩展字段后激活,背后的实现原理
  7. 前端学习(3120):item中的key
  8. 操作系统真实的虚拟内存是什么样的
  9. keepalived nginx 双机热备图文讲解
  10. 美团王兴有意向理想汽车投资3亿美元? 回应:不予置评
  11. Java 时间处理 DateTimeFormatter
  12. linux脚本怎么退出while,linux中的while命令
  13. 【Vue2.0】— 插件(十六)
  14. 关闭mongodb数据库 (netstat -lanp | grep “27017“)
  15. Python爬虫自学系列(一)
  16. 芯准TTE“宏时隙”调度机制 ——策略与参数
  17. solidity 循环语句
  18. 微信小程序版本自动更新
  19. Warning FailedScheduling 30s (x2 over 108s) default-scheduler 0/3 nodes are available
  20. 批处理打开指定路径下的所有文件

热门文章

  1. c# 通过内存映射实现文件共享内存
  2. 如何在 NET 程序万种死法中有效的生成 Dump (下)
  3. 微信适配国产操作系统:原生支持 Linux
  4. 对 Redis 中的有序集合SortedSet的理解
  5. lin-cms-dotnetcore功能模块的设计
  6. C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!
  7. AI Boot Camp 分享之 ML.NET 机器学习指南
  8. 致所有.Net者和有梦想的朋友们 - 共勉
  9. .Net Core AA.FrameWork应用框架介绍
  10. .NetCore中三种注入生命周期的思考