1. getCharacteristics 总体流程
getCharacteristics
|
cameraservice
|
cameraprovidermanager
|
deviceinfo3
cameraserver进程刚起来做enumerate时会将 cameraCharacteristics 存放在cameraprovidermanager的deviceinfo3里面mcameraCharacteristics
上层问cameraservice要cameraCharacteristics时,cameraservice从deviceinfo3中直接获取
如果是logical multicam camera会针对每一个物理camera调用到hal层的 getphysicalcameraCharacteristics,保存在mphysicalcameraCharacteristics map中
2. addlistener / remove
需要知道当前平台哪些camera可用
某一个camera的状态发生改变时(open close),通过callback的方式动态通知给client
3. openCamera 流程
总体流程:
权限检查、输入参数检查->camera抢占逻辑->client初始化->device初始化
connectDevice流程:
connectHelper流程:
1.为NON-System ndk client 获取clientpackagename
2.记录opentimeNS
3.获取到mServiceLockWrapper这把锁,保证同一时刻只有一个客户端在opencamera
4.权限和cameraid检查(详见 4 == 4 validateConnectLocked)
5.处理抢占逻辑 handleEvictionsLocked
6.获取deviceVersionAndTransport
7.makeclient和client->initialize
8.finishConnectLocked
将client添加到active client manager中,
addAndEvict当前的client
wouldEvicLocked,看下是否还会出现抢占
并监听client进程是否挂掉
(monitorTags:监听每一帧每一个metadata的状态)
4 == 4
validateConnectLocked流程:
1. validateClientPermissionsLocked
获取到UID PID
shouldrejectsystemcameraconnection对system camera的权限进行检查
检查是否有已经获取到camera权限
检查uid是否处于active状态
检查sensor privacy是否没有enable
检查当前用户是否在allow user list里面(多用户场景)
2.根据cameraid获取camerastate 检查cameraid是否合法
3.根据camerastate检查当前cameradevice是否可用
TIPS:
clientDescriptor 用于描述一个 camera client对象:
KEY 当前Camera Client对应的CameraId
VALUE 当前Camera Client对象
cost 打开当前Camera需要耗费的resource cost
conflictingKeys 与当前Camera无法同时打开的Camera Id列表
score 打开当前Camera的客户端进程oom_adj score,这个值越大越容易被LMK干掉,前台进程这个值为0
ownerId 打开当前Camera的客户端进程PID
state 打开当前Camera的客户端进程的状态,值越小优先级越高
isVendorClient 打开当前Camera的客户端是否是Vendor进程
oomScoreOffset 需要增加的oomScore偏移值(相当于在抢占逻辑中,降低自己的优先级)
clientPriority 用于描述一个 camera client进程的优先级:
score 打开当前Camera的客户端进程oom_adj score,这个值越大越容易被LMK干掉,前台进程这个值为0
state 打开当前Camera的客户端进程的状态,值越小优先级越高
isVendorClient 打开当前Camera的客户端是否是Vendor进程
scoreOffset 需要增加的oomScore偏移值(相当于在抢占逻辑中,降低自己的优先级)