最近在使用MediaRecord实现录屏功能,因为平台没有自带麦克风,是外接USB,遇到可不少坑。
跟踪这个流程原因是,有其他app已经在使用USB麦克风了,我再开启自己录屏的时候ANR,ANR的原因是MediaRecorder卡在prepare。
MediaRecorder的prepare流程如下:
1.\Android\framework\av\media\libmedia\MediaRecorder.cpp -> prepare
2.\Android\framework\av\media\libmediaplayerservice\StagefrightRecorder.cpp->prepare->prepareInternal-> etupMPEG4orWEBMRecording -> setupAudioEncoder -> createAudioSource
3. \Android\framework\av\media\libstagefright\AudioSource.cpp -> AudioSource
4. \Android\framework\av\media\libaudioclient\AudioRecord.cpp -> AudioRecord -> set-> openRecord_l
5.\ Android\framework\av\services\audiopolicy\managerdefault\AudioPolicyManager.cpp -> getInputForAttr-> getInputForDevice
6. \ Android\framework\av\services\audiopolicy\service\AudioPolicyClientImpl.cpp -> openInput
7. \ Android\framework\av\services\audioflinger\AudioFlinger.cpp -> openInput
8. \ Android\framework\av\media\libaudiohal \DeviceHalHidl.cpp -> openInputStream
9. \ Android\hardware\interfaces\audio\2.0\default\Device.cpp -> openInputStream
10. \ Android\hardware\libhardware\modules\usbaudio\Audio_hal.c -> adev_open_input_stream -> profile_read_device_info(in->profile)
一直到hardware层,系统运行到Audio_hal.c的adev_open_input_stre方法,在profile_read_device_info(in->profile)读取设备信息的时候一直没有响应
再往估计要去看硬件驱动层了