clearCallingIdentity与restoreCallingIdentity-千里马framework系统源码实战详解

android IPC通信中的UID和PID识别 IPCThreadState对象维护了2个变量             pid_t               mCallingPid;             uid_t               mCallingUid;     从变量名称来看,这2个变量保存了进程的PID和UID,并且由于这两个变量由IPCThreadState对象维护,可见它们是与IPC相关的。具体它们保存的是IP 阅读详情

hi,粉丝朋友大家好:
今天带大家来学习一个系统开发过程中大家即“熟悉”又陌生的两个方法,分别是clearCallingIdentity和restoreCallingIdentity,一般他们是成对出现在我们的framework代码中,但大家平时分析源码时候好像并没有在意他的真正作用是什么?为啥在框架代码分析时候可以看到他的大量出现?
重点更多干货看这里:
https://blog.youkuaiyun.com/learnframework/article/details/127483545

大家来看一个经典案例:
假如我们在ActivityManagerService加入一个接口方法:

@Override
public void testClear() {
    Settings.Global.putString(
            resolver, Settings.Global.DEBUG_APP,
            packageName);
}

接口方法里面执行时候需要调用到Setting相关方法,app调用该接口app自身没有Setting权限,想抱SystemServer大腿,咋一看感觉没有问题,因为testClear方法已经运行在SystemServer进程,该进程肯定有Settings相关权限,但事实真的如此么?
事实上执行会报如下错误:
Package android does not belong to xxxxx

这个是为啥?
其实这类问题出现就和权限判断方式有关系,一般权限判断都是会通过类似
Binder.getCallingUid来获取我们的调用段的uid也就是获取了调用包名,然后通过包名查询到底是否有权限操作。。。方式,所以这里出现错误也就不奇怪,那么这问题怎么解决呢?那就我们今天主题clearCallingIdentity和restoreCallingIdentity

先看clearCallingIdentity


    /**
     * Reset the identity of the incoming IPC on the current thread.  This can
     * be useful if, while handling an incoming call, you will be calling
     * on interfaces of other objects that may be local to your process and
     * need to do permission checks on the calls coming into them (so they
     * will check the permission of your own local process, and not whatever
     * process originally called you).
     *
     * @return Returns an opaque token that can be used to restore the
     * original calling identity by passing it to
     * {@link #restoreCallingIdentity(long)}.
     *
     * @see #getCallingPid()
     * @see #getCallingUid()
     * @see #restoreCallingIdentity(long)
     */
    @CriticalNative
    public static final native long clearCallingIdentity();

再看restoreCallingIdentity

  /**
     * Restore the identity of the incoming IPC on the current thread
     * back to a previously identity that was returned by {@link
     * #clearCallingIdentity}.
     *
     * @param token The opaque token that was previously returned by
     * {@link #clearCallingIdentity}.
     *
     * @see #clearCallingIdentity
     */
    @CriticalNative
    public static final native void restoreCallingIdentity(long token);

//clearCallingIdentity具体实现

static jlong android_os_Binder_clearCallingIdentity()
{
    return IPCThreadState::self()->clearCallingIdentity();
}
int64_t IPCThreadState::clearCallingIdentity()
{
    // ignore mCallingSid for legacy reasons
    int64_t token = ((int64_t)mCallingUid<<32) | mCallingPid;
    clearCaller();
    return token;//注意这里记忆了原来的mCallingUid mCallingPid
}
void IPCThreadState::clearCaller()
{
    mCallingPid = getpid();
    mCallingSid = nullptr;  // expensive to lookup
    mCallingUid = getuid();
}

其注释其实已经讲解比较清楚了,就是在IPC跨进程调用过程中,可能会调用到其他对象相关方法,这些相关方法可能会有权限的校验,一旦你调用了clearCallingIdentity相当于就是服务端进程自己调用了
其实本质上clearCallingIdentity方法就干了一件事:
当前调用线程后面调用getCallingUid的值变成自己进程的UID,那么后面调用其他方法如果需要权限,那么就判断是服务进程是否有权限,这里也就说明systemserver为啥用的比较多clearCallingIdentity,因为systemserver相对具体很多权限,本身很多功能就是他定义的,但各个app权限相对很少,就会经常产生抱大腿思路

restoreCallingIdentity其实本质就是对前面clearCallingIdentity后,需要对当前线程的UID进行恢复,因为不可能一直让调用使用自己uid,有的地方业务场景是需要真实uid的,所以这个clearCallingIdentity一般都是在需要权限校验方法才会使用,权限过了执行完毕是需要及时恢复的。
所以就clearCallingIdentity和restoreCallingIdentity经常成对出现原因。

解决方法:

@Override
public void testClear() {
  final long ident = Binder.clearCallingIdentity();
    Settings.Global.putString(
            resolver, Settings.Global.DEBUG_APP,
            packageName);
    Binder.restoreCallingIdentity(ident);
}

以上进行clear和restore后既可以正常执行
在这里插入图片描述

H265/HEVC视频分层码流分析语义元素解释 一、H265概述 H265/HEVC(Hight Efficiency Video Coding)是由ITU-T和ISO/IEC两大组织在H264/AVC的基础之上推出的新一代高效视频编码标准,主要为应对高清和超高清视频在网络传输和数据存储方面带来的挑战。上一篇文章对H264/AVC视频码流进行了详细的分析,本文继续从数据处理的角度对H265/HEVC视频码流进行详细分析。 二、H265分层结构 H265的分层结构与H264类似,分为视频编码层(VCL:Video Code Layer)和网络抽象层(NAL 阅读详情

相关推荐

《通信工程施工与管理》

制作馈线接头必须使用专用的工具,专用工具包括:馈线切割刀、馈线安全刀、小金属丝毛刷、固定尺寸或大号活动扳手、小号扁锉刀、细齿小手锯、接头扩孔器、3M防水胶或防水接头盒;如图所示,详情如表所示。

2302_78710464的博客 1653

千里马android binder深入分析-承上启下的native层(客户端部分)

csdn在线学习课程,课程咨询答疑和新课信息:QQ交流群:422901085进行课程讨论 android跨进程通信实战视频课程(加群获取优惠) 相信大家对上面这一副binder跨进程通信的图都应该比较熟悉,图中的主要有4个角色: 1、客户端(A进程) 2、SerivceManager 3、服务端(B进程) 4、binder驱动 平时一问到binder是怎么跨进程通信的?那么同学们肯定大部分回答:binder最后调到底层还是通过binder驱动来实现跨进程通信的。那么这里就要问一下:请问android中ap

liaosongmao1的专栏 596

SAP CO-PA数据传送避坑指南:销售开票与FI/MM记账的日常配置实操(含KEKF/KE4I/KEI2)

本文深入解析SAP CO-PA数据传送中的常见配置问题,特别是销售开票与FI/MM记账环节的实操避坑指南。通过KEKF/KE4I/KEI2等关键配置点的详细说明,帮助用户避免数据失真和重复记录,提升获利能力分析的准确性。文章结合实战案例,揭示官方文档未提及的'数据黑洞'形成机制,为SAP顾问提供实用的排雷手册。

weixin_26905487的博客 390

Android源码的Binder权限控制

链接:https://www.zhihu.com/question/41003297/answer/89328987 一、源码分析 (1)clearCallingIdentity方法,最终调用如下: int64_t IPCThreadState::clearCallingIdentity() { int64_t token = ((int64_t)mCallingUid<

Liu的博客 1万+

MuJoCo 动捕接口 Mocap 直接操控机械臂(附代码)

动作捕捉(Motion Capture,简称 Mocap)是一种记录并处理人或物体动作的技术,在影视、游戏、机器人等领域应用广泛。通过上下左右以及alt_l,alt_r可以控制hand这个hody跟着mocap进行同步,这里将quat固定为Z朝下。首先在 scene.xml 中修改添加 mocap 和 equality。下面介绍如何配置 Mocap 以及使用按键进行末端控制。控制核心代码,通过按键控制mocap的pos和quat。

darcsdn 879

Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案

【代码】Android Studio运行报错: failed to load include path ……\platforms\android-35\android.jar的最细解决方案。

2401_86789230的博客 2万+

Android源码环境搭建(aosp Ubuntu 16.04 20.04)

Android源码环境搭建(aosp Ubuntu 16.04) 作者:千里马 课程要求: 电脑配置:双核,内存最少 16G,硬盘 200G 以上,独立安装 Ubuntu16.4 系统 学员要求:最少 1 年以上应用开发经验,推荐在 3 年左右 Android 应用开发经验, 熟悉 Java 语言,可以看懂 C/C++ 1、安装 ubuntu16.04(因为这个版本可以直接安装 openjdk-8,如果其他版本自行找方法) 2、openjdk 8 的安装 sudo apt-get install openj

learnframework的博客 2万+

Java开发者必看:Apache PDFBox实现PDF数字签名完整指南(附源码)

本文为Java开发者提供了使用Apache PDFBox实现PDF数字签名的完整指南。详细介绍了从环境配置、核心原理到完整代码实现的全过程,涵盖证书管理、签名位置计算、性能优化及实际应用案例,并附有可直接复用的源码,帮助开发者高效集成PDF数字签名功能。

o1p2q3r的博客 340

千里马平台介绍(1)

因为是开源的,对甲方而言,获取了话语权。这里有个关键,就是平台的技术是开放的,离开了平台一样用:平台不会创造一个自己的语言,也不会开发一个专用的开发工具,全部都是开发技术。坦诚讲,千里马平台也是基于开源资源的,所以也会开源。首先再次强调,平台是平台,应用是应用,这里讨论的是平台特性,无关任何业务。从商业角度,平台是共享共建的,应用是各家独有的。平台的价值在于:平台上有很多应用,且这些应用可互联互通,界面操作一致;平台+应用是未来企业内部信息化的发展方向,就平台而言,很多团队都在做,例如。

wangbing1125的博客 2927

C#实现低通和高通滤波算法

低通滤波器允许通过低于某个截止频率的信号成分,并且抑制高于该频率的成分。而高通滤波器则允许通过高于某个截止频率的信号成分,并抑制低于该频率的成分。巴特沃斯滤波器是一种对称的滤波器,具有平坦的幅度响应和最小的群延迟。低通和高通滤波是数字信号处理中常用的滤波技术,用于滤除或增强信号中的特定频率成分。在本篇文章中,我们将使用C#编程语言来实现低通和高通滤波算法。以上就是使用C#实现低通和高通滤波算法的示例代码。你可以根据自己的需求调整截止频率和采样率,将这些代码应用于你的项目中。是滤波器的截止频率,

XisVisual_Basic的博客 1275

SAP ABAP CDS View 里的日期函数

摘要:本文系统介绍了ABAP CDS日期函数在企业级应用中的关键作用,包括账龄计算、合同续期等业务场景。重点解析了DATS_IS_VALID、DATS_DAYS_BETWEEN等核心函数的语义和使用边界,特别强调on_error四种异常处理策略的选择逻辑。针对系统日期获取,对比了经典CDS的参数注入和View Entity会话变量两种方式。文章还提供了完整可运行的示例代码(包含CDS视图和ABAP程序),帮助开发者快速验证不同版本下的函数行为差异,确保在实际项目中正确应用这些日期处理函数。(149字)

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 379

clearCallingIdentity和restoreCallingIdentity

在IPC时,有些情况需要调用clearCallingIdentity和restoreCallingIdentity,原因在于: 假如有A进程和B进程,A调用B,B需要知道A的UID和PID,用于权限检测,于是B就保存了A的UID和PID,当此时B调用本身的方法时,binder驱动会检测B调用的是远成进程还是本地进程,如果是本地进程就不会传UID和PID,但此时B保存的仍然是A的UID和PID,所...

xiangkezhu的博客 1004

Unity引擎开发:复杂动作系统_动作捕捉数据的应用与整合

通过以上步骤,我们可以在Unity中有效地应用和整合动作捕捉数据,以实现更加真实和流畅的动画效果。从导入文件格式的选择,到预处理和优化,再到实时应用和调试验证,每一步都至关重要。希望本文能帮助你在Unity项目中更好地利用动作捕捉数据,提升动画质量和性能。

chenlz2007的博客 958

千里马android framework开发解决Accessing hidden method限制,让应用访问隐藏方法(需要可以修改系统源码方案)

hi,粉丝朋友们大家好! 今天来给大家分享一下,就是经常大家会做安卓系统开发工作问到一个问题,那就是我如果framework代码中增加了一个方法啥的,但是我又不想公开给第三方应用知道,只想让我系统的应用知道,那该怎么办呢?其实这个时候经常就会用到一个hidden的标签,来代表这个方法是隐藏方法,隐藏方法就是给系统内部用的,意味着第三方app就无法使用。这个其实也很常见,自从android p开始android系统就开始对访问hidden的限制越来越严格,虽然我们网络上有各种奇葩招来逃避不允许调用hidden

learnframework的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HIDL实战开发-千里马android framework车载车技手机系统开发

上面default默认生成的bp是so,这里要把他变成可执行的服务,需要增加一个service.cpp作为main方法载体。需要在自己设备目录找到自己的manifest.xml然后加入自己的hidl。5、添加service.cpp,自启动rc,修改Android.bp。4、生成一个自动生成 hal 接口的 Android.bp。6、需要搞个test,来测试一下服务是否ok,这个时候需要。主要目的是把test目录的Android.bp可以加入编译。执行后生成如下Test.cpp,Test.h文件了。

learnframework的博客 2975

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

我们的世界

我们的世界

qq_24829537的博客 162

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Android Binder权限检查之clearCallingIdentity

转自:https://www.zhihu.com/question/41003297 参考: https://blog.csdn.net/thinkinwm/article/details/18311211 https://blog.csdn.net/windskier/article/details/6921672//博主博客也很优秀 作者:Gityuan 链接:https://www.zhihu.com/question/41003297/answer/89328987 来源:知乎 ...

chuyouyinghe的专栏 1029

Android 经典hal开发实战-千里马android framework车载车机手机系统开发

上面的load方法就是我们说的hardware动态性的关键,它是在运行时候才真正依赖具体硬件抽象so,编译期间只需要依赖公共的hardware相关公共类既可以,不需要so,所以这里就给硬件抽象提供商带来很大灵活性,哪怕硬件厂商不提供也一般会有一个default的so保证不会产生什么严重的崩溃和强依赖问题,大大减低了aosp的代码对于硬件抽象的各个厂商的耦合性。在结构体 hw_module_methods_t 中只有一个成员,它是一个函数指针,名字是open,它主要作用就是用来打开硬件抽象层中给的硬件设备。

learnframework的博客 2783

千里马android framework车机车载手机智能驾驶双屏互动实现方案

这个就是没有动画版本的双屏互动,功能其实也是实现的,但是体验是不是感觉起来差的太多,而且还带有黑屏。2、画面A的平移,两个屏幕都要进行显示,这个难度较大,得考虑好相关的画面怎么都可以显示在两个屏幕。这里其实不需要写代码,可以直接调用am display相关的命令即可以实现这个方法的调用。不过还好的是功能可以用,那么我们也根据wms课程基础后也来实现一下这个双屏互动的功能。1、多指全局动作监听,而不是在某个app的onTouch里面监听,这里其实之前的。

learnframework的博客 5967

千里马2023年终总结-android framework实战

2023年开始全职做课程后,有了更多时间投入到framework的课程研发,可以把在公司里面的很多丰富经验都放到课程中来分享给大家。大专题课程都是经过非常严格的调研,主要调研因素有以下几个:1、这个专题课程马哥自己是不是有这方面比较深入的经验分享,比如马哥经常在公司里面处理wms闪黑等疑难问题,这类经验属于不太可能从网络学得到的,也基本上很少程序员知道也不可能外传的有用“绝招”,这种在我课程里会毫无保留地分享给大家。

learnframework的博客 2584

千里马平台介绍(2)

结构早期还有模板类T data,用于传入业务数据,很多系统也是这样的设计。选型曾经花了很多时间,做了很多比较,我认为这是目前最优组合。不选用这套架构的同学们可以转学了,大家不是一条道上的。任何一个平台甚至任何一个前后端分离的系统都需要定义这样一个结构。以上摘自qlm-parent的pom文件。nacos为1.4.2(友情提醒,早期版本的nacos有漏洞CVE-2021-29441)以上结构完全可以做到全行业统一的,这就是千里马联盟的使命之一。​版本选择也是个头痛问题,有关版本的问题可见版本说明。

wangbing1125的博客 3111

千里马2024年终总结-android framework实战

心里焦虑加大了,需要调节好平常心面对创业以来最大感受就是“创业艰难”,原本预想的很美好,终于可以有勇气为了理想和兴趣奋斗了,一定是每天满怀激情的干。实际情况是:当自己的兴趣与谋生的收入挂钩时候,一切变得不那么理想和美好。每天还是会有担心自己课程的销售情况,必然就会有焦虑,这种心态和上班兼职搞完全不是一回事。所以心态上确实是相比以前有焦虑一些,这个部分做的不够好。时间不够用创业初期,也没有很多资金搞团队,大部分工作都落到我的头上,比如一些售前咨询,课程研发录制,答疑服务等。

liaosongmao1的专栏 308

千里马Android Framework实战开发-Binder通信之startActivity跨进程源码分析

上节课我们已经讲解完了Binder常见使用的一些方法,下面这节课我们来讲解一些Binder跨进程通信在平时Framework及SystemServer源码分析场景。 (注意这个分析是基于我们的android 10,因为课程上讲过android 8.1,也相对比较清楚了,这里blog就单独写一下android 10,因为和8.1有一些差异,这样可以多学习到android 10的情况) 首先我们来看一副图: 1、 startActivity源码分析 上面是不是我们常见的一种App与系统SystemServer

learnframework的博客 1022
上一篇: Android 12中系统Wallpaper详解1--锁屏透看壁纸和桌面透看壁纸的切换
下一篇: aosp 12/13/lineageos19.1 framework学习编译刷入小米手机,努比亚
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值