第31&32讲 Camera Native FW 之Open Camera之Camera抢占逻辑详解

本讲是Android Camera Native Framework专题的第31+32讲,我们介绍Camera Native FW的Open Camera之Camera抢占流程。

更多资源:

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

handleEvictionsLocked流程

流程基于Android 14代码:http://s.deepinout.com/android-14.0.0_r2/

Open Camera之Camera抢占流程

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未超过最大值(无需抢占)

冲突的定义:

bool conflicting =
(curKey == key ||
    i->isConflicting(key) ||
    client->isConflicting(curKey));

疑问:

  • 同一进程能否重复打开同一颗Camera?
  • 同一进程能否同时打开不同颗Camera?
  • 不同进程能否重复打开同一颗Camera?
  • 不同进程能否同时打开不同颗Camera?

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

Android Camera Native Framework