本讲是Android Camera Native Framework专题的第35讲,我们介绍Camera Native FW的UidPolicy控制逻辑。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
Android 如何查看进程的UID
可以通过ps –A
来查看,一个UID下面可以有多个进程
单用户情况
- 这个 u0_a106 表示该应用是 user 0(主用户)下面的应用,id是 106
-
普通应用程序的UID 都是从 10000开始的,所以最终计算出的 UID 就是 10106
多用户情况
- 可以看到 工作用户的 userID 是 14,计算方式是:100000 * 14 + 10106 = 1410106
UidPolicy与AMS的交互
UidPolicy类是CameraService创建的,用于监控Client UID的状态变化,当UID状态为IDLE时不允许使用Camera
UidPolicy与AMS的交互逻辑如下
UidPolicy成员变量详解
UidPolicy成员变量 | 描述 |
---|---|
mRegistered | 是否向AMS注册监听UID变化了 如果AMS比CameraService后启动或AMS突然挂了,这个变量可能会为False |
mActiveUids | 处于Active状态的UID列表 |
mMonitoredUids | 正在监控的UID列表 |
mOverrideUids | 保存UID的Override状态(通过cmd命令设置for debug) |
UidPolicy方法详解
UidPolicy方法 | 描述 |
---|---|
registerSelf()/unregisterSelf() | 注册/注销UID Observer |
isUidActive(uid_t uid, String16 callingPackage) | 判断当前UID是否处于Active状态 |
getProcState(uid_t uid) | 获取当前UID的ProcState |
IUidObserver的回调方法 | 处理UID状态发生变化 |
addOverrideUid/ removeOverrideUid | 设置/移除某个UID的Override状态 |
registerMonitorUid/ unregisterMonitorUid | 注册/注销监听某个Uid的状态变化 |
onServiceRegistration | 监听AMS服务注册上了,有可能AMS比CameraService起来得慢一些/AMS挂掉重启,因此需要AMS启动后才能去注册监听UID状态 |
binderDied | AMS服务挂掉了,等AMS重启后要重新注册 |
IUidObserver回调接口
IUidObserver接口 | 描述 |
---|---|
void onUidGone(int uid, boolean disabled); | 当前UID没有进程在运行 |
void onUidActive(int uid); | 当前UID处于Active状态,有进程在前台运行 |
void onUidIdle(int uid, boolean disabled); | 当前UID处于IDLE状态,要么相关进程在后台运行了一段时间了,要么相关进程都未运行了 |
void onUidStateChanged(int uid, int procState, long procStateSeq, int capability); | 当前UID的procState发生变化 |
void onUidProcAdjChanged(int uid, int adj); | 当前UID的oom adj值发生变化 |
关于ProcState的定义:
onUidIdle处理流程
当Camera App从前台切到后台时,如果没有close camera,该回调会被调用,从而防止在后台使用Camera
onUidStateChanged处理流程
UID的ProcState发生变化,会通知所有Listener的onCameraAccessPrioritiesChanged
onUidProcAdjChanged处理流程
当ProcAdj发生变化时,会选择性通知Listener的onCameraAccessPrioritiesChanged