
Android15 Media框架有两个使用场景,即媒体播放和录制。媒体播放实现中一个重要的类是MediaPlayerService,录制实现中一个重要的类是MediaRecorder。这里以MediaRecorder这种使用场景为例子说明调试时如何操作。
MediaRecorder使用场景,从技术栈实现来说是通过JNI interface提供接口给APK调用的。
MediaRecorderJNI这层的日志是通过ALOGV/E日志接口输出的,如代码中有:
cpp
//frameworks/base/media/jni/android_media_MediaRecorder.cpp
static void android_media_MediaRecorder_setVideoSource(JNIEnv *env, jobject thiz, jint vs)
{
ALOGV("setVideoSource(%d)", vs);
if (vs < VIDEO_SOURCE_DEFAULT || vs >= VIDEO_SOURCE_LIST_END) {
jniThrowException(env, "java/lang/IllegalArgumentException",
"Invalid video source");
return;
}
sp<MediaRecorder> mr = getMediaRecorder(env, thiz);
if (mr == NULL) {
jniThrowException(env, "java/lang/IllegalStateException", NULL);
return;
}
process_media_recorder_call(env, mr->setVideoSource(vs), "java/lang/RuntimeException",
"setVideoSource failed.");
}
默认上述JNI Interface中的ALOGV打印的内容是不输出的,如果开发调试时想打开需要做两个内容:
- 模块中定义LOG_NDEBUG 0
- 系统启动后设置调试级别为V
下面以打开MediaRecorder JNI Interface ALOGV级别日志输出为例子,
1. android_media_MediaRecorder.cpp中定义LOG_NDEBUG 0
cpp
--- a/media/jni/android_media_MediaRecorder.cpp
+++ b/media/jni/android_media_MediaRecorder.cpp
@@ -22,7 +22,7 @@
#include <unistd.h>
#include <vector>
-//#define LOG_NDEBUG 0
+#define LOG_NDEBUG 0
#define LOG_TAG "MediaRecorderJNI"
#include <utils/Log.h>
@@ -47,10 +47,13 @@
#include <android/content/AttributionSourceState.h>
#include <android_os_Parcel.h>
然后,编译super.img替换到设备.
2.启动系统后,adb设置MediaRecorder logLevel为V级别
adb shell setprop persist.log.tag.MediaRecorderJNI V
该属性设置即生效,且永久生效.
3.过滤日志确认
