Android15 Media框架JNI Interface调试

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打印的内容是不输出的,如果开发调试时想打开需要做两个内容:

  1. 模块中定义LOG_NDEBUG 0
  2. 系统启动后设置调试级别为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.过滤日志确认

相关推荐
Android系统攻城狮7 小时前
Linux Gstreamer深度解析之gst_audio_encoder_set_frame_max调用流程与实战(六十一)
android·linux·运维·音视频·gstreamer音视频·音视频进阶·gstreamer音视频进阶
传奇开心果编程10 小时前
【Compose Multiplatform 跨端开发学与练】第7课 平台适配与互操作
android·windows·学习·ui·ios·kotlin·composer
mmsx10 小时前
Android 地图数据链路:从 GDAL、KML 到多引擎适配
android·kotlin
2601_9689007710 小时前
大模型版本回归评估实战:从能力指标到额度口径的完整链路
android·数据挖掘·回归
ao-weilai13 小时前
MySQL数据库:基本查询
android·数据库·mysql
事圆则缓13 小时前
Kotlin 泛型方差实战:out、in、星投影与类型擦除
android·开发语言·kotlin
传奇开心果编程15 小时前
【Compose Multiplatform 跨端开发学与练】第5课 网络与数据层
android·网络·学习·ui·ios·kotlin·composer
ao-weilai16 小时前
MySQL数据库:内置函数
android·数据库·mysql
SWAGGY..16 小时前
【C++进阶】:(7)红黑树的原理与 C++ 实现:结构设计、插入调整及性质验证
android·java·开发语言·c++·算法
Android打工仔17 小时前
CoroutineScheduler 设计解析(上)—— 为什么 Dispatchers.IO 会创建更多线程?
android·kotlin·源码阅读