随着业务的发展,每个公司都希望能够完善自己的数据采集,这里我们采用了AOP的方式对数据进行无埋点收集。
但是有时候我们希望可以通过配置的方式决定收集什么数据,这个配置最好是让不懂开发的人去配置,比如运营,领导
等,那么如何做成可视化的界面让对方能够动态的配置是我们现在需要解决的问题:
- 如何实施的返回收集的界面数据
- 如果是通过截图的方式,大量频繁的截图,效率问题如何保证
经过我们技术的讨论我们已经决定通过截图的方式拿到前端的界面的各个按钮,那么整个流程,我通过下面的流程图说明
这样就完成了前端实时的传输文件最后渲染到前端显示。
先把逻辑弄清楚,把一个大的问题分解成不同的小问题去各个击破,接下来我们去如何自动化实时的截屏动作。
因为是操作图片,我们决定通过ndk的方式基于底层对设备进行不停的截屏并且通过socket的方式时发送,这样客户端便可以得到一序列的图片流,图片流合成后就成为视频;
可以通过ps | grep minicap 查看手机中minicap服务的相关信息
接下来我们使用minicap进行收集界面的菜截屏的采集工作
首先我们先确定收集的架构:adb shell getprop ro.product.cpu.abi | tr -d '\r'
ABI=$(adb shell getprop ro.product.cpu.abi | tr -d '\r')
然后把我们的minicap文件导入进手机
adb push libs/$ABI/minicap /data/local/tmp/
然后我们再看看我们的手机
可以看出我么也将minicap文件导入手机的/data/local/minicap文件夹下,熟悉Linux操作的都知道这个文件夹一般存放的
都是一些我们第三方常用的服务。android其实也就是一个Linux系统,这里也不例外。
接下来我们还要导入一个so文件,这个文件是基于源码Aosp进行编译,这里有兴趣的小伙伴可以试着去编译,既然是基于源码编译
那么就对系统的版本是有划分的,所以我们先确认好,sdk的版本,然后再导入
SDK=$(adb shell getprop ro.build.version.sdk | tr -d '\r')
adb push jni/minicap-shared/aosp/libs/android-$SDK/$ABI/minicap.so /data/local/tmp/
好啦,现在为止我们把两个文件都导入手机里面了,我们看看。
那么接下来我们验证下minicap的使用,使用shell命令
adb shell /data/local/tmp/minicap -h
注意,每次调用minicap时都需要设置LD_LIBRARY_PATH,否则它将找不到共享库。
说道这个问题要跟大家科普几个概念,动态库和静态库
1:静态函数库是指编译连接时,把库文件的代码全部加入到可执行文件中,所以生成的文件较大,但运行时,就不再需要库文件了。即,程序与静态库编译链接后,即使删除静态库文件,程序也可正常执行。
2:动态函数库正好相反,在编译链接时,没有把库文件的代码加入到可执行文件中,所以生成的文件较小,但运行时,仍需要加载库文件。即,程序只在执行启动时才加载动态库,如果删除动态库文件,程序将会因为无法读取动态库而产生异常。
命名上:Linux下,动态库通常以.so(share object)结尾。(通常/lib和/usr/lib等目录下存在大量系统提供的以.so结尾的动态库文件),
Windows下,动态库常以.dll结尾。(通常C:\windows\System32等目录下存在大量系统提供的以.dll结尾的动态库文件)
其实也有不是so结尾的动态库文件,比如我们的接下来要调用的minicap文件。
3:共享函数库:则是在程序启动的时候加载到程序中,它可以被不同的程序共享;动态加载函数库则可以在程序运行的任何时候动态的加载。
那么如何调用动态库呢?
说到这个又得跟大家科普下LIBRARY_PATH和LD_LIBRARY_PATH
LIBRARY_PATH环境变量用于程序编译期间查找动态链接库时指定查找共享库的路径
LD_LIBRARY_PATH环境变量用于程序运行期间,查找动态了链接库时指定系统连接外的其他路径,注意LD_LIBRARY_PATH指定的路径会在系统默认路径之前进行查找。
这里提示的是找不到对应的so库文件,原来是因为
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -h
这样我们就可以使用/data/temp/下的minicap文件啦。其实这个
另外,每次使用minicap时,都需要指定显示和投影的大小。这是因为我们必须使用私有api在许多三星设备上访问信息segfault(而minicap本身运行良好)。运行。sh助手脚本提供了如上所述的自动大小助手。假设你的设备有1080x1920的屏幕。首先,让我们快速检查一下您的设备是否能够运行minicap的当前版本:
执行命令:adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0 -t
zewdeMacBook-Pro:minicap zew$ adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0 -t
PID: 10065
INFO: Using projection 1080x1920@1080x1920/0
INFO: (external/MY_minicap/src/minicap_23.cpp:240) Creating SurfaceComposerClient
INFO: (external/MY_minicap/src/minicap_23.cpp:243) Performing SurfaceComposerClient init check
INFO: (external/MY_minicap/src/minicap_23.cpp:250) Creating virtual display
INFO: (external/MY_minicap/src/minicap_23.cpp:256) Creating buffer queue
INFO: (external/MY_minicap/src/minicap_23.cpp:261) Creating CPU consumer
INFO: (external/MY_minicap/src/minicap_23.cpp:265) Creating frame waiter
INFO: (external/MY_minicap/src/minicap_23.cpp:269) Publishing virtual display
INFO: (jni/minicap/JpgEncoder.cpp:64) Allocating 6268932 bytes for JPG encoder
INFO: (external/MY_minicap/src/minicap_23.cpp:284) Destroying virtual display
OK
zewdeMacBook-Pro:minicap zew$
如果出现这个OK说明是支持运行的。
-P参数的格式是:{RealWidth}x{RealHeight}@{VirtualWidth}x{VirtualHeight}/{Orientation}。“virtual”大小是所需投影的大小。方位参数告诉minicap设备的当前方向(以度为单位),这是必需的,以便我们能够向框架消费者报告Socket接口上的正确方向。获得当前方向(或旋转)的一种方法是RotationWatcher.apk。如果命令输出“OK”,那么一切都会很好。如果相反,它分段故障(可能在挂起一段时间后),您的设备不支持,我们想知道它。最后,让我们开始minicap。它将开始侦听抽象的unix域Socket。
执行命令:adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0
现在我们只需要创建一个本地转发,这样就可以连接到Socket。
执行命令:adb forward tcp:1313 localabstract:minicap
为什么要本地转发呢?什么是本地转发?
这个就跟一些模拟器,PC端的XX助手和手机App的通讯原理:是一样的。
比如说:adb forward tcp:8000 tcp:9000
它的意思就是把PC端的8000端口转发到Android端的9000端口上。
什么是转发?转发就是执行上面的命令后 PC端的8000端口会被 adb
监听, 这个时候我们只需要往8000端口写数据, 这个数据就会发送到手机端的9000端口上.
如何使用本地端口连接到Socket。注意,目前一次只支持一个连接。无论如何,有一个以上的连接是没有意义的,因为USB总线将很快饱和。所以,让我们联系了。
上面其实是启动了一个socket服务器,我们需要跟该socket服务通信,首先我们要将本地的端口映射到minicap工具上,端口自己随意:这里我们用了1313端口号。
然后我们使用nc localhost 1313来与minicap通信,然后你会发现好多乱码。
zewdeMacBook-Pro:~ zew$ nc localhost 1313
(8?8??????JFIF??C
%, #&')*)-0-(0%()(??C
(((((((((((((((((((((((((((((((((((((((((((((((((((??8"??
???}!1AQa"q2??#B??R??$3br?
%&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz???????????????????????????????????????????????????????????????????????????
???w!1AQaq"2B???? #3R?br?
$4?%?&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz??????????????????????????????????????????????????????????????????????????
??R?(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(??(
nc 是 Linux 下的一个用于调试和检查网络工具包。可用于创建 TCP/IP 连接,最大的用途就是用来处理 TCP/UDP 套接字。
为什么要用这个呢,因为一旦暴露这个端口,我们通过nc拿到这个端口的数据,你可以使用客户端模式来连接到 1313 端口:
我们可以处理来自这里的截屏数据流。
流程是首先minicap截屏数据发送,在模拟本地的一个端口转发minicap的端口的数据,比如1313端口,然后我们可以连接本地的1313端口,我们把这个端口数据拿出来进行恢复成我们想要的图片。
刚刚那个乱码的东西我们看不懂,那么到底是什么呢?其实它是一个基于minicap协议是一个简单的基于推送的二进制协议。当您第一次连接到套接字时,您会得到一个全局标头,后面跟着第一个框架。全局标头将不会再次出现。继续发送更多的帧,直到你停止minicap。有兴趣的小伙伴自行去研究。
那我们现在想看看例子,好啦,我们启动一个node.js的服务
这里我们要安装node。安装过程顺带也要安装一下“ws”和“express”库,因为需要用到。
启动命令是:PORT=9002 node app.js
如下图可见我们启动了一个9002端口的服务:
然后我们在浏览器下输入localhost:9002就可以看到如下效果了
很奇怪的是是白屏的
然后我们看日志的记录:
最后发现的是原来是因为adb连接模拟器断掉了,因为昨天演示的时候还是正常的,这里经常会遇到adb连接断掉的情况。
返回的数据格式
banner { version: 1,
length: 24,
pid: 2611,
realWidth: 1080,
realHeight: 1920,
virtualWidth: 1080,
virtualHeight: 1920,
orientation: 0,
quirks: 2 }
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=16192)
body(len=16192)
chunk(length=887)
bodyfin(len=887,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=33271)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
bodyfin(len=33267,cursor=4)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(val=33267)
headerbyte3(val=33267)
headerbyte4(val=33267)
body(len=16188)
chunk(length=17079)
bodyfin(len=17079,cursor=0)
chunk(length=16192)
headerbyte1(val=243)
headerbyte2(