鴻蒙 Next 的 Hypium 投屏外掛原理剖析

甬力君發表於2025-03-18

最近一直在研究鴻蒙的投屏,之前研究了一番: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、以上可用於投屏、遠端真機等場景,歡迎技術交流,可關注微信公眾號:鼬測試

相關文章