什么是MiniCap
官方说法:Minicap提供了一个套接字接口,用于从Android设备流式传输实时屏幕捕获数据。它旨在用作更大程序中的组件,因此仅凭其本身并不是非常有用。例如,它在STF中用于远程控制。
个人理解:Minicap是用C++以jni的方式运行在Android手机里的一个应用程序。至少在Android 10以下还是难逢对手的。
编译过程
1. 首先先下载minicap
openstf/minicap: Stream real-time screen capture data out of Android devices. (github.com)
git clone https://github.com/openstf/minicap.git
2. 下载jpeg-turbo库子模块
git submodule init
git submodule update
如果下载失败的话,可以到openstf的仓库下手动下载,并且将目录下的jni/vendor/ligjpeg-turbo复制到minicap/jni/vendor下
openstf/android-libjpeg-turbo: Standalone Android.mk configuration for libjpeg-turbo. (github.com)
3. 获取基础参数
adb shell getprop ro.product.cpu.abi
//arm64-v8a abi类型
adb shell getprop ro.build.version.sdk
//29 sdk版本
adb shell getprop ro.build.version.preview_sdk
//0
adb shell getprop ro.build.version.release
//10 android版本
adb shell wm size
//1080x1920
4. 使用系统自带的ndk进行编译
//根据上一步获取到的sdk版本来运行。
ndk-build.cmd APP_PLATFORM=android-29 PLATFORM_SDK_VERSION=29
//ndk-build.cmd具体指向了ndk文件夹里面防止该文件的路径
需要注意的是NDK的版本不能太低,比如使用NDK-R13,在编译arm64-v8a时就会出错
D:/minicap/jni/vendor/libjpeg-turbo/jni/vendor/libjpeg-turbo/libjpeg-turbo-1.4.1/simd/jsimd_arm64_neon.S:33:1: error: unknown directive .arch armv8-a+fp+simd ^ make: *** [obj/local/arm64-v8a/objs/jpeg-turbo/libjpeg-turbo-1.4.1/simd/jsimd_arm64_neon.o] Error 1
出现这个问题主要是因为旧版的NDK识别不出.arch的问题,这个问题只需要使用高版本的ndk就行。
5. 编译成功
编译成功后,在minicap/libs会出现几个目录arm64-v8a、armeabi-v7a、x86、x86_64,是与对应的系统相对应的。我们可以通过adb指令来获取需要操作的手机是哪一种
adb shell getprop ro.product.cpu.abi
//根据结果将对应的minicap防止到手机的临时文件夹,比如 //这边如果说sdk的版本>=16的话,就Push minicap,否则push minicap-nopie
//根据步骤3的abi版本把对应的minicap push到手机里
adb push minicap/libs/arm64-v8a/minicap /data/local/tmp
//这边的minicap需要minicap.so动态库,所以需要将minicap.so也一齐丢进去
adb push minicap/jni/minicap-shared/aosp/libs/android-29/arm64-v8a/minicap.so /data/local/tmp
//给minicap赋权
adb shell chmod 777 /data/local/tmp/minicap*
6. 运行minicap
//根据之前wm size的结果获取到分辨率
//测试是否可运行
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0 -t
//如果测试成功的话
adb shell LD_LIBRARY_PATH=/data/local/tmp /data/local/tmp/minicap -P 1080x1920@1080x1920/0
//其中,@前一个为真实窗口大小,后一个为希望映射的窗口大小
这时候,如果测试失败的话,可能是因为版本太高了,而官方的minicap只提供到abi 29,下面提供两个库可以直接替换掉minicap.so:
varundtsfi/Android12Support_withso: Android 12 support with minicap.so file. (github.com)
DeviceFarmer/minicap: Stream real-time screen capture data out of Android devices. (github.com)
结果展示
由于通过adb shell运行了minicap,这样minicap会在手机内部开启一个虚拟端口minicap,我们需要通过adb forward进行端口映射。
adb forward tcp:1717 localabstract:minicap
cd example
node app.js PORD=9002
打开浏览器localhost:9002就可以看到了手机