本讲是Android Camera Native Framework专题的第31+32讲,我们介绍Camera Native FW的Open Camera之Camera抢占流程。
更多资源:
资源 | 描述 |
---|---|
在线课程 | 极客笔记在线课程 |
知识星球 | 星球名称:深入浅出Android Camera 星球ID: 17296815 |
极客笔记圈 |
handleEvictionsLocked流程
流程基于Android 14代码:http://s.deepinout.com/android-14.0.0_r2/
ClientDescriptor介绍
描述一颗CameraClient对象
成员变量 | 描述 |
---|---|
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介绍
描述一颗CameraClient客户端进程的优先级
成员变量 | 描述 |
---|---|
score | 打开当前Camera的客户端进程oom_adj score,这个值越大越容易被LMK干掉,前台进程这个值为0 |
state | 打开当前Camera的客户端进程的状态,值越小优先级越高 |
isVendorClient | 打开当前Camera的客户端是否是Vendor进程 |
scoreOffset | 需要增加的oomScore偏移值(相当于在抢占逻辑中,降低自己的优先级) |
这个类重载了>,>=,<,<=
运算符,通过score和state来判断大小,ClientPriority值越小,优先级越高
bool operator< (const ClientPriority& rhs) const {
if (this->mScore == rhs.mScore) {
return this->mState < rhs.mState;
} else {
return this->mScore < rhs.mScore;
}
}
Camera抢占逻辑
抢占逻辑
- 与已打开Camera存在冲突
- 同一个进程
- 同一颗Camera(已打开被抢占)
- 不同颗Camera(想打开抢占失败,无法打开)
- 不同进程
- 已打开优先级低(已打开被抢占)
- 已打开优先级高(想打开抢占失败,无法打开)
- 同一个进程
- 与已打开Camera不存在冲突
- Total cost超过最大值
- 已打开优先级低(已打开被抢占)
- 已打开优先级高(想打开抢占失败,无法打开)
- Total cost未超过最大值(无需抢占)
- Total cost超过最大值
冲突的定义:
bool conflicting =
(curKey == key ||
i->isConflicting(key) ||
client->isConflicting(curKey));
疑问:
- 同一进程能否重复打开同一颗Camera?
- 同一进程能否同时打开不同颗Camera?
- 不同进程能否重复打开同一颗Camera?
- 不同进程能否同时打开不同颗Camera?