鸿蒙 鸿蒙 Next 的 Hypium 投屏插件原理剖析

甬力君 · 2025年03月18日 · 201 次阅读

最近一直在研究鸿蒙的投屏,之前研究了一番:https://testerhome.com/topics/41418

后面发现 Hypium 时发现了一个好东西,具体如下:

1、推送一个 so 文件到手机目录/data/local/tmp/agent.so,名称类似:uitest_agent_v1.1.0.so,参考命令:

hdc file send uitest_agent_v1.1.0.so /data/local/tmp/agent.so

2、执行以下命令,加载 so,运行前先杀掉之前的进程(hdc shell kill -9 $(pidof uitest))

hdc shell uitest start-daemon singleness

此时会在手机内部开放一个 8012 端口的类似 jsonrpc(走 tcp socket)

3、使用端口转发到本地电脑:

hdc fport tcp:8012 tcp:8012

4、使用 socket 连接 8012

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('127.0.0.1', 8012))

5、先通过 jsonrpc 创建 driver 实例,参考以下代码:

request_id = datetime.now().strftime("%Y%m%d%H%M%S%f")
params = {
    "api": 'Driver.create',
    'this': 'Driver#0',
    "args": [],
    "message_type": "hypium"
}

msg = {
    "module": "com.ohos.devicetest.hypiumApiHelper",
    "method": "callHypiumApi",
    "params": params,
    "request_id": request_id
}

6、再发送开始截屏指令

request_id = datetime.now().strftime("%Y%m%d%H%M%S%f")
params = {
    "api": 'startCaptureScreen',
    "args": [
        {
            "scale": 0.5
        }
    ]
}

msg = {
    "module": "com.ohos.devicetest.hypiumApiHelper",
    "method": "Captures",
    "params": params,
    "request_id": request_id
}

7、以上指令发送完后就会不断收到 JPEG 字节流,自己按照 JPEG 开始结束标志解析显示就可以了
start_flag = b'\xff\xd8'
end_flag = b'\xff\xd9'

8、以上可用于投屏、远程真机等场景,欢迎技术交流,可关注微信公众号:鼬测试

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册