restoreCallingIdentity
时间: 2024-06-07 19:09:57 浏览: 64
`restoreCallingIdentity` 是 Android 系统中的一个方法,用于恢复之前通过 `Binder.getCallingUid()` 和 `Binder.clearCallingIdentity()` 获取并清除的调用者身份标识。
在 Android 中,每个应用都有其自己的用户标识符(UID),用于限制应用的访问权限。当一个应用需要调用另一个应用的方法时,系统会检查调用者的 UID 是否有权限执行该操作。因此,在跨应用调用时,需要通过 `Binder.getCallingUid()` 获取调用者的 UID 并保存起来,然后通过 `Binder.clearCallingIdentity()` 清除调用者的身份标识,以免在后续的调用中出现权限问题。
当跨应用调用完成后,如果需要恢复之前的调用者身份标识,就可以使用 `restoreCallingIdentity` 方法将之前保存的 UID 恢复回来。
注意:`restoreCallingIdentity` 方法只能在具有特定权限的应用程序中使用,否则会抛出安全异常。
相关问题
public void closeSystemDialogs(String reason) { enforceNotIsolatedCaller("closeSystemDialogs"); final int pid = Binder.getCallingPid(); final int uid = Binder.getCallingUid(); final long origId = Binder.clearCallingIdentity(); try { synchronized (mGlobalLock) { Log.d(TAG, "hyj 6811 activitytaskmanagerservice ") // Only allow this from foreground processes, so that background // applications can't abuse it to prevent system UI from being shown. if (uid >= FIRST_APPLICATION_UID) { final WindowProcessController proc = mProcessMap.getProcess(pid); Log.d(TAG, "hyj 6817 activitytaskmanagerservice ") if (!proc.isPerceptible()) { Log.d(TAG, "hyj 6818 activitytaskmanagerservice ") Slog.w(TAG, "Ignoring closeSystemDialogs " + reason + " from background process " + proc); return; } } mWindowManager.closeSystemDialogs(reason); Log.d(TAG, "hyj 6825 activitytaskmanagerservice ") mRootWindowContainer.closeSystemDialogActivities(reason); } // Call into AM outside the synchronized block. Log.d(TAG, "hyj 6829 activitytaskmanagerservice") mAmInternal.broadcastCloseSystemDialogs(reason); } finally { Binder.restoreCallingIdentity(origId); } } 这段代码是什么作用
这段代码是 Android 系统中 ActivityTaskManagerService 类中的 closeSystemDialogs 方法的实现。它的作用是关闭系统对话框,如对话框、通知等。在执行过程中,它会检查调用者的权限,并且只允许前台进程调用该方法。如果调用者是后台进程,则会记录一条警告,并且不执行关闭操作。最后,它会调用 ActivityManagerService 中的 broadcastCloseSystemDialogs 方法,通知系统关闭对话框。
请逐行分析下Android T 的AudioService.java中setMode函数
好的,让我来逐行分析下Android T的AudioService.java中setMode函数。
```java
/**
* @see AudioManager#setMode(int)
*/
public void setMode(int mode, IBinder cb, String callingPackageName) {
enforceModifyAudioRoutingPermission();
synchronized (mConnectedDevices) {
final int newModeOwnerPid = Binder.getCallingPid();
final int newModeOwnerUid = Binder.getCallingUid();
final long ident = Binder.clearCallingIdentity();
final boolean modeOwnerChanged = (mModeOwnerPid != newModeOwnerPid
|| mModeOwnerUid != newModeOwnerUid);
try {
setModeInt(mode, cb, callingPackageName, modeOwnerChanged, newModeOwnerPid,
newModeOwnerUid);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
}
```
这个函数的作用是设置音频模式,它是实现了AudioManager类的setMode方法。
函数的第一个参数mode是要设置的音频模式。
函数的第二个参数cb是一个Binder对象,它可以在AudioFocusManager中使用,用来管理音频焦点。
函数的第三个参数callingPackageName是调用这个函数的应用程序的包名。
接下来是函数的实现。
首先,它调用enforceModifyAudioRoutingPermission()方法来检查是否有修改音频路由的权限。
然后,它使用synchronized关键字同步了mConnectedDevices,这是一个存储连接的设备信息的集合。
接着,它获取了调用这个函数的应用程序的PID和UID,以及清除了调用者的身份验证标识符。
接下来,它检查是否有新的模式所有者,并设置了一个用于检测模式所有者更改的标志。
最后,它调用了setModeInt方法来实际设置音频模式,传递了所有必要的参数,并在结束时恢复了调用者的身份验证标识符。
至此,Android T的AudioService.java中setMode函数的分析就结束了。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)