第35讲 Camera Native FW 之UidPolicy控制逻辑

本讲是Android Camera Native Framework专题的第35讲,我们介绍Camera Native FW的UidPolicy控制逻辑。

更多资源:

资源 描述
在线课程 极客笔记在线课程
知识星球 星球名称:深入浅出Android Camera 星球ID: 17296815
Wechat 极客笔记圈

Android 如何查看进程的UID

可以通过ps –A来查看,一个UID下面可以有多个进程

单用户情况

Android 如何查看进程的UID

  • 这个 u0_a106 表示该应用是 user 0(主用户)下面的应用,id是 106

  • 普通应用程序的UID 都是从 10000开始的,所以最终计算出的 UID 就是 10106

多用户情况

Android 如何查看进程的UID

  • 可以看到 工作用户的 userID 是 14,计算方式是:100000 * 14 + 10106 = 1410106

UidPolicy与AMS的交互

UidPolicy类是CameraService创建的,用于监控Client UID的状态变化,当UID状态为IDLE时不允许使用Camera

UidPolicy与AMS的交互逻辑如下

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的定义:

https://s.deepinout.com/android-14.0.0_r2/xref/frameworks/base/core/java/android/app/ProcessStateEnum.aidl#24

onUidIdle处理流程

当Camera App从前台切到后台时,如果没有close camera,该回调会被调用,从而防止在后台使用Camera

onUidIdle处理流程

onUidStateChanged处理流程

UID的ProcState发生变化,会通知所有Listener的onCameraAccessPrioritiesChanged

onUidStateChanged处理流程

onUidProcAdjChanged处理流程

当ProcAdj发生变化时,会选择性通知Listener的onCameraAccessPrioritiesChanged

onUidProcAdjChanged处理流程

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera Native Framework