
注:这里介绍Android15 Camera系统调试用到的跟踪函数调用关系的一些方法。
使用CallStack类dump调用栈
例如,跟踪Camera3OutputStream对象的创建。
1.dump调用栈
步骤1.Camera3OutputStream.h/.cpp中通过CallStack类打印调用信息.
//frameworks/av/services/camera/libcameraservice/device3/Camera3OutputStream.h
//添加dumpCallStack()接口,封装CallStack调用
class Camera3OutputStream :
public Camera3IOStreamBase,
public Camera3OutputStreamInterface {
...
static void dumpCallStack(const char* prefix);
};
//frameworks/av/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
//添加dumpCallStack()接口实现
#include "utils/CallStack.h"
void Camera3OutputStream::dumpCallStack(const char* prefix)
{
android::CallStack stack(prefix);
stack.update();
//stack.log("CAMERA_CALLSTACK");
}
步骤2.Camera3OutputStream需要的位置添加dumpCallStack()调用
//frameworks/av/services/camera/libcameraservice/device3/Camera3OutputStream.cpp
Camera3OutputStream::Camera3OutputStream(int id,
sp<Surface> consumer,
uint32_t width, uint32_t height, int format,
android_dataspace dataSpace, camera_stream_rotation_t rotation,
nsecs_t timestampOffset, const std::string& physicalCameraId,
const std::unordered_set<int32_t> &sensorPixelModeUsed, IPCTransport transport,
int setId, bool isMultiResolution, int64_t dynamicRangeProfile,
int64_t streamUseCase, bool deviceTimeBaseIsRealtime, int timestampBase,
int mirrorMode, int32_t colorSpace, bool useReadoutTimestamp) :
Camera3IOStreamBase(id, CAMERA_STREAM_OUTPUT, width, height,
/*maxSize*/0, format, dataSpace, rotation,
physicalCameraId, sensorPixelModesUsec, setId, isMultiResolution,
dynamicRangeProfile, streamUseCase, deviceTimeBaseRealtime,
timestampBase, colorSpace),
mConsumer(consumer),
mTransform(0),
... {
dumpCallStack("Camera3OutputStream::Camera3OutputStream1");
...
}
步骤3.编译并更新cameraserver到设备
步骤4.重启系统
步骤5.操作相机
2.查看调用栈
通过logcat抓取日志,有如下调用关系
