android拷机工具,Android8.0平台Camera monkey拷机卡死异常解决方案
android8.0平台camera monkey拷机卡死异常
最近在处理一个camera monkey拷机卡死的问题,卡死在停止录像的画面。
monkey测试命令
monkey -p com.android.camera2 --throttle 300 --ignore-crashes --ignore-timeouts --ignore-security-exceptions -v -v -v 50000000 &
camera卡住的时候,把mediaserver进程的backtrace打印可发现卡在audiosource::waitoutstandingencodingframes_l函数中,异常log:
debugger -b [pid]
...
[04-28 16:35:43]"binder:237_4" systid=2571
[04-28 16:35:43] #00 pc 00018cd8 /system/lib/libc.so (syscall+28)
[04-28 16:35:43] #01 pc 00047529 /system/lib/libc.so (__pthread_cond_timedwait(pthread_cond_internal_t*, pthread_mutex_t*, bool, timespec const*)+102)
[04-28 16:35:43] #02 pc 000a7adb /system/lib/libstagefright.so (android::audiosource::waitoutstandingencodingframes_l()+54)
[04-28 16:35:43] #03 pc 000a787b /system/lib/libstagefright.so (android::audiosource::reset()+82)
[04-28 16:35:43] #04 pc 000a77e9 /system/lib/libstagefright.so (android::audiosource::~audiosource()+44)
[04-28 16:35:43] #05 pc 000a794d /system/lib/libstagefright.so (android::audiosource::~audiosource()+12)
[04-28 16:35:43] #06 pc 0000ac5b /system/lib/libutils.so (android::refbase::decstrong(void const*) const+70)
[04-28 16:35:43] #07 pc 00049c4f /system/lib/libmediaplayerservice.so (android::stagefrightrecorder::~stagefrightrecorder()+206)
[04-28 16:35:43] #08 pc 00049e7b /system/lib/libmediaplayerservice.so (android::stagefrightrecorder::~stagefrightrecorder()+2)
[04-28 16:35:43] #09 pc 00047eef /system/lib/libmediaplayerservice.so (android::mediarecorderclient::release()+34)
...
把调试log打开,并跟踪其代码流程如下
238 1538 v audiosource: set stoptime: 80223601 us
代码:
stagefrightrecorder.cpp
status_t stagefrightrecorder::stop() {
int64_t stoptimeus = systemtime() / 1000;
for (const auto &source : { maudioencodersource, mvideoencodersource }) {
if (source != nullptr && ok != source->setstoptimeus(stoptimeus)) {
alogw("failed to set stoptime %lld us for %s",
(long long)stoptimeus, source->isvideo() ? "video" : "audio");
}
}
audiosource.cpp
status_t audiosource::setstoptimeus(int64_t stoptimeus) {
mstopsystemtimeus = stoptimeus;
return ok;
}
238 1523 v audiosource: datacallbacktimestamp: 80264993 us
238 1523 v audiosource: drop audio frame at 80264993 stop time: 80223601 us
代码:
audiosource.cpp
if (mstopsystemtimeus != -1 && timeus >= mstopsystemtimeus) {
alogv("drop audio frame at %lld stop time: %lld us",
(long long)timeus, (long long)mstopsystemtimeus);
mnomoreframestoread = true;
mframeavailablecondition.signal();
return ok;
}
238 1538 i audiosource: read: mbuffersreceived is empty and mnomoreframestoread
代码
audiosource.cpp
status_t audiosource::read(
mediabuffer **out, const readoptions * /* options */) {
mutex::autolock autolock(mlock);
*out = null;
if (minitcheck != ok) {
alogi("read: minitcheck not ok");
return no_init;
}
while (mstarted && mbuffersreceived.empty()) {
mframeavailablecondition.wait(mlock);
if (mnomoreframestoread) {
alogi("read: mbuffersreceived is empty and mnomoreframestoread");
return ok;
}
}
此处当mbuffersreceived为空且mnomoreframestoread被设置时候,直接返回.
04-30 07:57:53.687 238 1538 v mediacodecsource: puller (audio) posting eos
04-30 07:57:53.730 238 1513 v mediacodecsource: puller (audio) reached eos
04-30 07:57:53.730 238 1513 v mediacodecsource: encoder (audio) reached eos
代码
mediacodecsource.cpp
case kwhatpull:
status_t err = msource->read(&mbuf);
if (mbuf != null) {
mnotify->post();
msg->post();
} else {
handleeos();
}
mediacodecsource.cpp
void mediacodecsource::puller::handleeos() {
alogv("puller (%s) posting eos", misaudio ? "audio" : "video");
// android::callstack cs("puller::handleeos");
sp msg = mnotify->dup();
msg->setint32("eos", 1);
msg->post();
}
因为从source获取到的buffer为空,于是判定为eos,并进行eos处理。
04-30 07:57:54.126 238 1513 i mediacodecsource: encoder (audio) stopping
04-30 07:57:54.126 238 1513 i mediacodecsource: encoder (audio) already stopped
代码
mediacodecsource.cpp
case kwhatstop:
{
alogi("encoder (%s) stopping", misvideo ? "video" : "audio");
if (moutput.lock()->mencoderreachedeos) {
// if we already reached eos, reply and return now
alogi("encoder (%s) already stopped",
misvideo ? "video" : "audio");
(new amessage)->postreply(replyid);
break;
}
mpuller->stop();
由于先前已经接收到eos信息,因此mediacodecsource在处理kwhatstop时候直接返回。
此次问题发生的流程大致如下
应用层发出停止录像的请求 audiosource把该停止录像的请求之后的音频数据丢弃,并设置mnomoreframestoread mediacodecsource从audiosource读取到buffer为null,于是判定为eos,并进行相关处理,但并不清除mediacodecsource::puller::queue.mreadbuffers mediacodecsource接收到kwhatstop消息,发现已经进行了eos处理,于是放弃执行puller.stop(它会对puller::queue.mreadbuffers执行flush操作),直接返回。 audiosource最后进行reset时候,调用waitoutstandingencodingframes_l去等待直到所有buffer被释放,但有些buffer在audio puller::queue.mreadbuffers没有释放,于是在进程被hold在此处。
暂时的修改方案是
在第4步处理kwhatstop消息时候,即使已经进行过eos处理,仍然执行puller.stop,以确保puller::queue.mreadbuffers为空。
android拷机工具,Android8.0平台Camera monkey拷机卡死异常解决方案相关推荐
- android摄像头监控打电话卡死,Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案...
本文将带你了解Android应用开发Android8.0平台Camera monkey拷机卡死异常解决方案,希望本文对大家学Android有所帮助. Android8.0平台Camera monkey ...
- android烤机按键变慢,Android8.0平台Camera monkey拷机卡死异常
Android8.0平台Camera monkey拷机卡死异常 最近在处理一个camera monkey拷机卡死的问题,卡死在停止录像的画面. monkey测试命令 monkey -p com.and ...
- Android8.0平台Camera monkey拷机卡死异常
Android8.0平台Camera monkey拷机卡死异常 最近在处理一个camera monkey拷机卡死的问题,卡死在停止录像的画面. monkey测试命令 monkey -p com.and ...
- Android8.0前后Camera架构对比(二十三)
Android 的相机硬件抽象层 (HAL) 可将Camera2中较高层级的相机框架 API 连接到底层的相机驱动程序和硬件.相机子系统包括相机管道组件的实现,而相机 HAL 可提供用于实现您的这些组 ...
- Recovery刷机工具 v5.0.2.8
Recovery刷机工具 v5.0.2.8 中文版 软件大小:4.3701MB 软件语言:简体中文 软件类别:常用软件 软件授权:免费版 更新时间:2012-12-17 应用平台:/WinXP/|Wi ...
- android拷机工具,【AndroidFramework】【EMMC拷机】混合拷机时盒子待机
[AndroidFramework][EMMC拷机]混合拷机时盒子待机 问题结论 暂时确定为误按键,不是故障.问题关闭.后续完全保证无按键(物理隔离)情况下如果出现待机,请反馈. 问题描述 [EMMC ...
- android 打印kernel log,android8.0 kernel4.9.44 各层log打开
一.问题 平台android8.0 kernel4.9.44,想加个i2c驱动,打开log都是一件脑瓜疼的事. 二.log总结 android有三种log. 1.kernel下面的,就是driver层 ...
- 最新支持android的手机型号,android8.0国产手机有哪些 哪些手机支持android 8.0
谷歌Android 8.0系统虽然早已经发布,但是能用上的机型却寥寥无几.那么目前有哪些手机支持android 8.0呢,其中国产手机支持android8.0的有哪些? 现在,XDA整理并公布了39款 ...
- Android 8.0 学习(22) Android8.0平台Eng版本中显示界面切换闪红框
Android O平台Eng版本中显示界面切换闪红框 1.问题 Version >= Android O1 在Android O平台Eng版本中,在切换显示界面.开任何apk.操作按钮等操作时, ...
最新文章
- 再见,Windows 7!盘点 2020 影响开发者的十大事件!
- 暴力探测蓝牙设备工具redfang
- 为什么torch.nn.Linear的表达形式为y=xA^T+b而不是常见的y=Ax+b?
- OSI、TCP/IP or Five-layer(Protocols Use) Model
- linux下toe网卡驱动,toe命令是干什么的,有没有大神解答一下
- PHP文件操作的经典案例
- 你不懂js系列学习笔记-类型与文法- 02
- thinkphp5 mysql助手_ThinkPHP5-数据库基本操作
- Python多线程学习(上)
- cesium cesium is not defined
- 删除excel 2007数据透视表
- 使用 ABAP 代码制作手机能够扫描的二维码(QRCode)
- 扬州工业机器人外壳设计排名_世界十大工业机器人制造商公布,排名第一的竟是……...
- 安卓手机显示没有网络连接到服务器,安卓手机 总是提示登录网络
- 计算机财务应用实验心得,金蝶财务软件实训心得.doc
- ShuffleNet神经网络
- 开发对接微信卡包会员卡_微信公众号实现会员卡领取功能
- 下载jar源码时,出现:cannt not download source Sources not found for
- QQ邮箱开通exchange的方法
- vue3 - 网页大转盘抽奖功能,支持后端接口确定最终奖品,可自定义轮盘宽高、颜色、字号、按钮等等(超详细的示例代码及注释开箱即用,稍微改改就能应用到你的项目中)
热门文章
- 橘子学Flink03之Flink的流处理与批处理
- 史上最强鸿蒙教程来袭!跟Android初学者分享几点经验,专题解析
- python数据科学导论_数据科学导论:Python语言(原书第3版)
- ubuntu18.04美化主题(完整版)
- 计算机系vlog,华为Mate40系列化身vlog神器,专业好用两手抓
- 荣耀10鸿蒙系统禁用列表
- 证券期货经营机构私募资产管理业务管理办法 2018年10月22日
- Linux应用基础——串口应用编程
- npoi2.0版本word中插入图片
- 【解决方案】如何搭建运动场体育赛事直播方案:EasyCVR综合智能化体育赛事直播