STF stf 报错 Frame producer had an error FailError: Failure: 'closed'解决办法

Tanwheey · 2021年08月12日 · 最后由 Bug_Hunter 回复于 2021年09月16日 · 2862 次阅读

选择设备,进入单机页,设备无法展示画面:

日志报错:
2021-08-12T07:26:46.857Z FTL/device:plugins:screen:stream 78683 [37963e58] Frame producer had an error FailError: Failure: 'closed'
at /stf/node_modules/adbkit/lib/adb/parser.js:183:29
at runCallback (timers.js:810:20)
at tryOnImmediate (timers.js:768:5)
at processImmediate as _immediateCallback
2021-08-12T07:26:46.858Z FTL/util:lifecycle 78683 [37963e58] Shutting down due to fatal error
2021-08-12T07:26:46.867Z INF/provider 78672 [] Cleaning up device worker "37963e58"
2021-08-12T07:26:46.868Z ERR/provider 78672 [
] Device worker "37963e58" died with code 1
向上查找设备 Android api:
2021-08-12T07:25:47.255Z INF/device:plugins:service 78683 [37963e58] using 'start-foreground-service' command for API 29

STF 是通过其框架的 minicap 工具实现屏幕投屏的, minicap 运行于 android 设备端,负责设备屏幕视频的实时采集并通过 socket 接口发送。通过测试,发现是 minicap 的问题,部分机型系统不支持 minicap 的运行。

1、查看 lib/units/device/resources/minicap.js 发现
1)连接手机后 STF 会自动推送 minicap 和 minicap.so 文件到/data/local/tmp 目录;
2)使用命令实现屏幕投屏:
return adb.shell(options.serial, util.format(
'LD_LIBRARY_PATH=%s exec %s %s'
, path.dirname(resources.lib.dest)
, resources.bin.dest
, cmd
))
2、测试 minicap 是否可以运行
1)测试是否可运行:
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -t
2)运行:
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap
发现小米 10 无法运行。

解决:设法让它在我的设备(MI 10、MIUI 12 20.3.9、Android 10)上运行,并在 AOSP 代码 (frameworks/native/include/gui/LayerState.h) 中添加了一行:
diff --git a/libs/gui/include/gui/LayerState.h b/libs/gui/include/gui/LayerState.h
index f438eb3d0..98490849b 100644
--- a/libs/gui/include/gui/LayerState.h
+++ b/libs/gui/include/gui/LayerState.h
@@ -254,6 +254,7 @@ struct DisplayState {

uint32_t width, height;

  • uint8_t _dummy[16]; status_t write(Parcel& output) const; status_t read(const Parcel& input); };

这是 minicap.so 问题, 小米 10(API 级别 29)上成功测试。 要修复它,必须替换预构建的minicap.so,stf 在 node_modules/minicap-prebuilt-beta/prebuilt/arm64-v8a/lib/android-29/minicap.so 进行替换即可。

共收到 1 条回复 时间 点赞

大佬,请问一下 frameworks/native/include/gui/LayerState.h 这个文件是 stf 里的还是 minicap 里的

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册