文档章节

android IPC通信

DB_Terrill
 DB_Terrill
发布于 05/21 11:30
字数 817
阅读 5
收藏 0

  IPCThreadState对象维护了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进程中
---------------------  
作者:windskier  
来源:CSDN  
原文:https://blog.csdn.net/windskier/article/details/6921672  
版权声明:本文为博主原创文章,转载请附上博文链接!

本文转载自:https://blog.csdn.net/windskier/article/details/6921672

DB_Terrill
粉丝 24
博文 147
码字总数 28269
作品 0
大连
其他
私信 提问
android面试3

一、概念及说明 Android为了屏蔽进程的概念,利用不同的组件[Activity、Service]来表示进程之间的通信! 组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Service, 不论这个...

迷途d书童
2012/03/30
157
0
Android进程间通信--消息机制及IPC机制实现

一、概念及说明 Android为了屏蔽进程的概念,利用不同的组件[Activity、Service]来表示进程之间的通信! 组件间通信的核心机制是Intent,通过Intent可以开启一个Activity或Service,不论这个...

暖风
2010/11/13
0
0
android基础知识05:四大组件之service 03:实现机制

本文主要介绍service相关内容。包括两篇文章: android基础知识05:四大组件之service 01 android基础知识05:四大组件之service 02:远程调用 android基础知识05:四大组件之service 03:实...

迷途d书童
2012/03/23
385
0
Android 平台上轻量级的组件间通信框架 - Andromeda

Andromeda是爱奇艺开源的一个Android平台上轻量级的组件间通信框架,主要特征如下: 不需要开发者进行bindService操作,即可实现不同进程的任意两个组件间的IPC通信; 即使不在同一进程,也可同...

bettar
2018/04/20
0
0
《Android开发艺术探索》IPC机制初认识

版权声明:本文出自阿钟的博客,转载请注明出处: https://blog.csdn.net/a_zhon/article/details/84875943 Android IPC 简介 IPC是Inter-Process Communication的缩写,含义为进程间通信或者...

Code-Porter
2018/12/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 二

Partitioning(分区) 对于非常大的数据集,或非常高的吞吐量,仅复制是不够的:我们需要将数据进行分区(partitions),也称分片(sharding) Partitioning of Key Range(根据键范围分区) 缺点是某...

丰田破产标志
6分钟前
0
0
springboot2+logback将日志输出到oracle数据库的踩坑之旅

背景 根据本人写博客的惯例,先交代下背景。在公司的系统中,我们的配置文件是切分有好几个的,不同的配置文件里面配置内容有着不同,对于日志的输出,也需要对不同的环境做出不同的输出,这...

succy
9分钟前
0
0
记一次临近上线程序发生OOM

记一次临近上线程序发生OOM 故事背景 最近一直在赶着应用上线,基本已经封包准备上线了,谁都不想在这时间点上出差错~ 当时应用已经上线pre,压力测试已经通过,然而昨天下午测试组的同事突然找到...

黑搜丶D
21分钟前
0
0
微服务概念与入门

总体 微服务拆分 康威定律详细介绍 Mike从他的角度归纳这篇论文中的其他一些核心观点,如下: 第一定律:Communication dictates design(组织沟通方式会通过系统设计表达出来) 第二定律:T...

之渊
29分钟前
0
0
BlockLang 0.3.0 发布啦

BlockLang 官网:https://blocklang.com Block Lang 0.3.0 引入一个新概念:组件市场。 拼装软件时使用的零部件统称为组件。所有组件在组件市场中统一管理,包括 Block Lang 的内置组件。 组...

blocklang
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部