Settings.System.putInt异常报错10024

在IPC调用过程中,被调用方需要知道调用方的UID和PID,以便被调用方用于权限检测;所以需要一种方式来提供调用方的UID和PID,主要作用就是用于权限检测,虽然在application 开发中并不常见,但是在system_server中很常见,比如client调用ActivityManagerService的方法,而ActivityManagerService又调用了PackageManagerService的方法,并且ActivityManagerService和PackageManagerService均会运行在system_server进程中。
如下情况:
有2个进程process A和process B,我们站在process B的角度来分析,process A IPC调用process B, 而process B 又调用同样处于process B的Service的接口(尽管此时实际上不是远程调用,并且开发者是知道的,但是对于Binder调用机制来说,它本身并不知道当前的调用是否为远程调用),那么此时mCallingPid和mCallingUid是不是应该保存process B的UID和PID?

  1.   process B在被process A IPC调用时, process B需知道process A的UID和PID,来检查process A的访问权限,此时调用方的UID和Pid保存的是process A的UID和PID。
    
  2.   在IPC远程调用process B的过程中,process B的方法调用了同进程中的service的接口,process B既是调用方也是被调用方,虽然这个过程比较无聊,但是鉴于IPC过程的不透明性,因此process B仍然需要进行权限检测。
    

为实现以上case,android提供了一组函数
public static final native long clearCallingIdentity();
public static final native void restoreCallingIdentity(long token);

因此在被调接口中愮两步操作:1、process B的方法调用了同进程中的service的接口前,clearCallingIdentity()方法会清除process A的UID和PID,重置为process B的UID和PID。
2、process B的方法调用了同进程中的service的接口后,此时仍然处在process A远程调用process B方法的过程中,此时需要restore process A的UID和PID。
这个问题在接口中用到Settings.System.putInt系统数据库操作时候经常遇到,如上解决即可。

mStatisticsService.setTotalExp(module);
public void setTotalExp(int exp) {
        long ident = Binder.clearCallingIdentity();
        try {
            Settings.System.putInt(mContext.getContentResolver(), "save_Total_integral", exp);
            Log.i("updateTotalExp", "setTotalExp is " + exp);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值