From 3ce918564d5d0cfdba6a081a65b6be00bf4fe996 Mon Sep 17 00:00:00 2001 From: render Date: Thu, 10 Sep 2026 16:07:11 +0800 Subject: [PATCH] feat(harmony): stream screens over HDC without a companion app Replace per-frame file capture with the unchanged official Hypium agent, bounded JPEG decoding, independent control RPC and scoped session cleanup. Remove the HAP build and account-signing experiment. All 85 automated checks pass; moving-screen performance and integrated phone input remain unverified because the USB device went offline. Keep published 0.3.2 artifacts unchanged. --- .gitignore | 3 + curios/harmony-connector/build.mjs | 18 + curios/harmony-connector/companion/.gitignore | 22 - .../companion/AppScope/app.json5 | 10 - .../resources/base/element/string.json | 8 - .../resources/base/media/background.png | Bin 65 -> 0 bytes .../resources/base/media/foreground.png | Bin 65 -> 0 bytes .../resources/base/media/layered_image.json | 7 - .../companion/build-profile.template.json5 | 41 -- .../companion/code-linter.json5 | 32 -- .../companion/entry/.gitignore | 6 - .../companion/entry/build-profile.json5 | 38 -- .../companion/entry/hvigorfile.ts | 7 - .../companion/entry/obfuscation-rules.txt | 20 - .../companion/entry/oh-package-lock.json5 | 19 - .../companion/entry/oh-package.json5 | 10 - .../entry/src/main/cpp/CMakeLists.txt | 8 - .../companion/entry/src/main/cpp/stream.cpp | 354 ------------- .../cpp/types/libharmony_stream/index.d.ts | 9 - .../types/libharmony_stream/oh-package.json5 | 5 - .../main/ets/entryability/EntryAbility.ets | 32 -- .../entry/src/main/ets/pages/Index.ets | 128 ----- .../companion/entry/src/main/module.json5 | 47 -- .../main/resources/base/element/color.json | 8 - .../main/resources/base/element/float.json | 8 - .../main/resources/base/element/string.json | 16 - .../main/resources/base/media/background.png | Bin 65 -> 0 bytes .../main/resources/base/media/foreground.png | Bin 65 -> 0 bytes .../resources/base/media/layered_image.json | 7 - .../main/resources/base/media/startIcon.png | Bin 65 -> 0 bytes .../resources/base/profile/main_pages.json | 5 - .../main/resources/dark/element/color.json | 8 - .../companion/hvigor/hvigor-config.json5 | 23 - .../harmony-connector/companion/hvigorfile.ts | 7 - .../companion/legal/NOTICE.md | 17 - .../companion/oh-package.json5 | 6 - curios/harmony-connector/legal/THIRD-PARTY.md | 8 + .../native/src/diagnostics.rs | 48 +- curios/harmony-connector/native/src/hdc.rs | 10 +- .../native/src/hdc/screen.rs | 193 +++---- .../native/src/hdc/screen_agent.rs | 493 ++++++++++++++++++ .../native/src/hdc/screen_input.rs | 29 ++ .../native/src/hdc/screen_protocol.rs | 243 +++++++++ .../native/src/hdc/screen_tests.rs | 123 ++++- curios/harmony-connector/native/src/main.rs | 5 +- .../native/tests/hypium_device.py | 102 ++++ curios/harmony-connector/ui/screen.js | 103 ++-- docs/harmony-connector.md | 6 +- docs/harmony-realtime-development.md | 86 +-- docs/research/harmony-hdc-only-screen.md | 149 ++++++ docs/research/harmony-realtime-stream.md | 6 +- tools/harmony-stream.py | 233 --------- tools/harmony-stream.test.py | 87 ---- tools/harmony-ui.test.mjs | 68 ++- .../harmony-connector/hypium/LICENSE | 25 - .../harmony-connector/hypium/provenance.json | 10 + .../hypium/uitest_agent_v1.2.2.so | Bin 0 -> 600245 bytes 57 files changed, 1432 insertions(+), 1524 deletions(-) delete mode 100644 curios/harmony-connector/companion/.gitignore delete mode 100644 curios/harmony-connector/companion/AppScope/app.json5 delete mode 100644 curios/harmony-connector/companion/AppScope/resources/base/element/string.json delete mode 100644 curios/harmony-connector/companion/AppScope/resources/base/media/background.png delete mode 100644 curios/harmony-connector/companion/AppScope/resources/base/media/foreground.png delete mode 100644 curios/harmony-connector/companion/AppScope/resources/base/media/layered_image.json delete mode 100644 curios/harmony-connector/companion/build-profile.template.json5 delete mode 100644 curios/harmony-connector/companion/code-linter.json5 delete mode 100644 curios/harmony-connector/companion/entry/.gitignore delete mode 100644 curios/harmony-connector/companion/entry/build-profile.json5 delete mode 100644 curios/harmony-connector/companion/entry/hvigorfile.ts delete mode 100644 curios/harmony-connector/companion/entry/obfuscation-rules.txt delete mode 100644 curios/harmony-connector/companion/entry/oh-package-lock.json5 delete mode 100644 curios/harmony-connector/companion/entry/oh-package.json5 delete mode 100644 curios/harmony-connector/companion/entry/src/main/cpp/CMakeLists.txt delete mode 100644 curios/harmony-connector/companion/entry/src/main/cpp/stream.cpp delete mode 100644 curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/index.d.ts delete mode 100644 curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/oh-package.json5 delete mode 100644 curios/harmony-connector/companion/entry/src/main/ets/entryability/EntryAbility.ets delete mode 100644 curios/harmony-connector/companion/entry/src/main/ets/pages/Index.ets delete mode 100644 curios/harmony-connector/companion/entry/src/main/module.json5 delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/element/color.json delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/element/float.json delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/element/string.json delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/media/background.png delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/media/foreground.png delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/media/layered_image.json delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/media/startIcon.png delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/base/profile/main_pages.json delete mode 100644 curios/harmony-connector/companion/entry/src/main/resources/dark/element/color.json delete mode 100644 curios/harmony-connector/companion/hvigor/hvigor-config.json5 delete mode 100644 curios/harmony-connector/companion/hvigorfile.ts delete mode 100644 curios/harmony-connector/companion/legal/NOTICE.md delete mode 100644 curios/harmony-connector/companion/oh-package.json5 create mode 100644 curios/harmony-connector/native/src/hdc/screen_agent.rs create mode 100644 curios/harmony-connector/native/src/hdc/screen_protocol.rs create mode 100644 curios/harmony-connector/native/tests/hypium_device.py create mode 100644 docs/research/harmony-hdc-only-screen.md delete mode 100644 tools/harmony-stream.py delete mode 100644 tools/harmony-stream.test.py rename curios/harmony-connector/companion/legal/Apache-2.0.txt => vendor/harmony-connector/hypium/LICENSE (89%) create mode 100644 vendor/harmony-connector/hypium/provenance.json create mode 100644 vendor/harmony-connector/hypium/uitest_agent_v1.2.2.so diff --git a/.gitignore b/.gitignore index c26ba5a..e7c9ba2 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,6 @@ target/ /curios/harmony-connector/legal/*-COPYING /curios/harmony-connector/legal/build.mjs /curios/harmony-connector/legal/rust/ +/curios/harmony-connector/legal/hypium/ +# Keep local credentials from the retired companion experiment private. +/curios/harmony-connector/companion/ diff --git a/curios/harmony-connector/build.mjs b/curios/harmony-connector/build.mjs index 1ba4dcb..6bba945 100644 --- a/curios/harmony-connector/build.mjs +++ b/curios/harmony-connector/build.mjs @@ -94,6 +94,24 @@ for (const source of sources) { await copyFile(patchFile, path.join(plugin, "legal/sources", source.patch)); } if (process.argv.includes("--dependencies-only")) process.exit(0); +const agentDirectory = path.join(root, "vendor/harmony-connector/hypium"); +const agentProvenance = JSON.parse( + await readFile(path.join(agentDirectory, "provenance.json"), "utf8"), +); +const agentBytes = await readFile( + path.join(agentDirectory, "uitest_agent_v1.2.2.so"), +); +if ( + createHash("sha256").update(agentBytes).digest("hex") !== + agentProvenance.sha256 +) + throw new Error("Hypium device agent checksum mismatch"); +await mkdir(path.join(plugin, "legal/hypium"), { recursive: true }); +for (const name of ["LICENSE", "provenance.json"]) + await copyFile( + path.join(agentDirectory, name), + path.join(plugin, "legal/hypium", name), + ); run( "cargo", ["build", "--release", "--locked", "--manifest-path", "native/Cargo.toml"], diff --git a/curios/harmony-connector/companion/.gitignore b/curios/harmony-connector/companion/.gitignore deleted file mode 100644 index ab6f752..0000000 --- a/curios/harmony-connector/companion/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -/node_modules -/oh_modules -/local.properties -/.idea -**/build -/.hvigor -.cxx -/.clangd -/.clang-format -/.clang-tidy -**/.test -/.appanalyzer -# Local signing configuration and credentials -/build-profile.json5 -/signing/ -/material/ -*.p12 -*.p7b -*.cer -*.csr -*.pem -*.key diff --git a/curios/harmony-connector/companion/AppScope/app.json5 b/curios/harmony-connector/companion/AppScope/app.json5 deleted file mode 100644 index 3fc5fb5..0000000 --- a/curios/harmony-connector/companion/AppScope/app.json5 +++ /dev/null @@ -1,10 +0,0 @@ -{ - "app": { - "bundleName": "ink.render.trove.harmonyconnector", - "vendor": "Trove", - "versionCode": 1, - "versionName": "0.1.0", - "icon": "$media:layered_image", - "label": "$string:app_name" - } -} diff --git a/curios/harmony-connector/companion/AppScope/resources/base/element/string.json b/curios/harmony-connector/companion/AppScope/resources/base/element/string.json deleted file mode 100644 index bdd890c..0000000 --- a/curios/harmony-connector/companion/AppScope/resources/base/element/string.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "string": [ - { - "name": "app_name", - "value": "Harmony Connector" - } - ] -} diff --git a/curios/harmony-connector/companion/AppScope/resources/base/media/background.png b/curios/harmony-connector/companion/AppScope/resources/base/media/background.png deleted file mode 100644 index e129e5a0482cfef05a14fefd4db63bf7feadea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Asp9}fBgUdpMmus(?6gX NgQu&X%Q~loCIF_N5PSdt diff --git a/curios/harmony-connector/companion/AppScope/resources/base/media/foreground.png b/curios/harmony-connector/companion/AppScope/resources/base/media/foreground.png deleted file mode 100644 index e129e5a0482cfef05a14fefd4db63bf7feadea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Asp9}fBgUdpMmus(?6gX NgQu&X%Q~loCIF_N5PSdt diff --git a/curios/harmony-connector/companion/AppScope/resources/base/media/layered_image.json b/curios/harmony-connector/companion/AppScope/resources/base/media/layered_image.json deleted file mode 100644 index fb49920..0000000 --- a/curios/harmony-connector/companion/AppScope/resources/base/media/layered_image.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "layered-image": - { - "background" : "$media:background", - "foreground" : "$media:foreground" - } -} \ No newline at end of file diff --git a/curios/harmony-connector/companion/build-profile.template.json5 b/curios/harmony-connector/companion/build-profile.template.json5 deleted file mode 100644 index ff7128a..0000000 --- a/curios/harmony-connector/companion/build-profile.template.json5 +++ /dev/null @@ -1,41 +0,0 @@ -{ - "app": { - "signingConfigs": [], - "products": [ - { - "name": "default", - "targetSdkVersion": "26.0.0", - "compatibleSdkVersion": "5.0.5(17)", - "runtimeOS": "HarmonyOS", - "buildOption": { - "strictMode": { - "caseSensitiveCheck": true, - "useNormalizedOHMUrl": true - } - } - } - ], - "buildModeSet": [ - { - "name": "debug" - }, - { - "name": "release" - } - ] - }, - "modules": [ - { - "name": "entry", - "srcPath": "./entry", - "targets": [ - { - "name": "default", - "applyToProducts": [ - "default" - ] - } - ] - } - ] -} diff --git a/curios/harmony-connector/companion/code-linter.json5 b/curios/harmony-connector/companion/code-linter.json5 deleted file mode 100644 index 073990f..0000000 --- a/curios/harmony-connector/companion/code-linter.json5 +++ /dev/null @@ -1,32 +0,0 @@ -{ - "files": [ - "**/*.ets" - ], - "ignore": [ - "**/src/ohosTest/**/*", - "**/src/test/**/*", - "**/src/mock/**/*", - "**/node_modules/**/*", - "**/oh_modules/**/*", - "**/build/**/*", - "**/.preview/**/*" - ], - "ruleSet": [ - "plugin:@performance/recommended", - "plugin:@typescript-eslint/recommended" - ], - "rules": { - "@security/no-unsafe-aes": "error", - "@security/no-unsafe-hash": "error", - "@security/no-unsafe-mac": "warn", - "@security/no-unsafe-dh": "error", - "@security/no-unsafe-dsa": "error", - "@security/no-unsafe-ecdsa": "error", - "@security/no-unsafe-rsa-encrypt": "error", - "@security/no-unsafe-rsa-sign": "error", - "@security/no-unsafe-rsa-key": "error", - "@security/no-unsafe-dsa-key": "error", - "@security/no-unsafe-dh-key": "error", - "@security/no-unsafe-3des": "error" - } -} \ No newline at end of file diff --git a/curios/harmony-connector/companion/entry/.gitignore b/curios/harmony-connector/companion/entry/.gitignore deleted file mode 100644 index e2713a2..0000000 --- a/curios/harmony-connector/companion/entry/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -/node_modules -/oh_modules -/.preview -/build -/.cxx -/.test \ No newline at end of file diff --git a/curios/harmony-connector/companion/entry/build-profile.json5 b/curios/harmony-connector/companion/entry/build-profile.json5 deleted file mode 100644 index 65845b1..0000000 --- a/curios/harmony-connector/companion/entry/build-profile.json5 +++ /dev/null @@ -1,38 +0,0 @@ -{ - "apiType": "stageMode", - "buildOption": { - "resOptions": { - "copyCodeResource": { - "enable": false - } - }, - "externalNativeOptions": { - "path": "./src/main/cpp/CMakeLists.txt", - "arguments": "", - "cppFlags": "", - "abiFilters": [ - "arm64-v8a" - ] - } - }, - "buildOptionSet": [ - { - "name": "release", - "arkOptions": { - "obfuscation": { - "ruleOptions": { - "enable": false, - "files": [ - "./obfuscation-rules.txt" - ] - } - } - } - } - ], - "targets": [ - { - "name": "default" - } - ] -} diff --git a/curios/harmony-connector/companion/entry/hvigorfile.ts b/curios/harmony-connector/companion/entry/hvigorfile.ts deleted file mode 100644 index 52c2861..0000000 --- a/curios/harmony-connector/companion/entry/hvigorfile.ts +++ /dev/null @@ -1,7 +0,0 @@ -// @ts-nocheck – Template file, only used when copied into a project directory -import { hapTasks } from '@ohos/hvigor-ohos-plugin'; - -export default { - system: hapTasks /* Built-in plugin of Hvigor. It cannot be modified. */, - plugins: [] /* Custom plugin to extend the functionality of Hvigor. */, -}; diff --git a/curios/harmony-connector/companion/entry/obfuscation-rules.txt b/curios/harmony-connector/companion/entry/obfuscation-rules.txt deleted file mode 100644 index ded9d40..0000000 --- a/curios/harmony-connector/companion/entry/obfuscation-rules.txt +++ /dev/null @@ -1,20 +0,0 @@ -# Define project specific obfuscation rules here. -# You can include the obfuscation configuration files in the current module's build-profile.json5. - -# Obfuscation options: -# -disable-obfuscation: disable all obfuscations -# -enable-property-obfuscation: obfuscate the property names -# -enable-toplevel-obfuscation: obfuscate the names in the global scope -# -compact: remove unnecessary blank spaces and all line feeds -# -remove-log: remove all console.* statements -# -print-namecache: print the name cache that contains the mapping from the old names to new names -# -apply-namecache: reuse the given cache file - -# Keep options: -# -keep-property-name: specifies property names that you want to keep -# -keep-global-name: specifies names that you want to keep in the global scope - --enable-property-obfuscation --enable-toplevel-obfuscation --enable-filename-obfuscation --enable-export-obfuscation \ No newline at end of file diff --git a/curios/harmony-connector/companion/entry/oh-package-lock.json5 b/curios/harmony-connector/companion/entry/oh-package-lock.json5 deleted file mode 100644 index efe2f1c..0000000 --- a/curios/harmony-connector/companion/entry/oh-package-lock.json5 +++ /dev/null @@ -1,19 +0,0 @@ -{ - "meta": { - "stableOrder": true, - "enableUnifiedLockfile": false - }, - "lockfileVersion": 3, - "ATTENTION": "THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.", - "specifiers": { - "libharmony_stream.so@src/main/cpp/types/libharmony_stream": "libharmony_stream.so@src/main/cpp/types/libharmony_stream" - }, - "packages": { - "libharmony_stream.so@src/main/cpp/types/libharmony_stream": { - "name": "libharmony_stream.so", - "version": "0.1.0", - "resolved": "src/main/cpp/types/libharmony_stream", - "registryType": "local" - } - } -} \ No newline at end of file diff --git a/curios/harmony-connector/companion/entry/oh-package.json5 b/curios/harmony-connector/companion/entry/oh-package.json5 deleted file mode 100644 index dbf40ee..0000000 --- a/curios/harmony-connector/companion/entry/oh-package.json5 +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "entry", - "version": "1.0.0", - "description": "System-authorized H.264 screen sharing", - "main": "", - "author": "Trove", - "dependencies": { - "libharmony_stream.so": "file:./src/main/cpp/types/libharmony_stream" - } -} diff --git a/curios/harmony-connector/companion/entry/src/main/cpp/CMakeLists.txt b/curios/harmony-connector/companion/entry/src/main/cpp/CMakeLists.txt deleted file mode 100644 index e0beb1e..0000000 --- a/curios/harmony-connector/companion/entry/src/main/cpp/CMakeLists.txt +++ /dev/null @@ -1,8 +0,0 @@ -cmake_minimum_required(VERSION 3.5.0) -project(harmony_stream) -set(CMAKE_CXX_STANDARD 17) -add_library(harmony_stream SHARED stream.cpp) -target_compile_options(harmony_stream PRIVATE -Wall -Wextra) -target_link_libraries(harmony_stream PUBLIC libace_napi.z.so - libnative_avscreen_capture.so libnative_media_venc.so - libnative_media_codecbase.so libnative_media_core.so libnative_window.so) diff --git a/curios/harmony-connector/companion/entry/src/main/cpp/stream.cpp b/curios/harmony-connector/companion/entry/src/main/cpp/stream.cpp deleted file mode 100644 index 5804d6b..0000000 --- a/curios/harmony-connector/companion/entry/src/main/cpp/stream.cpp +++ /dev/null @@ -1,354 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace { -using Clock = std::chrono::steady_clock; -constexpr size_t MAX_PACKET = 2 * 1024 * 1024; -constexpr size_t MAX_QUEUE = 4 * 1024 * 1024; -constexpr int FPS = 30; - -struct Packet { - std::vector data; - uint32_t flags; - int64_t pts; -}; - -void put32(std::vector &out, uint32_t value) -{ - for (int shift = 24; shift >= 0; shift -= 8) out.push_back(value >> shift); -} - -// One worker owns all media resources and sockets. Callbacks only copy into a -// bounded queue; slow consumers terminate the session instead of accumulating delay. -class Stream { -public: - ~Stream() { stop(); } - void start(int width, int height, int port, std::string token) - { - stop(); - cancelled = false; - activated = false; - frames = 0; - bytes = 0; - { - std::lock_guard lock(mutex); - error.clear(); - state = "waiting"; - packets.clear(); - queuedBytes = 0; - } - worker = std::thread([=] { run(width, height, port, token); }); - } - void stop() - { - cancelled = true; - if (worker.joinable()) worker.join(); - } - napi_value status(napi_env env) - { - std::lock_guard lock(mutex); - napi_value result, value; - napi_create_object(env, &result); - for (auto item : {std::make_pair("state", state), std::make_pair("error", error)}) { - napi_create_string_utf8(env, item.second.c_str(), NAPI_AUTO_LENGTH, &value); - napi_set_named_property(env, result, item.first, value); - } - napi_create_double(env, static_cast(frames.load()), &value); - napi_set_named_property(env, result, "frames", value); - napi_create_double(env, static_cast(bytes.load()), &value); - napi_set_named_property(env, result, "bytes", value); - return result; - } - -private: - std::atomic cancelled{true}; - std::atomic activated{false}; - std::atomic frames{0}, bytes{0}; - std::mutex mutex; - std::thread worker; - std::string state = "stopped", error; - std::deque packets; - size_t queuedBytes = 0; - - void fail(const std::string &message) - { - std::lock_guard lock(mutex); - if (error.empty()) error = message; - cancelled = true; - } - bool check(int code, const char *operation) - { - if (!code) return true; - fail(std::string(operation) + " (" + std::to_string(code) + ")"); - return false; - } - static void captureState(OH_AVScreenCapture *, OH_AVScreenCaptureStateCode code, void *context) - { - auto &self = *static_cast(context); - if (code == OH_SCREEN_CAPTURE_STATE_STARTED) { - self.activated = true; - std::lock_guard lock(self.mutex); - self.state = "sharing"; - } else if (code == OH_SCREEN_CAPTURE_STATE_CANCELED) { - self.fail("手机未同意共享屏幕。"); - } else if (code == OH_SCREEN_CAPTURE_STATE_STOPPED_BY_USER || - code == OH_SCREEN_CAPTURE_STATE_INTERRUPTED_BY_OTHER || - code == OH_SCREEN_CAPTURE_STATE_STOPPED_BY_CALL || - code == OH_SCREEN_CAPTURE_STATE_STOPPED_BY_USER_SWITCHES) { - self.cancelled = true; - } - // Private scenes remain masked by the system; never substitute an old frame. - } - static void captureError(OH_AVScreenCapture *, int32_t code, void *context) - { - static_cast(context)->fail("Screen capture error (" + std::to_string(code) + ")"); - } - static void encoderError(OH_AVCodec *, int32_t code, void *context) - { - static_cast(context)->fail("Video encoder error (" + std::to_string(code) + ")"); - } - static void output(OH_AVCodec *encoder, uint32_t index, OH_AVBuffer *buffer, void *context) - { - auto &self = *static_cast(context); - OH_AVCodecBufferAttr attr{}; - const auto capacity = OH_AVBuffer_GetCapacity(buffer); - auto *data = OH_AVBuffer_GetAddr(buffer); - if (OH_AVBuffer_GetBufferAttr(buffer, &attr) != AV_ERR_OK || attr.offset < 0 || - attr.size < 0 || attr.size > static_cast(MAX_PACKET) || - static_cast(attr.offset) + attr.size > capacity || (!data && attr.size)) { - self.fail("编码器返回无效数据。"); - } else if (attr.size && !self.cancelled) { - Packet packet{{data + attr.offset, data + attr.offset + attr.size}, attr.flags, attr.pts}; - std::lock_guard lock(self.mutex); - if (self.packets.size() >= 6 || self.queuedBytes + packet.data.size() > MAX_QUEUE) { - self.error = "Mac 接收速度不足,共享已停止,请重新连接。"; - self.cancelled = true; - } else { - self.queuedBytes += packet.data.size(); - self.packets.push_back(std::move(packet)); - } - } - self.check(OH_VideoEncoder_FreeOutputBuffer(encoder, index), "release encoded buffer"); - } - bool io(int socket, uint8_t *data, size_t size, bool sendData, int timeoutMs) - { - auto deadline = Clock::now() + std::chrono::milliseconds(timeoutMs); - while (size && !cancelled && Clock::now() < deadline) { - pollfd p{socket, static_cast(sendData ? POLLOUT : POLLIN), 0}; - int ready = poll(&p, 1, 50); - if (ready < 0 && errno == EINTR) continue; - if (ready < 0 || (ready && (p.revents & (POLLERR | POLLHUP | POLLNVAL)))) return false; - if (!ready) continue; - auto count = sendData ? send(socket, data, size, MSG_NOSIGNAL | MSG_DONTWAIT) - : recv(socket, data, size, MSG_DONTWAIT); - if (count < 0 && (errno == EINTR || errno == EAGAIN)) continue; - if (count <= 0) return false; - size -= count; - data += count; - } - return size == 0; - } - bool setup(OH_AVCodec *encoder, OH_AVScreenCapture *capture, OHNativeWindow **surface, int width, int height) - { - OH_AVCodecCallback callbacks{encoderError, [](OH_AVCodec *, OH_AVFormat *, void *) {}, - [](OH_AVCodec *, uint32_t, OH_AVBuffer *, void *) {}, output}; - if (!check(OH_VideoEncoder_RegisterCallback(encoder, callbacks, this), "encoder callbacks")) return false; - auto *format = OH_AVFormat_Create(); - if (!format) { fail("无法创建视频配置。"); return false; } - OH_AVFormat_SetIntValue(format, OH_MD_KEY_WIDTH, width); - OH_AVFormat_SetIntValue(format, OH_MD_KEY_HEIGHT, height); - OH_AVFormat_SetIntValue(format, OH_MD_KEY_PIXEL_FORMAT, AV_PIXEL_FORMAT_SURFACE_FORMAT); - OH_AVFormat_SetDoubleValue(format, OH_MD_KEY_FRAME_RATE, FPS); - OH_AVFormat_SetLongValue(format, OH_MD_KEY_BITRATE, 4000000); - OH_AVFormat_SetIntValue(format, OH_MD_KEY_VIDEO_ENCODE_BITRATE_MODE, BITRATE_MODE_CBR); - OH_AVFormat_SetIntValue(format, OH_MD_KEY_PROFILE, AVC_PROFILE_BASELINE); - OH_AVFormat_SetIntValue(format, OH_MD_KEY_I_FRAME_INTERVAL, 1000); - const int configured = OH_VideoEncoder_Configure(encoder, format); - OH_AVFormat_Destroy(format); - if (!check(configured, "configure encoder") || - !check(OH_VideoEncoder_GetSurface(encoder, surface), "encoder surface") || - !check(OH_VideoEncoder_Prepare(encoder), "prepare encoder") || - !check(OH_VideoEncoder_Start(encoder), "start encoder")) return false; - OH_AVScreenCaptureConfig config{}; - config.captureMode = OH_CAPTURE_HOME_SCREEN; - config.dataType = OH_ORIGINAL_STREAM; - config.videoInfo.videoCapInfo.videoSource = OH_VIDEO_SOURCE_SURFACE_RGBA; - config.videoInfo.videoCapInfo.videoFrameWidth = width; - config.videoInfo.videoCapInfo.videoFrameHeight = height; - return check(OH_AVScreenCapture_SetStateCallback(capture, captureState, this), "capture state") && - check(OH_AVScreenCapture_SetErrorCallback(capture, captureError, this), "capture errors") && - check(OH_AVScreenCapture_SetMicrophoneEnabled(capture, false), "disable microphone") && - check(OH_AVScreenCapture_Init(capture, config), "initialize capture") && - check(OH_AVScreenCapture_StartScreenCaptureWithSurface(capture, *surface), "request screen sharing"); - } - void run(int displayWidth, int displayHeight, int port, const std::string &token) - { - int listener = socket(AF_INET, SOCK_STREAM | SOCK_CLOEXEC, 0), client = -1; - OH_AVCodec *encoder = nullptr; - OH_AVScreenCapture *capture = nullptr; - OHNativeWindow *surface = nullptr; - bool mediaStarted = false; - auto perform = [&] { - sockaddr_in address{}; - address.sin_family = AF_INET; - address.sin_addr.s_addr = htonl(INADDR_LOOPBACK); - address.sin_port = htons(port); - if (listener < 0 || bind(listener, reinterpret_cast(&address), sizeof(address)) || - listen(listener, 1)) { fail("无法建立共享连接,请在 Mac 重新开始。"); return; } - auto deadline = Clock::now() + std::chrono::seconds(45); - while (!cancelled && Clock::now() < deadline) { - pollfd p{listener, POLLIN, 0}; - if (poll(&p, 1, 100) <= 0) continue; - client = accept(listener, nullptr, nullptr); - if (client < 0) continue; - std::vector auth(64); - if (io(client, auth.data(), auth.size(), false, 2000) && - std::equal(auth.begin(), auth.end(), token.begin())) break; - close(client); - client = -1; - } - if (client < 0 || cancelled) { if (!cancelled) fail("Mac 连接超时,请重新开始。"); return; } - close(listener); - listener = -1; - const int noDelay = 1; - setsockopt(client, IPPROTO_TCP, TCP_NODELAY, &noDelay, sizeof(noDelay)); - auto *capability = OH_AVCodec_GetCapabilityByCategory(OH_AVCODEC_MIMETYPE_VIDEO_AVC, true, HARDWARE); - if (!capability) { fail("设备没有可用的 H.264 硬件编码器。"); return; } - int32_t widthAlignment = 0, heightAlignment = 0; - if (!check(OH_AVCapability_GetVideoWidthAlignment(capability, &widthAlignment), "width alignment") || - !check(OH_AVCapability_GetVideoHeightAlignment(capability, &heightAlignment), "height alignment")) return; - if (widthAlignment < 1 || heightAlignment < 1 || widthAlignment > 1280 || heightAlignment > 1280) { - fail("编码器返回不支持的画面尺寸约束。"); return; - } - widthAlignment = std::lcm(widthAlignment, 2); - heightAlignment = std::lcm(heightAlignment, 2); - const double scale = std::min(1.0, 1280.0 / std::max(displayWidth, displayHeight)); - const int width = static_cast(displayWidth * scale) / widthAlignment * widthAlignment; - const int height = static_cast(displayHeight * scale) / heightAlignment * heightAlignment; - if (width < 2 || height < 2 || !OH_AVCapability_IsVideoSizeSupported(capability, width, height)) { - fail("硬件编码器不支持当前屏幕尺寸。"); return; - } - std::vector hello{'H', 'C', 'S', '1'}; - for (auto value : {width, height, displayWidth, displayHeight, FPS}) put32(hello, value); - if (!io(client, hello.data(), hello.size(), true, 500)) return; - const char *encoderName = OH_AVCapability_GetName(capability); - if (!encoderName) { fail("设备未返回硬件编码器名称。"); return; } - encoder = OH_VideoEncoder_CreateByName(encoderName); - capture = OH_AVScreenCapture_Create(); - if (!encoder || !capture) { fail("设备无法创建录屏编码器。"); return; } - { std::lock_guard lock(mutex); state = "authorizing"; } - mediaStarted = setup(encoder, capture, &surface, width, height); - if (!mediaStarted) return; - auto lastFrame = Clock::now(); - while (!cancelled) { - if (activated.exchange(false) && - !check(OH_AVScreenCapture_SetMaxVideoFrameRate(capture, FPS), "frame rate")) break; - // Closing the host socket or sending 0 always stops capture. - uint8_t command; - const auto count = recv(client, &command, 1, MSG_DONTWAIT); - if (count == 0 || (count > 0 && command == 0)) break; - if (count < 0 && errno != EAGAIN && errno != EINTR) break; - Packet packet; - { - std::lock_guard lock(mutex); - if (!packets.empty()) { - packet = std::move(packets.front()); - packets.pop_front(); - queuedBytes -= packet.data.size(); - } - } - if (packet.data.empty()) { - if (Clock::now() - lastFrame > std::chrono::seconds(45)) { - fail("未收到视频画面,请确认手机上的共享授权。"); break; - } - std::this_thread::sleep_for(std::chrono::milliseconds(2)); - continue; - } - std::vector header; - put32(header, packet.data.size()); - put32(header, packet.flags); - put32(header, static_cast(packet.pts) >> 32); - put32(header, static_cast(packet.pts)); - if (!io(client, header.data(), header.size(), true, 500) || - !io(client, packet.data.data(), packet.data.size(), true, 500)) break; - bytes += packet.data.size(); - if (!(packet.flags & AVCODEC_BUFFER_FLAGS_CODEC_DATA)) frames++; - lastFrame = Clock::now(); - } - }; - perform(); - cancelled = true; - if (capture) { - if (mediaStarted) OH_AVScreenCapture_StopScreenCapture(capture); - OH_AVScreenCapture_Release(capture); - } - if (encoder) { - if (mediaStarted) OH_VideoEncoder_NotifyEndOfStream(encoder); - OH_VideoEncoder_Stop(encoder); - OH_VideoEncoder_Destroy(encoder); - } - if (surface) OH_NativeWindow_DestroyNativeWindow(surface); - if (client >= 0) close(client); - if (listener >= 0) close(listener); - std::lock_guard lock(mutex); - packets.clear(); - queuedBytes = 0; - state = "stopped"; - } -}; - -Stream stream; -napi_value Start(napi_env env, napi_callback_info info) -{ - size_t argc = 4; - napi_value args[4]; - napi_get_cb_info(env, info, &argc, args, nullptr, nullptr); - int32_t width = 0, height = 0, port = 0; - char token[65]{}; - size_t length = 0; - bool valid = argc == 4 && napi_get_value_int32(env, args[0], &width) == napi_ok && - napi_get_value_int32(env, args[1], &height) == napi_ok && - napi_get_value_int32(env, args[2], &port) == napi_ok && - napi_get_value_string_utf8(env, args[3], nullptr, 0, &length) == napi_ok && length == 64 && - napi_get_value_string_utf8(env, args[3], token, sizeof(token), &length) == napi_ok && - width >= 2 && height >= 2 && width <= 8192 && height <= 8192 && port >= 1024 && port <= 65535 && - std::all_of(token, token + 64, [](char c) { return (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f'); }); - if (!valid) { napi_throw_error(env, "invalid_config", "请从 Mac 的 Harmony Connector 开始投屏。"); return nullptr; } - stream.start(width, height, port, std::string(token, 64)); - return nullptr; -} -napi_value Stop(napi_env, napi_callback_info) { stream.stop(); return nullptr; } -napi_value Status(napi_env env, napi_callback_info) { return stream.status(env); } -napi_value Init(napi_env env, napi_value exports) -{ - napi_property_descriptor methods[] = { - {"start", nullptr, Start, nullptr, nullptr, nullptr, napi_default, nullptr}, - {"stop", nullptr, Stop, nullptr, nullptr, nullptr, napi_default, nullptr}, - {"status", nullptr, Status, nullptr, nullptr, nullptr, napi_default, nullptr} - }; - napi_define_properties(env, exports, 3, methods); - napi_add_env_cleanup_hook(env, [](void *) { stream.stop(); }, nullptr); - return exports; -} -napi_module module = {1, 0, nullptr, Init, "harmony_stream", nullptr, {0}}; -__attribute__((constructor)) void Register() { napi_module_register(&module); } -} // namespace diff --git a/curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/index.d.ts b/curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/index.d.ts deleted file mode 100644 index 613c3df..0000000 --- a/curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface StreamStatus { - state: string; - error: string; - frames: number; - bytes: number; -} -export const start: (width: number, height: number, port: number, token: string) => void; -export const stop: () => void; -export const status: () => StreamStatus; diff --git a/curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/oh-package.json5 b/curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/oh-package.json5 deleted file mode 100644 index 03734e4..0000000 --- a/curios/harmony-connector/companion/entry/src/main/cpp/types/libharmony_stream/oh-package.json5 +++ /dev/null @@ -1,5 +0,0 @@ -{ - "name": "libharmony_stream.so", - "version": "0.1.0", - "types": "./index.d.ts" -} diff --git a/curios/harmony-connector/companion/entry/src/main/ets/entryability/EntryAbility.ets b/curios/harmony-connector/companion/entry/src/main/ets/entryability/EntryAbility.ets deleted file mode 100644 index 3948288..0000000 --- a/curios/harmony-connector/companion/entry/src/main/ets/entryability/EntryAbility.ets +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2026 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for details. - * Modified for Harmony Connector by Trove. - */ -import { UIAbility, Want } from '@kit.AbilityKit'; -import { window } from '@kit.ArkUI'; -import stream from 'libharmony_stream.so'; - -export default class EntryAbility extends UIAbility { - private configure(want: Want): void { - const token = want.parameters?.['token']; - const port = want.parameters?.['port']; - if (typeof token === 'string' && typeof port === 'number' && - /^[a-f0-9]{64}$/.test(token) && port >= 1024 && port <= 65535) { - stream.stop(); - AppStorage.setOrCreate('streamToken', token); - AppStorage.setOrCreate('streamPort', port); - } - } - onCreate(want: Want): void { this.configure(want); } - onNewWant(want: Want): void { this.configure(want); } - onWindowStageCreate(stage: window.WindowStage): void { - stage.loadContent('pages/Index').catch(() => { stream.stop(); }); - } - onDestroy(): void { stream.stop(); } -} diff --git a/curios/harmony-connector/companion/entry/src/main/ets/pages/Index.ets b/curios/harmony-connector/companion/entry/src/main/ets/pages/Index.ets deleted file mode 100644 index 8014c17..0000000 --- a/curios/harmony-connector/companion/entry/src/main/ets/pages/Index.ets +++ /dev/null @@ -1,128 +0,0 @@ -/* - * Copyright (c) 2026 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 - * Unless required by applicable law or agreed to in writing, software distributed - * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR - * CONDITIONS OF ANY KIND, either express or implied. See the License for details. - * Modified for Harmony Connector by Trove. - */ -import { common, wantAgent } from '@kit.AbilityKit'; -import { display } from '@kit.ArkUI'; -import { backgroundTaskManager } from '@kit.BackgroundTasksKit'; -import stream from 'libharmony_stream.so'; - -@Entry -@Component -struct Index { - @StorageLink('streamToken') token: string = ''; - @StorageLink('streamPort') port: number = 0; - @State active: boolean = false; - @State message: string = '在 Mac 上连接手机并开始投屏。'; - @State stats: string = ''; - private timer: number = 0; - private backgroundRunning: boolean = false; - private keeping: boolean = false; - private generation: number = 0; - private displayWidth: number = 0; - private displayHeight: number = 0; - private previousFrames: number = 0; - private previousBytes: number = 0; - private previousTime: number = 0; - - private context(): common.UIAbilityContext { - return this.getUIContext().getHostContext() as common.UIAbilityContext; - } - private async keepRunning(): Promise { - if (this.backgroundRunning || this.keeping) return; - this.keeping = true; - const generation = this.generation; - try { - const agent = await wantAgent.getWantAgent({ - wants: [{ bundleName: 'ink.render.trove.harmonyconnector', abilityName: 'EntryAbility' }], - actionType: wantAgent.OperationType.START_ABILITY, - requestCode: 1, - actionFlags: [wantAgent.WantAgentFlags.UPDATE_PRESENT_FLAG] - }); - if (!this.active || generation !== this.generation) return; - await backgroundTaskManager.startBackgroundRunning(this.context(), - backgroundTaskManager.BackgroundMode.AUDIO_RECORDING, agent); - this.backgroundRunning = true; - if (!this.active || generation !== this.generation) await this.stop(); - } catch (error) { - if (this.active) { - await this.stop(); - this.message = `无法保持后台共享:${error.message}`; - } - } finally { this.keeping = false; } - } - private async stop(): Promise { - this.generation++; - stream.stop(); - this.active = false; - this.stats = ''; - if (this.backgroundRunning) { - this.backgroundRunning = false; - try { await backgroundTaskManager.stopBackgroundRunning(this.context()); } catch (_) {} - } - this.message = '共享已停止。可在 Mac 上重新开始。'; - } - private start(): void { - try { - const screen = display.getDefaultDisplaySync(); - this.displayWidth = screen.width; - this.displayHeight = screen.height; - this.previousTime = Date.now(); - this.previousFrames = 0; - this.previousBytes = 0; - this.generation++; - stream.start(screen.width, screen.height, this.port, this.token); - this.active = true; - this.message = '正在连接 Mac,请同意系统的屏幕共享请求。'; - } catch (error) { this.message = error.message; } - } - private update(): void { - if (!this.active) return; - const status = stream.status(); - if (status.state === 'stopped') { - this.stop().then(() => { if (status.error) this.message = status.error; }); - return; - } - if (status.state !== 'sharing') return; - let screen: display.Display; - try { screen = display.getDefaultDisplaySync(); } catch (_) { this.stop(); return; } - if (screen.width !== this.displayWidth || screen.height !== this.displayHeight) { - this.stop().then(() => { this.message = '屏幕方向已改变,请在 Mac 重新开始投屏。'; }); - return; - } - this.keepRunning(); - const now = Date.now(); - const seconds = (now - this.previousTime) / 1000; - this.message = '正在共享屏幕'; - if (seconds >= 1) { - this.stats = `${((status.frames - this.previousFrames) / seconds).toFixed(1)} 帧/秒 · ${((status.bytes - this.previousBytes) * 8 / seconds / 1000000).toFixed(2)} Mbps`; - this.previousTime = now; - this.previousFrames = status.frames; - this.previousBytes = status.bytes; - } - } - aboutToAppear(): void { this.timer = setInterval(() => this.update(), 250); } - aboutToDisappear(): void { clearInterval(this.timer); this.stop(); } - - build() { - Column({ space: 24 }) { - Text('Harmony Connector').fontSize(30).fontWeight(FontWeight.Bold) - Text(this.message).fontSize(18).textAlign(TextAlign.Center) - Text('通过 USB 将画面共享到 Mac。系统会遮挡受保护的内容,麦克风始终关闭。') - .fontSize(15).fontColor('#64748B').textAlign(TextAlign.Center) - if (this.stats) { Text(this.stats).fontSize(16) } - Button(this.active ? '停止共享' : '共享屏幕') - .enabled(this.active || (this.token.length === 64 && this.port > 0)) - .onClick(() => { if (this.active) this.stop(); else this.start(); }) - Text('共享期间可随时返回这里停止,也可在系统录屏通知中停止。') - .fontSize(13).fontColor('#64748B').textAlign(TextAlign.Center) - } - .width('100%').height('100%').padding(32).justifyContent(FlexAlign.Center) - } -} diff --git a/curios/harmony-connector/companion/entry/src/main/module.json5 b/curios/harmony-connector/companion/entry/src/main/module.json5 deleted file mode 100644 index c90a38e..0000000 --- a/curios/harmony-connector/companion/entry/src/main/module.json5 +++ /dev/null @@ -1,47 +0,0 @@ -{ - "module": { - "name": "entry", - "type": "entry", - "description": "$string:module_desc", - "mainElement": "EntryAbility", - "deviceTypes": [ - "phone" - ], - "deliveryWithInstall": true, - "installationFree": false, - "pages": "$profile:main_pages", - "abilities": [ - { - "name": "EntryAbility", - "srcEntry": "./ets/entryability/EntryAbility.ets", - "description": "$string:EntryAbility_desc", - "icon": "$media:layered_image", - "label": "$string:EntryAbility_label", - "startWindowIcon": "$media:startIcon", - "startWindowBackground": "$color:start_window_background", - "exported": true, - "skills": [ - { - "entities": [ - "entity.system.home" - ], - "actions": [ - "ohos.want.action.home" - ] - } - ], - "backgroundModes": [ - "audioRecording" - ] - } - ], - "requestPermissions": [ - { - "name": "ohos.permission.INTERNET" - }, - { - "name": "ohos.permission.KEEP_BACKGROUND_RUNNING" - } - ] - } -} diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/element/color.json b/curios/harmony-connector/companion/entry/src/main/resources/base/element/color.json deleted file mode 100644 index 3c71296..0000000 --- a/curios/harmony-connector/companion/entry/src/main/resources/base/element/color.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "color": [ - { - "name": "start_window_background", - "value": "#FFFFFF" - } - ] -} \ No newline at end of file diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/element/float.json b/curios/harmony-connector/companion/entry/src/main/resources/base/element/float.json deleted file mode 100644 index 33ea223..0000000 --- a/curios/harmony-connector/companion/entry/src/main/resources/base/element/float.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "float": [ - { - "name": "page_text_font_size", - "value": "50fp" - } - ] -} diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/element/string.json b/curios/harmony-connector/companion/entry/src/main/resources/base/element/string.json deleted file mode 100644 index 96f6f79..0000000 --- a/curios/harmony-connector/companion/entry/src/main/resources/base/element/string.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "string": [ - { - "name": "module_desc", - "value": "通过 USB 将手机画面共享到 Mac" - }, - { - "name": "EntryAbility_desc", - "value": "通过 USB 将手机画面共享到 Mac" - }, - { - "name": "EntryAbility_label", - "value": "Harmony Connector" - } - ] -} diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/media/background.png b/curios/harmony-connector/companion/entry/src/main/resources/base/media/background.png deleted file mode 100644 index e129e5a0482cfef05a14fefd4db63bf7feadea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Asp9}fBgUdpMmus(?6gX NgQu&X%Q~loCIF_N5PSdt diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/media/foreground.png b/curios/harmony-connector/companion/entry/src/main/resources/base/media/foreground.png deleted file mode 100644 index e129e5a0482cfef05a14fefd4db63bf7feadea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Asp9}fBgUdpMmus(?6gX NgQu&X%Q~loCIF_N5PSdt diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/media/layered_image.json b/curios/harmony-connector/companion/entry/src/main/resources/base/media/layered_image.json deleted file mode 100644 index fb49920..0000000 --- a/curios/harmony-connector/companion/entry/src/main/resources/base/media/layered_image.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "layered-image": - { - "background" : "$media:background", - "foreground" : "$media:foreground" - } -} \ No newline at end of file diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/media/startIcon.png b/curios/harmony-connector/companion/entry/src/main/resources/base/media/startIcon.png deleted file mode 100644 index e129e5a0482cfef05a14fefd4db63bf7feadea3e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx1SBVv2j2ryJf1F&Asp9}fBgUdpMmus(?6gX NgQu&X%Q~loCIF_N5PSdt diff --git a/curios/harmony-connector/companion/entry/src/main/resources/base/profile/main_pages.json b/curios/harmony-connector/companion/entry/src/main/resources/base/profile/main_pages.json deleted file mode 100644 index 1898d94..0000000 --- a/curios/harmony-connector/companion/entry/src/main/resources/base/profile/main_pages.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "src": [ - "pages/Index" - ] -} diff --git a/curios/harmony-connector/companion/entry/src/main/resources/dark/element/color.json b/curios/harmony-connector/companion/entry/src/main/resources/dark/element/color.json deleted file mode 100644 index 79b11c2..0000000 --- a/curios/harmony-connector/companion/entry/src/main/resources/dark/element/color.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "color": [ - { - "name": "start_window_background", - "value": "#000000" - } - ] -} \ No newline at end of file diff --git a/curios/harmony-connector/companion/hvigor/hvigor-config.json5 b/curios/harmony-connector/companion/hvigor/hvigor-config.json5 deleted file mode 100644 index 2140b7a..0000000 --- a/curios/harmony-connector/companion/hvigor/hvigor-config.json5 +++ /dev/null @@ -1,23 +0,0 @@ -{ - "modelVersion": "26.0.0", - "dependencies": { - }, - "execution": { - // "analyze": "normal", /* Define the build analyze mode. Value: [ "normal" | "advanced" | "ultrafine" | false ]. Default: "normal" */ - // "daemon": true, /* Enable daemon compilation. Value: [ true | false ]. Default: true */ - // "incremental": true, /* Enable incremental compilation. Value: [ true | false ]. Default: true */ - // "parallel": true, /* Enable parallel compilation. Value: [ true | false ]. Default: true */ - // "typeCheck": false, /* Enable typeCheck. Value: [ true | false ]. Default: false */ - // "optimizationStrategy": "memory" /* Define the optimization strategy. Value: [ "memory" | "performance" ]. Default: "memory" */ - }, - "logging": { - // "level": "info" /* Define the log level. Value: [ "debug" | "info" | "warn" | "error" ]. Default: "info" */ - }, - "debugging": { - // "stacktrace": false /* Disable stacktrace compilation. Value: [ true | false ]. Default: false */ - }, - "nodeOptions": { - // "maxOldSpaceSize": 8192 /* Enable nodeOptions maxOldSpaceSize compilation. Unit M. Used for the daemon process. Default: 8192*/ - // "exposeGC": true /* Enable to trigger garbage collection explicitly. Default: true*/ - } -} diff --git a/curios/harmony-connector/companion/hvigorfile.ts b/curios/harmony-connector/companion/hvigorfile.ts deleted file mode 100644 index 8890d28..0000000 --- a/curios/harmony-connector/companion/hvigorfile.ts +++ /dev/null @@ -1,7 +0,0 @@ -// @ts-nocheck – Template file, only used when copied into a project directory -import { appTasks } from '@ohos/hvigor-ohos-plugin'; - -export default { - system: appTasks /* Built-in plugin of Hvigor. It cannot be modified. */, - plugins: [] /* Custom plugin to extend the functionality of Hvigor. */, -}; diff --git a/curios/harmony-connector/companion/legal/NOTICE.md b/curios/harmony-connector/companion/legal/NOTICE.md deleted file mode 100644 index 4fc1350..0000000 --- a/curios/harmony-connector/companion/legal/NOTICE.md +++ /dev/null @@ -1,17 +0,0 @@ -# Template attribution - -The initial HarmonyOS Empty Ability project was generated with Huawei's official -`@deveco/deveco-cli` 1.3.0-stable on 2026-09-10. Generated project configuration, -resource images, and the initial ArkTS entry/page came from that template. - -The generated ArkTS sources carry: - -Copyright (c) 2026 Huawei Device Co., Ltd. - -Licensed under the Apache License, Version 2.0. A copy is provided in -`Apache-2.0.txt`. - -Trove replaced the sample page and ability lifecycle with Harmony Connector's -screen-sharing interface and lifecycle. The native screen capture/transport -module and Mac measurement tools were written for this repository. No DevEco -private screen agent or phone system library is redistributed. diff --git a/curios/harmony-connector/companion/oh-package.json5 b/curios/harmony-connector/companion/oh-package.json5 deleted file mode 100644 index 7ae4fd7..0000000 --- a/curios/harmony-connector/companion/oh-package.json5 +++ /dev/null @@ -1,6 +0,0 @@ -{ - "modelVersion": "26.0.0", - "description": "Harmony Connector screen sharing companion", - "dependencies": {}, - "devDependencies": {} -} diff --git a/curios/harmony-connector/legal/THIRD-PARTY.md b/curios/harmony-connector/legal/THIRD-PARTY.md index 093ec6f..08d4fee 100644 --- a/curios/harmony-connector/legal/THIRD-PARTY.md +++ b/curios/harmony-connector/legal/THIRD-PARTY.md @@ -18,6 +18,14 @@ The native executable also uses Rust crates listed in `rust/`, with the license, copyright and notice files provided by each crate. Trove's UI SDK is distributed from the versioned SDK archive in the source repository. +The executable also embeds the unchanged `uitest_agent_v1.2.2.so` distributed in +`xdevice-devicetest` 6.1.0.210. Its package includes the Apache License 2.0; that +license and the original download URL, wheel member and SHA-256 checksums are in +`hypium/`. The binary is not modified or stripped. It is copied to a temporary +device file for an authorized HDC session and removed when that session closes. +The upstream wheel does not include this native agent's source; embedding this +binary does not make it independently rebuildable from this repository. + ## Building the distributed libraries The exact build commands and SHA-256 pins are in the accompanying `build.mjs`. diff --git a/curios/harmony-connector/native/src/diagnostics.rs b/curios/harmony-connector/native/src/diagnostics.rs index 9b188ca..6127d96 100644 --- a/curios/harmony-connector/native/src/diagnostics.rs +++ b/curios/harmony-connector/native/src/diagnostics.rs @@ -49,7 +49,7 @@ pub fn reconnect() -> anyhow::Result<()> { } // Uses the same management entry points as the UI. It never enables control or sends input. -pub fn screen(args: &[String]) -> anyhow::Result<()> { +pub fn screen(args: &[String], continuous: bool) -> anyhow::Result<()> { anyhow::ensure!( !args.is_empty() && args.len() <= 3, "用法:--check-screen /absolute/path/to/hdc [设备 ID] [保存目录]" @@ -78,16 +78,46 @@ pub fn screen(args: &[String]) -> anyhow::Result<()> { let id = json!({"session":opened["session"]}); println!( "{}", - json!({"stage":"opened","inputCapabilities":opened["inputCapabilities"],"control":false}) + json!({"stage":"opened","mode":opened["mode"],"inputCapabilities":opened["inputCapabilities"],"control":false}) ); let started = Instant::now(); let result = (|| -> anyhow::Result<()> { - for _ in 0..3 { - let frame = manager.call("screenFrame", id.clone())?; - println!( - "{}", - json!({"stage":"frame","sequence":frame["sequence"],"width":frame["width"],"height":frame["height"],"captureMs":frame["captureMs"]}) - ); + let mut after = 0u64; + let mut observations = 0; + let mut unique = 0; + let mut decoded = 0; + let mut report_at = Instant::now(); + while if continuous { + started.elapsed() < Duration::from_secs(20) + } else { + observations < 3 + } { + let frame = manager.call( + "screenFrame", + json!({"session":opened["session"],"after":after}), + )?; + observations += 1; + if frame["unchanged"] != true { + use base64::Engine; + let url = frame["dataUrl"] + .as_str() + .ok_or_else(|| anyhow::anyhow!("Missing JPEG"))?; + let jpeg = base64::engine::general_purpose::STANDARD.decode( + url.strip_prefix("data:image/jpeg;base64,") + .ok_or_else(|| anyhow::anyhow!("Invalid JPEG URL"))?, + )?; + image::load_from_memory(&jpeg)?; + decoded += 1; + unique += 1; + } + after = frame["sequence"].as_u64().unwrap(); + if !continuous || report_at.elapsed() >= Duration::from_secs(1) { + println!( + "{}", + json!({"stage":"frame","sequence":after,"width":frame["width"],"height":frame["height"],"frameAgeMs":frame["frameAgeMs"],"receivedFps":frame["receivedFps"],"mbps":frame["mbps"],"uniqueFrames":unique}) + ); + report_at = Instant::now(); + } } if let Some(directory) = args.get(2) { let saved = manager.call( @@ -101,7 +131,7 @@ pub fn screen(args: &[String]) -> anyhow::Result<()> { } println!( "{}", - json!({"passed":true,"frames":3,"seconds":started.elapsed().as_secs_f64(),"inputSent":false}) + json!({"connectionPassed":decoded>0,"uniqueFrames":unique,"decodedFrames":decoded,"seconds":started.elapsed().as_secs_f64(),"consumerFps":if continuous {Some(unique as f64/started.elapsed().as_secs_f64())} else {None},"inputSent":false,"performanceRequiresMovingScreen":true}) ); Ok(()) })(); diff --git a/curios/harmony-connector/native/src/hdc.rs b/curios/harmony-connector/native/src/hdc.rs index 7347ce8..a0043ad 100644 --- a/curios/harmony-connector/native/src/hdc.rs +++ b/curios/harmony-connector/native/src/hdc.rs @@ -1,6 +1,8 @@ mod files; mod screen; +mod screen_agent; mod screen_input; +mod screen_protocol; use crate::{ command, hdc_data, model::{Fault, Result}, @@ -362,14 +364,18 @@ impl Manager { if method == "screenSave" { return self.screen.save(parse(value)?); } + if method == "screenFrame" { + return self.screen.frame(parse(value)?); + } + if method == "screenInput" { + return self.screen.input(parse(value)?); + } let guard = self.enter()?; match method { "screenStart" => { let r: Target = parse(value)?; self.screen.start(self.tool()?, r.target) } - "screenFrame" => self.screen.frame(parse(value)?), - "screenInput" => self.screen.input(parse(value)?), "tool" => { let path = { let mut path = self.path.lock().unwrap(); diff --git a/curios/harmony-connector/native/src/hdc/screen.rs b/curios/harmony-connector/native/src/hdc/screen.rs index 353b9d9..6d68df2 100644 --- a/curios/harmony-connector/native/src/hdc/screen.rs +++ b/curios/harmony-connector/native/src/hdc/screen.rs @@ -1,22 +1,21 @@ use super::screen_input::{self, Input}; use super::*; use base64::{engine::general_purpose::STANDARD, Engine}; -use image::{codecs::jpeg::JpegEncoder, ImageFormat, ImageReader}; use std::{ collections::HashSet, - io::{BufReader, Write}, + io::Write, time::{Instant, SystemTime, UNIX_EPOCH}, }; const LEASE: Duration = Duration::from_secs(15); struct Frame { - jpeg: Vec, + jpeg: Arc>, width: u32, height: u32, sequence: u64, geometry: u64, captured: Instant, - capture_ms: u128, + previous_sequence: u64, } struct Session { id: u64, @@ -27,11 +26,13 @@ struct Session { supported: HashSet, frame: Option, touched: Instant, + stream: Arc, } #[derive(Default)] pub(super) struct Screen { current: Mutex>, next: AtomicU64, + lifecycle: Mutex<()>, } #[derive(Deserialize)] #[serde(deny_unknown_fields)] @@ -40,6 +41,13 @@ pub(super) struct Id { } #[derive(Deserialize)] #[serde(deny_unknown_fields)] +pub(super) struct FrameRequest { + pub session: u64, + #[serde(default)] + pub after: u64, +} +#[derive(Deserialize)] +#[serde(deny_unknown_fields)] pub(super) struct Control { pub session: u64, pub enabled: bool, @@ -64,49 +72,60 @@ fn missing() -> Fault { } impl Screen { pub fn close(&self, id: Option) -> Result { - let mut current = self.current.lock().unwrap(); - if let Some(id) = id { - if current.as_ref().is_some_and(|s| s.id != id) { - return Err(missing()); + let _lifecycle = self.lifecycle.lock().unwrap(); + let session = { + let mut current = self.current.lock().unwrap(); + if let Some(id) = id { + if current.as_ref().is_some_and(|s| s.id != id) { + return Err(missing()); + } } - } - if let Some(session) = current.take() { + current.take() + }; + if let Some(session) = session { session.cancel.store(true, Ordering::Release); + session.stream.stop(); } Ok(json!({"stopped":true})) } pub fn start(&self, tool: Tool, target: String) -> Result { + let _lifecycle = self.lifecycle.lock().unwrap(); hdc_data::target(&target)?; { - let current = self.current.lock().unwrap(); + let mut current = self.current.lock().unwrap(); if current .as_ref() .is_some_and(|s| s.touched.elapsed() < LEASE) { return Err(Fault::new("screen.active", "请先停止当前投屏。")); } + if let Some(session) = current.take() { + session.stream.stop(); + } } tool.connected(&target)?; - let help = tool.shell(&target, "uitest help")?; - if !help.contains("screenCap") { - return Err(Fault::new( - "screen.unavailable", - "设备没有开放屏幕采集,请检查调试工具与设备授权。", - )); - } - let input_help = tool + let help = tool .shell(&target, "uitest uiInput help") .unwrap_or_default(); - let supported = screen_input::capabilities(&input_help); + let mut supported = screen_input::capabilities(&help); + let stream = Arc::new(screen_agent::Stream::open(&tool, &target)?); + for input in [ + "click", + "doubleClick", + "longClick", + "swipe", + "drag", + "keyEvent", + ] { + supported.insert(input.into()); + } let id = self.next.fetch_add(1, Ordering::Relaxed) + 1; let mut capabilities: Vec<_> = supported.iter().cloned().collect(); capabilities.sort(); - self.close(None)?; - let mut current = self.current.lock().unwrap(); if tool.cancel.load(Ordering::Acquire) { return Err(missing()); } - *current = Some(Session { + *self.current.lock().unwrap() = Some(Session { id, target: target.clone(), path: tool.path, @@ -115,9 +134,10 @@ impl Screen { supported, frame: None, touched: Instant::now(), + stream, }); Ok( - json!({"session":id,"target":target,"inputCapabilities":capabilities,"control":false,"mode":"uitest-frames"}), + json!({"session":id,"target":target,"inputCapabilities":capabilities,"control":false,"mode":"hypium-stream"}), ) } fn access(&self, id: u64, f: impl FnOnce(&mut Session) -> Result) -> Result { @@ -137,17 +157,6 @@ impl Screen { s.touched = Instant::now(); f(s) } - fn context(&self, id: u64) -> Result<(Tool, String)> { - self.access(id, |s| { - Ok(( - Tool { - path: s.path.clone(), - cancel: s.cancel.clone(), - }, - s.target.clone(), - )) - }) - } pub fn control(&self, request: Control) -> Result { self.access(request.session, |s| { if request.enabled && request.geometry != s.frame.as_ref().map(|f| f.geometry) { @@ -166,21 +175,22 @@ impl Screen { Ok(json!({"control":s.control})) }) } - pub fn frame(&self, request: Id) -> Result { - let (tool, target) = self.context(request.session)?; - let started = Instant::now(); - let temporary = tempfile::NamedTempFile::new()?; + pub fn frame(&self, request: FrameRequest) -> Result { + let stream = self.access(request.session, |s| Ok(s.stream.clone()))?; let result = (|| { - capture(&tool, &target, temporary.path())?; - let (jpeg, width, height) = encode_frame(temporary.path())?; + let (frame, fps, mbps) = stream.frame(request.after)?; self.access(request.session, |s| { - let changed = s.frame.as_ref().is_some_and(|f| (f.width,f.height) != (width,height)); - let sequence = s.frame.as_ref().map_or(1, |f| f.sequence + 1); - let geometry = s.frame.as_ref().map_or(1, |f| f.geometry + u64::from(changed)); + let changed = s.frame.as_ref().is_some_and(|f| f.geometry != frame.geometry); + let previous = s.frame.as_ref().map_or(0, |f| if f.sequence != frame.sequence {f.sequence} else {f.previous_sequence}); if changed { s.control = false; } - let capture_ms = started.elapsed().as_millis(); - let value = json!({"session":s.id,"sequence":sequence,"geometry":geometry,"width":width,"height":height,"dataUrl":format!("data:image/jpeg;base64,{}",STANDARD.encode(&jpeg)),"captureMs":capture_ms,"control":s.control,"rotated":changed}); - s.frame = Some(Frame { jpeg,width,height,sequence,geometry,captured:Instant::now(),capture_ms }); + let mut value = json!({"session":s.id,"sequence":frame.sequence,"geometry":frame.geometry, + "width":frame.width,"height":frame.height,"frameAgeMs":frame.received.elapsed().as_millis(), + "receivedFps":fps,"mbps":mbps,"control":s.control,"rotated":changed,"unchanged":frame.sequence==request.after}); + if frame.sequence != request.after { + value["dataUrl"] = format!("data:image/jpeg;base64,{}",STANDARD.encode(frame.jpeg.as_slice())).into(); + } + s.frame = Some(Frame {jpeg:frame.jpeg,width:frame.width,height:frame.height, + sequence:frame.sequence,geometry:frame.geometry,captured:Instant::now(),previous_sequence:previous}); Ok(value) }) })(); @@ -190,21 +200,20 @@ impl Screen { result } pub fn input(&self, request: Event) -> Result { - let (tool, target, cmd) = self.access(request.session, |s| { + let (tool, target, stream, cmd) = self.access(request.session, |s| { if !s.control { return Err(Fault::new("screen.read_only", "请先启用控制。")); } let frame = s.frame.as_ref().ok_or_else(missing)?; if frame.geometry != request.geometry + || s.stream.current()?.geometry != frame.geometry || request.sequence == 0 - || request.sequence > frame.sequence - || frame.sequence - request.sequence > 1 + || ![frame.sequence, frame.previous_sequence].contains(&request.sequence) || frame.captured.elapsed() > Duration::from_secs(3) - || frame.capture_ms > 5000 { return Err(Fault::new( "screen.stale_frame", - "画面已变化或响应过慢,请等待新画面后再操作。", + "画面已变化,请等待新画面后再操作。", )); } let cmd = request @@ -216,10 +225,14 @@ impl Screen { cancel: s.cancel.clone(), }, s.target.clone(), + s.stream.clone(), cmd, )) })?; - let result = tool.shell(&target, &cmd); + let result = match request.input.rpc() { + Some((api, args)) => stream.driver(api, args).map(|_| ()), + None => tool.shell(&target, &cmd).map(|_| ()), + }; if result.is_err() { self.access(request.session, |s| { s.control = false; @@ -258,77 +271,3 @@ impl Screen { Ok(json!({"path":destination,"bytes":jpeg.len()})) } } -fn capture(tool: &Tool, target: &str, destination: &Path) -> Result<()> { - let nonce = tempfile::Builder::new() - .prefix("harmony-screen-") - .tempdir()?; - let remote = format!( - "/data/local/tmp/{}.png", - nonce.path().file_name().unwrap().to_string_lossy() - ); - let result = (|| { - tool.run( - &[ - "-t", - target, - "shell", - &format!("uitest screenCap -p {remote}"), - ], - 6, - )?; - tool.run( - &[ - "-t", - target, - "file", - "recv", - &remote, - destination.to_str().unwrap(), - ], - 6, - )?; - if destination.metadata()?.len() > 32 * 1024 * 1024 { - return Err(Fault::new( - "screen.frame_too_large", - "设备画面超过支持范围。", - )); - } - Ok(()) - })(); - let cleanup = Tool { - path: tool.path.clone(), - cancel: Arc::new(AtomicBool::new(false)), - }; - let _ = cleanup.run(&["-t", target, "shell", &format!("rm -f {remote}")], 2); - result -} -fn encode_frame(path: &Path) -> Result<(Vec, u32, u32)> { - let mut reader = - ImageReader::with_format(BufReader::new(fs::File::open(path)?), ImageFormat::Png); - let mut limits = image::Limits::default(); - limits.max_image_width = Some(8192); - limits.max_image_height = Some(8192); - limits.max_alloc = Some(64 * 1024 * 1024); - reader.limits(limits); - let image = reader - .decode() - .map_err(|_| Fault::new("screen.invalid_frame", "手机未返回有效画面,投屏已停止。"))?; - let (width, height) = (image.width(), image.height()); - if width == 0 || height == 0 { - return Err(Fault::new("screen.invalid_frame", "画面尺寸无效。")); - } - let scaled = if width > 1600 || height > 1600 { - image.thumbnail(1600, 1600) - } else { - image - } - .to_rgb8(); - let mut jpeg = Vec::new(); - JpegEncoder::new_with_quality(&mut jpeg, 82) - .encode_image(&scaled) - .map_err(|_| Fault::new("screen.encode_failed", "无法处理手机画面。"))?; - if jpeg.len() > 2 * 1024 * 1024 { - return Err(Fault::new("screen.frame_too_large", "画面数据过大。")); - } - Ok((jpeg, width, height)) -} diff --git a/curios/harmony-connector/native/src/hdc/screen_agent.rs b/curios/harmony-connector/native/src/hdc/screen_agent.rs new file mode 100644 index 0000000..e24c39d --- /dev/null +++ b/curios/harmony-connector/native/src/hdc/screen_agent.rs @@ -0,0 +1,493 @@ +//! One HDC-owned UITest daemon and two sockets: image push and control RPC. +//! Only the latest image is retained. Closing a session releases its own daemon, +//! extension file and forwarding rule; other debugging sessions are untouched. +use super::screen_protocol::{self, Decoder, Packet}; +use super::*; +use image::{ImageFormat, ImageReader}; +use std::{ + collections::VecDeque, + io::{Cursor, Read, Write}, + net::{Shutdown, TcpListener, TcpStream}, + sync::Condvar, + time::Instant, +}; + +const AGENT: &[u8] = + include_bytes!("../../../../../vendor/harmony-connector/hypium/uitest_agent_v1.2.2.so"); +const SOCKET: &str = "localabstract:uitest_socket"; +const LEASE: Duration = Duration::from_secs(15); + +fn fault(message: impl Into) -> Fault { + Fault::new("screen.connection_failed", message) +} +fn io(error: std::io::Error) -> Fault { + fault(format!("投屏连接已中断:{error}")) +} +fn response(value: Value) -> Result { + if value.get("exception").is_some_and(|v| !v.is_null()) { + return Err(Fault::new( + "screen.remote_error", + format!( + "设备未能执行操作:{}", + value["exception"]["message"].as_str().unwrap_or("未知错误") + ), + )); + } + value + .get("result") + .cloned() + .ok_or_else(|| fault("设备没有返回有效操作结果。")) +} +struct Rpc { + socket: TcpStream, + decoder: Decoder, + sequence: u32, + driver: String, +} +impl Rpc { + fn connect(port: u16) -> Result { + let socket = + TcpStream::connect_timeout(&([127, 0, 0, 1], port).into(), Duration::from_secs(2)) + .map_err(io)?; + socket.set_nodelay(true).map_err(io)?; + socket + .set_read_timeout(Some(Duration::from_secs(2))) + .map_err(io)?; + socket + .set_write_timeout(Some(Duration::from_secs(1))) + .map_err(io)?; + Ok(Self { + socket, + decoder: Decoder::default(), + sequence: 0, + driver: String::new(), + }) + } + fn send(&mut self, method: &str, params: Value) -> Result<()> { + self.sequence = self.sequence.wrapping_add(1); + let value = json!({"module":"com.ohos.devicetest.hypiumApiHelper","method":method,"params":params,"request_id":self.sequence.to_string()}); + self.socket + .write_all(&screen_protocol::request(&value, self.sequence)) + .map_err(io) + } + fn call(&mut self, method: &str, params: Value) -> Result { + let result = self.exchange(method, params); + if result + .as_ref() + .is_err_and(|error| error.code != "screen.remote_error") + { + // A timed-out response has no request ID on this protocol version. + // Never let a later command consume that ambiguous response. + let _ = self.socket.shutdown(Shutdown::Both); + } + result + } + fn exchange(&mut self, method: &str, params: Value) -> Result { + self.send(method, params)?; + let deadline = Instant::now() + Duration::from_secs(3); + let mut bytes = [0; 8192]; + loop { + if let Some(packet) = self.decoder.next()? { + return match packet { + Packet::Json(v) => response(v), + Packet::Jpeg(_) => Err(fault("控制通道返回了意外画面。")), + }; + } + if Instant::now() > deadline { + return Err(fault("手机控制响应超时。")); + } + let size = self.socket.read(&mut bytes).map_err(io)?; + if size == 0 { + return Err(fault("手机已关闭投屏连接。")); + } + self.decoder.push(&bytes[..size])?; + } + } + fn driver(&mut self, api: &str, args: Value) -> Result { + self.call( + "callHypiumApi", + json!({"api":api,"this":self.driver,"args":args,"message_type":"hypium"}), + ) + } + fn dimensions(&mut self) -> Result<(u32, u32)> { + let value = self.driver("Driver.getDisplaySize", json!([]))?; + let dimension = |key: &str| { + value[key] + .as_u64() + .filter(|n| (1..=8192).contains(n)) + .map(|n| n as u32) + .ok_or_else(|| fault("设备屏幕尺寸无效。")) + }; + Ok((dimension("x")?, dimension("y")?)) + } +} +struct DeviceSession { + tool: Tool, + target: String, + name: String, + forward: Option, +} +impl Drop for DeviceSession { + fn drop(&mut self) { + let cleanup = Tool { + path: self.tool.path.clone(), + cancel: Arc::new(AtomicBool::new(false)), + }; + if let Some(local) = &self.forward { + let _ = cleanup.run(&["-t", &self.target, "fport", "rm", local, SOCKET], 2); + } + // Never kill all UITest processes or remove a wildcard in /data/local/tmp. + if let Ok(pids) = cleanup.run_output(&["-t", &self.target, "shell", "pidof uitest"], 2) { + for pid in pids + .split_whitespace() + .filter(|p| p.bytes().all(|b| b.is_ascii_digit())) + { + if let Ok(cmdline) = cleanup.run_output( + &[ + "-t", + &self.target, + "shell", + &format!("cat /proc/{pid}/cmdline"), + ], + 2, + ) { + if cmdline.split('\0').any(|part| part == self.name) { + let _ = + cleanup.run(&["-t", &self.target, "shell", &format!("kill {pid}")], 2); + } + } + } + } + let _ = cleanup.run( + &[ + "-t", + &self.target, + "shell", + &format!("rm -f /data/local/tmp/{}", self.name), + ], + 2, + ); + } +} +#[derive(Clone)] +pub(super) struct Frame { + pub jpeg: Arc>, + pub width: u32, + pub height: u32, + pub sequence: u64, + pub geometry: u64, + pub received: Instant, +} +struct State { + latest: Option, + error: Option, + touched: Instant, + samples: VecDeque, + bytes: VecDeque<(Instant, usize)>, +} +struct Shared { + state: Mutex, + changed: Condvar, + cancel: Arc, +} +pub(super) struct Stream { + shared: Arc, + rpc: Arc>, + socket: TcpStream, + worker: Mutex>>, +} +impl Stream { + pub fn open(tool: &Tool, target: &str) -> Result { + if !tool + .run_output(&["-t", target, "shell", "pidof uitest"], 2)? + .trim() + .is_empty() + { + return Err(Fault::new( + "screen.debugger_busy", + "设备正在被其他 UI 调试工具使用,请结束该调试会话后再开始投屏。", + )); + } + let mut file = tempfile::Builder::new() + .prefix("trove-screen-") + .suffix(".so") + .tempfile()?; + file.write_all(AGENT)?; + let name = file + .path() + .file_name() + .unwrap() + .to_str() + .unwrap() + .to_owned(); + let mut resources = DeviceSession { + tool: Tool { + path: tool.path.clone(), + cancel: tool.cancel.clone(), + }, + target: target.into(), + name: name.clone(), + forward: None, + }; + tool.run( + &[ + "-t", + target, + "file", + "send", + file.path().to_str().unwrap(), + &format!("/data/local/tmp/{name}"), + ], + 10, + )?; + tool.run( + &[ + "-t", + target, + "shell", + &format!("uitest start-daemon singleness --extension-name {name}"), + ], + 5, + )?; + let reservation = TcpListener::bind(("127.0.0.1", 0)).map_err(io)?; + let port = reservation.local_addr().map_err(io)?.port(); + drop(reservation); + let local = format!("tcp:{port}"); + tool.run(&["-t", target, "fport", &local, SOCKET], 3)?; + resources.forward = Some(local); + let deadline = Instant::now() + Duration::from_secs(5); + let (mut control, driver) = loop { + if tool.cancel.load(Ordering::Acquire) { + return Err(fault("投屏连接已取消。")); + } + let attempt = (|| { + let mut control = Rpc::connect(port)?; + control.driver = "Driver#0".into(); + let driver = control.driver("Driver.create", json!([]))?; + Ok((control, driver)) + })(); + match attempt { + Ok(result) => break result, + Err(error) if Instant::now() >= deadline => return Err(error), + Err(_) => thread::sleep(Duration::from_millis(100)), + } + }; + control.driver = driver + .as_str() + .filter(|s| s.starts_with("Driver#") && s.len() < 64) + .ok_or_else(|| fault("设备未能启动投屏控制组件。"))? + .into(); + let dimensions = control.dimensions()?; + let mut video = Rpc::connect(port)?; + video.send( + "Captures", + json!({"api":"startCaptureScreen","args":{"options":{"displayId":0,"scale":0.5}}}), + )?; + video + .socket + .set_read_timeout(Some(Duration::from_millis(100))) + .map_err(io)?; + let socket = video.socket.try_clone().map_err(io)?; + let rpc = Arc::new(Mutex::new(control)); + let shared = Arc::new(Shared { + state: Mutex::new(State { + latest: None, + error: None, + touched: Instant::now(), + samples: VecDeque::new(), + bytes: VecDeque::new(), + }), + changed: Condvar::new(), + cancel: Arc::new(AtomicBool::new(false)), + }); + let worker_shared = shared.clone(); + let worker_rpc = rpc.clone(); + let parent_cancel = tool.cancel.clone(); + let worker = thread::spawn(move || { + let result = receive( + &mut video, + &worker_rpc, + &worker_shared, + dimensions, + &parent_cancel, + ); + if let Err(error) = result { + worker_shared.state.lock().unwrap().error = Some(error); + } + worker_shared.cancel.store(true, Ordering::Release); + worker_shared.changed.notify_all(); + let _ = video.send("Captures", json!({"api":"stopCaptureScreen","args":{}})); + let _ = video.socket.shutdown(Shutdown::Both); + let _ = worker_rpc.lock().unwrap().socket.shutdown(Shutdown::Both); + drop(resources); + }); + Ok(Self { + shared, + rpc, + socket, + worker: Mutex::new(Some(worker)), + }) + } + pub fn frame(&self, after: u64) -> Result<(Frame, f64, f64)> { + let mut state = self.shared.state.lock().unwrap(); + state.touched = Instant::now(); + let timeout = if state.latest.is_none() { + Duration::from_secs(5) + } else { + Duration::from_millis(100) + }; + let (state, _) = self + .shared + .changed + .wait_timeout_while(state, timeout, |s| { + s.error.is_none() + && !self.shared.cancel.load(Ordering::Acquire) + && s.latest.as_ref().is_none_or(|f| f.sequence <= after) + }) + .unwrap(); + if let Some(error) = &state.error { + return Err(error.clone()); + } + if self.shared.cancel.load(Ordering::Acquire) { + return Err(fault("投屏连接已结束,请重新开始。")); + } + let frame = state + .latest + .clone() + .ok_or_else(|| fault("手机没有返回画面,请解锁手机并检查 USB 调试授权。"))?; + let recent = |time: &&Instant| time.elapsed() < Duration::from_secs(1); + let fps = state.samples.iter().filter(recent).count() as f64; + let mbps = state + .bytes + .iter() + .filter(|(t, _)| t.elapsed() < Duration::from_secs(1)) + .map(|(_, n)| *n as f64) + .sum::() + * 8.0 + / 1_000_000.0; + Ok((frame, fps, mbps)) + } + pub fn current(&self) -> Result { + let state = self.shared.state.lock().unwrap(); + if let Some(error) = &state.error { + return Err(error.clone()); + } + if self.shared.cancel.load(Ordering::Acquire) { + return Err(fault("投屏连接已结束。")); + } + state + .latest + .clone() + .ok_or_else(|| fault("请等待手机画面。")) + } + pub fn driver(&self, api: &str, args: Value) -> Result { + self.current()?; + self.rpc.lock().unwrap().driver(api, args) + } + pub fn stop(&self) { + self.shared.cancel.store(true, Ordering::Release); + self.shared.changed.notify_all(); + let _ = self.socket.shutdown(Shutdown::Read); + if let Some(worker) = self.worker.lock().unwrap().take() { + let _ = worker.join(); + } + } +} +impl Drop for Stream { + fn drop(&mut self) { + self.stop(); + } +} +fn receive( + video: &mut Rpc, + control: &Mutex, + shared: &Shared, + mut dimensions: (u32, u32), + parent_cancel: &AtomicBool, +) -> Result<()> { + let mut buffer = [0; 65536]; + let mut heartbeat = Instant::now(); + let mut encoded_size = None; + loop { + if shared.cancel.load(Ordering::Acquire) || parent_cancel.load(Ordering::Acquire) { + return Ok(()); + } + if shared.state.lock().unwrap().touched.elapsed() > LEASE { + return Err(fault("投屏窗口已停止响应,连接已关闭。")); + } + if heartbeat.elapsed() >= Duration::from_secs(1) { + dimensions = control.lock().unwrap().dimensions()?; + heartbeat = Instant::now(); + } + match video.socket.read(&mut buffer) { + Ok(0) => return Err(fault("手机已断开投屏连接。")), + Ok(n) => video.decoder.push(&buffer[..n])?, + Err(e) + if matches!( + e.kind(), + std::io::ErrorKind::WouldBlock | std::io::ErrorKind::TimedOut + ) => + { + continue + } + Err(e) => return Err(io(e)), + } + while let Some(packet) = video.decoder.next()? { + let jpeg = match packet { + Packet::Json(v) => { + response(v)?; + continue; + } + Packet::Jpeg(bytes) => bytes, + }; + let size = ImageReader::with_format(Cursor::new(&jpeg), ImageFormat::Jpeg) + .into_dimensions() + .map_err(|_| fault("设备返回了无效 JPEG 画面。"))?; + if size.0 == 0 || size.1 == 0 || size.0 > 8192 || size.1 > 8192 { + return Err(fault("画面尺寸超过支持范围。")); + } + if encoded_size.is_some_and(|previous| previous != size) { + dimensions = control.lock().unwrap().dimensions()?; + } + encoded_size = Some(size); + // A display change must be observed before coordinates can be used. + if dimensions.0 / 2 != size.0 || dimensions.1 / 2 != size.1 { + dimensions = control.lock().unwrap().dimensions()?; + } + if dimensions.0 / 2 != size.0 || dimensions.1 / 2 != size.1 { + return Err(fault("手机画面与屏幕尺寸不一致,请重新开始投屏。")); + } + let now = Instant::now(); + let mut state = shared.state.lock().unwrap(); + let sequence = state.latest.as_ref().map_or(1, |f| f.sequence + 1); + let geometry = state.latest.as_ref().map_or(1, |f| { + f.geometry + u64::from((f.width, f.height) != dimensions) + }); + state.samples.push_back(now); + state.bytes.push_back((now, jpeg.len())); + while state + .samples + .front() + .is_some_and(|t| t.elapsed() > Duration::from_secs(1)) + { + state.samples.pop_front(); + } + while state + .bytes + .front() + .is_some_and(|(t, _)| t.elapsed() > Duration::from_secs(1)) + { + state.bytes.pop_front(); + } + state.latest = Some(Frame { + jpeg: Arc::new(jpeg), + width: dimensions.0, + height: dimensions.1, + sequence, + geometry, + received: now, + }); + shared.changed.notify_all(); + } + } +} diff --git a/curios/harmony-connector/native/src/hdc/screen_input.rs b/curios/harmony-connector/native/src/hdc/screen_input.rs index 36aa7f9..807c255 100644 --- a/curios/harmony-connector/native/src/hdc/screen_input.rs +++ b/curios/harmony-connector/native/src/hdc/screen_input.rs @@ -1,5 +1,6 @@ use crate::model::{Fault, Result}; use serde::Deserialize; +use serde_json::{json, Value}; use std::collections::HashSet; #[derive(Deserialize)] @@ -96,6 +97,34 @@ pub(super) fn capabilities(help: &str) -> HashSet { .collect() } impl Input { + pub fn rpc(&self) -> Option<(&'static str, Value)> { + Some(match self { + Self::Click { x, y } => ("Driver.click", json!([x, y])), + Self::DoubleClick { x, y } => ("Driver.doubleClick", json!([x, y])), + Self::LongClick { x, y } => ("Driver.longClick", json!([x, y])), + Self::Swipe { + x, + y, + to_x, + to_y, + speed, + } => ("Driver.swipe", json!([x, y, to_x, to_y, speed])), + Self::Drag { + x, + y, + to_x, + to_y, + speed, + } => ("Driver.drag", json!([x, y, to_x, to_y, speed])), + Self::Key { key: Key::Home } => ("Driver.pressHome", json!([])), + Self::Key { key: Key::Back } => ("Driver.pressBack", json!([])), + Self::Key { key } => ( + "Driver.triggerKey", + json!([key.code().parse::().ok()?]), + ), + Self::Text { .. } => return None, + }) + } pub fn command(&self, width: u32, height: u32, supported: &HashSet) -> Result { let point = |x, y| { if x < width && y < height { diff --git a/curios/harmony-connector/native/src/hdc/screen_protocol.rs b/curios/harmony-connector/native/src/hdc/screen_protocol.rs new file mode 100644 index 0000000..21aa9ed --- /dev/null +++ b/curios/harmony-connector/native/src/hdc/screen_protocol.rs @@ -0,0 +1,243 @@ +//! Hypium agent wire format. JPEG segments are parsed by length, so EXIF/ICC +//! bytes containing an EOI marker cannot truncate a frame. +use crate::model::{Fault, Result}; +use serde_json::Value; + +const HEAD: &[u8] = b"_uitestkit_rpc_message_head_"; +const TAIL: &[u8] = b"_uitestkit_rpc_message_tail_"; +pub const MAX_FRAME: usize = 2 * 1024 * 1024; +const MAX_JSON: usize = 64 * 1024; + +fn invalid() -> Fault { + Fault::new( + "screen.invalid_stream", + "设备返回了无效的投屏数据,连接已停止。", + ) +} +pub fn request(body: &Value, sequence: u32) -> Vec { + let body = serde_json::to_vec(body).unwrap(); + let mut bytes = Vec::with_capacity(HEAD.len() + body.len() + TAIL.len() + 8); + bytes.extend_from_slice(HEAD); + bytes.extend_from_slice(&sequence.to_be_bytes()); + bytes.extend_from_slice(&(body.len() as u32).to_be_bytes()); + bytes.extend_from_slice(&body); + bytes.extend_from_slice(TAIL); + bytes +} +#[derive(Debug)] +pub enum Packet { + Json(Value), + Jpeg(Vec), +} +#[derive(Default)] +pub struct Decoder { + bytes: Vec, +} +impl Decoder { + pub fn push(&mut self, bytes: &[u8]) -> Result<()> { + if self.bytes.len() + bytes.len() > MAX_FRAME + 65536 { + return Err(invalid()); + } + self.bytes.extend_from_slice(bytes); + Ok(()) + } + pub fn next(&mut self) -> Result> { + let whitespace = self + .bytes + .iter() + .take_while(|b| matches!(b, b'\n' | b'\r')) + .count(); + self.bytes.drain(..whitespace); + if self.bytes.is_empty() { + return Ok(None); + } + let (start, length, consumed) = if self.bytes.starts_with(HEAD) { + let start = HEAD.len() + 8; + if self.bytes.len() < start { + return Ok(None); + } + let length = + u32::from_be_bytes(self.bytes[start - 4..start].try_into().unwrap()) as usize; + if length == 0 || length > MAX_FRAME { + return Err(invalid()); + } + let consumed = start + length + TAIL.len(); + if self.bytes.len() < consumed { + return Ok(None); + } + if &self.bytes[start + length..consumed] != TAIL { + return Err(invalid()); + } + (start, length, consumed) + } else if self.bytes.starts_with(b"{") { + let Some(end) = self.bytes.iter().position(|b| *b == b'\n') else { + if self.bytes.len() > MAX_JSON { + return Err(invalid()); + } + return Ok(None); + }; + (0, end, end + 1) + } else if self.bytes.starts_with(b"\xff\xd8") { + let Some(length) = jpeg_length(&self.bytes)? else { + if self.bytes.len() > MAX_FRAME { + return Err(invalid()); + } + return Ok(None); + }; + (0, length, length) + } else if HEAD.starts_with(&self.bytes) || b"\xff\xd8".starts_with(&self.bytes) { + return Ok(None); + } else { + return Err(invalid()); + }; + if length > MAX_FRAME { + return Err(invalid()); + } + let body = &self.bytes[start..start + length]; + let packet = if body.starts_with(b"\xff\xd8") { + if jpeg_length(body)? != Some(body.len()) { + return Err(invalid()); + } + Packet::Jpeg(body.to_vec()) + } else { + if body.len() > MAX_JSON { + return Err(invalid()); + } + Packet::Json(serde_json::from_slice(body).map_err(|_| invalid())?) + }; + self.bytes.drain(..consumed); + Ok(Some(packet)) + } +} +fn jpeg_length(bytes: &[u8]) -> Result> { + let mut position = 2; + let mut entropy = false; + loop { + if entropy { + while position < bytes.len() && bytes[position] != 0xff { + position += 1; + } + } + if position >= bytes.len() { + return Ok(None); + } + if bytes[position] != 0xff { + return Err(invalid()); + } + while position < bytes.len() && bytes[position] == 0xff { + position += 1; + } + if position >= bytes.len() { + return Ok(None); + } + let marker = bytes[position]; + position += 1; + if entropy && (marker == 0 || (0xd0..=0xd7).contains(&marker)) { + continue; + } + if marker == 0xd9 { + return Ok(Some(position)); + } + if marker == 0 || marker == 0xd8 { + return Err(invalid()); + } + if marker == 1 { + continue; + } + if bytes.len() < position + 2 { + return Ok(None); + } + let length = u16::from_be_bytes(bytes[position..position + 2].try_into().unwrap()) as usize; + if length < 2 { + return Err(invalid()); + } + if bytes.len() < position + length { + return Ok(None); + } + position += length; + entropy = marker == 0xda; + } +} + +#[cfg(test)] +mod tests { + use super::*; + use image::codecs::jpeg::JpegEncoder; + use serde_json::json; + fn jpeg() -> Vec { + let mut bytes = Vec::new(); + JpegEncoder::new(&mut bytes) + .encode_image(&image::RgbImage::new(40, 80)) + .unwrap(); + bytes.splice(2..2, [0xff, 0xe1, 0, 6, 0xff, 0xd9, 0, 0]); + bytes + } + #[test] + fn decodes_fragmented_mixed_responses_and_real_jpegs_without_truncating_exif() { + let jpeg = jpeg(); + let bytes = [ + b"{\"result\":true}\n".as_slice(), + &jpeg, + b"\n", + &jpeg, + b"\n", + ] + .concat(); + for chunk_size in [1, 7, 512, 65536] { + let mut decoder = Decoder::default(); + let mut images = 0; + let mut responses = 0; + for chunk in bytes.chunks(chunk_size) { + decoder.push(chunk).unwrap(); + while let Some(packet) = decoder.next().unwrap() { + match packet { + Packet::Json(v) => { + assert_eq!(v["result"], true); + responses += 1; + } + Packet::Jpeg(bytes) => { + assert_eq!(bytes, jpeg); + assert_eq!(image::load_from_memory(&bytes).unwrap().height(), 80); + images += 1; + } + } + } + } + assert_eq!((responses, images), (1, 2)); + } + } + #[test] + fn rejects_oversized_malformed_and_corrupt_framed_data() { + let mut decoder = Decoder::default(); + assert!(decoder.push(&vec![0; MAX_FRAME + 65537]).is_err()); + for bytes in [ + b"not a frame".to_vec(), + b"{invalid}\n".to_vec(), + b"\xff\xd8\xff\xe1\0\0".to_vec(), + [ + HEAD, + &0u32.to_be_bytes(), + &((MAX_FRAME + 1) as u32).to_be_bytes(), + ] + .concat(), + ] { + let mut decoder = Decoder::default(); + decoder.push(&bytes).unwrap(); + assert!(decoder.next().is_err()); + } + let mut bytes = request(&json!({"result":true}), 3); + *bytes.last_mut().unwrap() = b'!'; + let mut decoder = Decoder::default(); + decoder.push(&bytes).unwrap(); + assert!(decoder.next().is_err()); + } + #[test] + fn accepts_framed_json_and_waits_for_partial_data() { + let bytes = request(&json!({"result":{"x":1260,"y":2844}}), 7); + let mut decoder = Decoder::default(); + decoder.push(&bytes[..bytes.len() - 1]).unwrap(); + assert!(decoder.next().unwrap().is_none()); + decoder.push(&bytes[bytes.len() - 1..]).unwrap(); + assert!(matches!(decoder.next().unwrap(), Some(Packet::Json(_)))); + } +} diff --git a/curios/harmony-connector/native/src/hdc/screen_tests.rs b/curios/harmony-connector/native/src/hdc/screen_tests.rs index fa0006a..ed85df7 100644 --- a/curios/harmony-connector/native/src/hdc/screen_tests.rs +++ b/curios/harmony-connector/native/src/hdc/screen_tests.rs @@ -3,29 +3,25 @@ use base64::{engine::general_purpose::STANDARD, Engine}; fn phone() -> (tempfile::TempDir, Arc) { let (directory, manager) = fixture(false); - fs::write(directory.path().join("hdc"), r#"#!/bin/sh -printf '%s\n' "$*" >> "$0.calls" -case "$*" in - 'list targets -v') printf 'phone USB Connected device\n' ;; - '-t phone shell uitest help') printf 'screenCap uiInput\n' ;; - '-t phone shell uitest uiInput help') printf 'click doubleClick longClick swipe drag text keyEvent\n' ;; - '-t phone shell uitest screenCap -p '*) - if [ -f "$0.slow" ]; then touch "$0.capturing"; sleep 20; fi - printf 'Screen capture saved\n' ;; - '-t phone file recv '*) cp "$0.png" "$6" ;; - '-t phone shell rm -f /data/local/tmp/harmony-screen-'*) printf 'cleaned\n' ;; - '-t phone shell uitest uiInput '*) - if [ -f "$0.fail-input" ]; then printf '[Fail] input not permitted\n'; else printf 'completed\n'; fi ;; - *) printf '[Fail] unexpected invocation\n' ;; -esac -"#).unwrap(); + fs::write( + directory.path().join("hdc"), + include_str!("../../tests/hypium_device.py"), + ) + .unwrap(); frame_file(&directory, 600, 1200, [30, 80, 120]); (directory, manager) } fn frame_file(directory: &tempfile::TempDir, width: u32, height: u32, rgb: [u8; 3]) { - image::RgbImage::from_pixel(width, height, image::Rgb(rgb)) - .save(directory.path().join("hdc.png")) + fs::write( + directory.path().join("hdc.dimensions"), + serde_json::to_vec(&json!({"x":width,"y":height})).unwrap(), + ) + .unwrap(); + let temporary = directory.path().join("frame.jpg"); + image::RgbImage::from_pixel(width / 2, height / 2, image::Rgb(rgb)) + .save(&temporary) .unwrap(); + fs::rename(temporary, directory.path().join("hdc.jpg")).unwrap(); } fn start(manager: &Arc) -> Value { let opened = manager @@ -67,9 +63,14 @@ fn shows_real_decodable_frames_and_saves_latest_without_overwriting() { .unwrap() }; let jpeg = decode(&first); - assert_eq!(image::load_from_memory(&jpeg).unwrap().height(), 1200); + assert_eq!(image::load_from_memory(&jpeg).unwrap().height(), 600); frame_file(&directory, 600, 1200, [220, 60, 30]); - let next = manager.call("screenFrame", id.clone()).unwrap(); + let next = manager + .call( + "screenFrame", + json!({"session":id["session"],"after":first["sequence"]}), + ) + .unwrap(); assert!(next["sequence"].as_u64() > first["sequence"].as_u64()); assert_ne!(decode(&next), jpeg); let destination = tempfile::tempdir().unwrap(); @@ -110,7 +111,12 @@ fn only_explicit_control_of_current_geometry_can_send_input() { true ); frame_file(&directory, 1200, 600, [30, 80, 120]); - let rotated = manager.call("screenFrame", id.clone()).unwrap(); + let rotated = manager + .call( + "screenFrame", + json!({"session":id["session"],"after":frame["sequence"]}), + ) + .unwrap(); assert_eq!(rotated["control"], false); enable(&manager, &id, &rotated); assert_eq!( @@ -121,7 +127,7 @@ fn only_explicit_control_of_current_geometry_can_send_input() { assert_eq!( calls .lines() - .filter(|line| line.contains("uiInput click")) + .filter(|line| line.contains("Driver.click")) .count(), 1 ); @@ -143,8 +149,16 @@ fn rejects_out_of_bounds_unsupported_and_old_events_without_sending_them() { .call("screenInput", input(&id, &first, event)) .is_err()); } - for _ in 0..2 { - manager.call("screenFrame", id.clone()).unwrap(); + let mut after = first["sequence"].clone(); + for red in [110, 120] { + frame_file(&directory, 600, 1200, [red, 80, 120]); + after = manager + .call( + "screenFrame", + json!({"session":id["session"],"after":after}), + ) + .unwrap()["sequence"] + .clone(); } assert_eq!( manager @@ -236,10 +250,16 @@ fn invalid_capture_closes_the_session_and_remote_input_failure_disables_control( manager.call("screenFrame", id.clone()).unwrap()["control"], false ); - fs::write(directory.path().join("hdc.png"), b"success but no image").unwrap(); + fs::write(directory.path().join("hdc.jpg"), b"success but no image").unwrap(); assert_eq!( - manager.call("screenFrame", id.clone()).unwrap_err().code, - "screen.invalid_frame" + manager + .call( + "screenFrame", + json!({"session":id["session"],"after":frame["sequence"]}) + ) + .unwrap_err() + .code, + "screen.invalid_stream" ); assert_eq!( manager @@ -252,3 +272,52 @@ fn invalid_capture_closes_the_session_and_remote_input_failure_disables_control( "screen.closed" ); } + +#[test] +fn static_stream_remains_connected_without_inventing_frames() { + let (_directory, manager) = phone(); + let id = start(&manager); + let first = manager.call("screenFrame", id.clone()).unwrap(); + enable(&manager, &id, &first); + for _ in 0..12 { + let next = manager + .call( + "screenFrame", + json!({"session":id["session"],"after":first["sequence"]}), + ) + .unwrap(); + assert_eq!(next["unchanged"], true); + assert_eq!(next["sequence"], first["sequence"]); + assert!(next.get("dataUrl").is_none()); + assert_eq!(next["control"], true); + } + manager + .call( + "screenInput", + input(&id, &first, json!({"kind":"key","key":"home"})), + ) + .unwrap(); + manager.call("screenStop", id).unwrap(); +} + +#[test] +fn refuses_to_take_over_another_debugging_session() { + let (directory, manager) = phone(); + fs::write( + directory.path().join("hdc.daemon"), + "another-tools-agent.so", + ) + .unwrap(); + assert_eq!( + manager + .call("screenStart", json!({"target":"phone"})) + .unwrap_err() + .code, + "screen.debugger_busy" + ); + let calls = fs::read_to_string(directory.path().join("hdc.calls")).unwrap(); + assert!( + !calls.contains("file send") && !calls.contains("shell kill") && !calls.contains("fport") + ); + assert!(directory.path().join("hdc.daemon").exists()); +} diff --git a/curios/harmony-connector/native/src/main.rs b/curios/harmony-connector/native/src/main.rs index be14190..f0d43ca 100644 --- a/curios/harmony-connector/native/src/main.rs +++ b/curios/harmony-connector/native/src/main.rs @@ -21,7 +21,10 @@ fn main() -> anyhow::Result<()> { } let args: Vec<_> = std::env::args().collect(); if args.get(1).is_some_and(|s| s == "--check-screen") { - return diagnostics::screen(&args[2..]); + return diagnostics::screen(&args[2..], false); + } + if args.get(1).is_some_and(|s| s == "--check-screen-stream") { + return diagnostics::screen(&args[2..], true); } let _ = mtp::version(); wire::run(connector::Connector::new()) diff --git a/curios/harmony-connector/native/tests/hypium_device.py b/curios/harmony-connector/native/tests/hypium_device.py new file mode 100644 index 0000000..68f39e4 --- /dev/null +++ b/curios/harmony-connector/native/tests/hypium_device.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 +"""Local test peer for the public HDC and Hypium protocol. Never contacts USB.""" +import json +import os +from pathlib import Path +import signal +import socket +import struct +import subprocess +import sys +import threading +import time + +ROOT = Path(__file__).parent +HEAD = b'_uitestkit_rpc_message_head_' +TAIL = b'_uitestkit_rpc_message_tail_' +def path(name): return ROOT / ('hdc.' + name) +def log(value): + with path('calls').open('a') as f: f.write(value + '\n') +def exact(sock, length): + data = bytearray() + while len(data) < length: + chunk = sock.recv(length-len(data)) + if not chunk: raise EOFError() + data.extend(chunk) + return bytes(data) +def client(sock): + done = threading.Event() + write_lock = threading.Lock() + def send(data): + with write_lock: sock.sendall(data) + def video(): + previous = None + try: + while not done.wait(0.01) and ROOT.exists(): + if path('slow').exists(): + path('capturing').touch() + continue + jpeg = path('jpg').read_bytes() + if jpeg != previous: + send(jpeg+b'\n') + previous=jpeg + except (OSError, EOFError): pass + try: + while True: + assert exact(sock,len(HEAD)) == HEAD + _,length=struct.unpack('>II',exact(sock,8)) + assert 0 < length <= 65536 + message=json.loads(exact(sock,length)) + assert exact(sock,len(TAIL)) == TAIL + params=message['params']; api=params['api'] + log(json.dumps({'api':api,'args':params['args']})) + result=None + if api=='Driver.create': result='Driver#fixture' + elif api=='Driver.getDisplaySize': result=json.loads(path('dimensions').read_text()) + elif api=='startCaptureScreen': result=True + elif api=='stopCaptureScreen': result=True;done.set() + elif path('fail-input').exists(): + send(b'{"exception":{"code":17000005,"message":"input not permitted"}}\n') + continue + send(json.dumps({'result':result}).encode()+b'\n') + if api=='startCaptureScreen': threading.Thread(target=video,daemon=True).start() + except (OSError,EOFError): pass + finally: done.set();sock.close() +def serve(port): + with socket.socket() as listener: + listener.bind(('127.0.0.1',port));listener.listen() + path('ready').touch() + while True: + sock,_=listener.accept() + threading.Thread(target=client,args=(sock,),daemon=True).start() +if sys.argv[1:2]==['server']: + serve(int(sys.argv[2]));sys.exit() +args=sys.argv[1:] +log(' '.join(args)) +if args[:2]==['-t','phone']: args=args[2:] +if args==['list','targets','-v']: print('phone USB Connected device') +elif args==['shell','uitest uiInput help']: print('click doubleClick longClick swipe drag text keyEvent') +elif args==['shell','pidof uitest']: + if path('daemon').exists(): print('4242') +elif args[:2]==['file','send']: print('FileTransfer finish') +elif args[0]=='shell' and args[1].startswith('uitest start-daemon'): + path('daemon').write_text(args[1].split()[-1]) +elif args[0]=='shell' and args[1]=='cat /proc/4242/cmdline': + sys.stdout.write('uitest\0start-daemon\0'+path('daemon').read_text()+'\0') +elif args[:2]==['shell','kill 4242']: path('daemon').unlink(missing_ok=True) +elif args[0]=='shell' and args[1].startswith('rm -f /data/local/tmp/'): pass +elif args[0]=='shell' and args[1].startswith('uitest uiInput text '): print('completed') +elif args[:2]==['fport','rm']: + pid=int(path('pid').read_text());os.kill(pid,signal.SIGTERM) + path('pid').unlink();path('ready').unlink(missing_ok=True) + print('Remove forward ruler success') +elif args[0]=='fport': + process=subprocess.Popen([sys.executable,__file__,'server',args[1].split(':')[1]], + stdin=subprocess.DEVNULL,stdout=subprocess.DEVNULL,stderr=subprocess.DEVNULL,start_new_session=True) + path('pid').write_text(str(process.pid)) + until=time.monotonic()+3 + while not path('ready').exists(): + if time.monotonic()>until: raise RuntimeError('Fixture listener not ready') + time.sleep(0.01) + print('Forwardport result:OK') +else: print('[Fail] unexpected invocation') diff --git a/curios/harmony-connector/ui/screen.js b/curios/harmony-connector/ui/screen.js index 9925d40..3abcbd3 100644 --- a/curios/harmony-connector/ui/screen.js +++ b/curios/harmony-connector/ui/screen.js @@ -24,6 +24,7 @@ export function screen({ call, host, notice, onBusy }) { pending: null, timer: null, flight: null, + inputFlight: null, pointer: null, wheel: null, wheelTimer: null, @@ -88,7 +89,8 @@ export function screen({ call, host, notice, onBusy }) { $("screen-placeholder").hidden = false; $("screen-stats").textContent = ""; $("screen-text").value = ""; - $("screen-input-status").textContent = "默认仅观看,启用控制后才会发送操作。"; + $("screen-input-status").textContent = + "默认仅观看,启用控制后才会发送操作。"; } async function stop() { const session = state.session; @@ -104,14 +106,14 @@ export function screen({ call, host, notice, onBusy }) { } catch (error) { if (!state.disposed) notice(error.message || String(error)); } finally { - await state.flight?.catch(() => {}); + await Promise.allSettled([state.flight, state.inputFlight]); state.stopping = false; if (state.disposed) return; if (!state.starting) onBusy(false); controls(); } } - function schedule(delay = 100) { + function schedule(delay = 0) { clearTimeout(state.timer); if (state.active && !state.disposed) state.timer = setTimeout(pump, delay); } @@ -119,31 +121,23 @@ export function screen({ call, host, notice, onBusy }) { if (!state.active || state.flight || state.disposed) return; const revision = state.revision; state.flight = (async () => { - if (state.pending) { - const pending = state.pending; - state.pending = null; - if (Date.now() - pending.created <= 1500 && state.control) { - const before = performance.now(); - try { - await call("screenInput", pending.request); - if (revision === state.revision && !state.disposed) - $("screen-input-status").textContent = - `操作已发送 · ${Math.round(performance.now() - before)} ms`; - } catch (error) { - if (revision !== state.revision || state.disposed) return; - state.control = false; - clearPending(); - controls(); - notice(error.message || String(error)); - } - } else - $("screen-input-status").textContent = - "画面响应较慢,已丢弃等待过久的操作。"; - } if (!state.active || revision !== state.revision) return; const controlRevision = state.controlRevision; - const frame = await call("screenFrame", { session: state.session }); + const frame = await call("screenFrame", { + session: state.session, + after: state.frame?.sequence || 0, + }); if (!state.active || revision !== state.revision) return; + if (frame.unchanged) { + if (!state.frame || frame.geometry !== state.frame.geometry) + throw new Error("手机画面状态无效。"); + state.displayedAt = Date.now(); + if (controlRevision === state.controlRevision) + state.control = !!frame.control; + updateStats(frame); + controls(); + return; + } if ( !/^data:image\/jpeg;base64,/.test(frame.dataUrl) || !Number.isInteger(frame.width) || @@ -155,6 +149,8 @@ export function screen({ call, host, notice, onBusy }) { const image = $("screen-image"); image.src = frame.dataUrl; if (image.decode) await image.decode(); + if (window.requestAnimationFrame) + await new Promise((resolve) => window.requestAnimationFrame(resolve)); if (!state.active || revision !== state.revision) { image.removeAttribute("src"); return; @@ -172,14 +168,12 @@ export function screen({ call, host, notice, onBusy }) { state.control = !!frame.control; state.displayedAt = Date.now(); state.samples.push(performance.now()); - if (state.samples.length > 8) state.samples.shift(); - const elapsed = state.samples.at(-1) - state.samples[0]; - const fps = - elapsed > 0 - ? (((state.samples.length - 1) * 1000) / elapsed).toFixed(1) - : "—"; - $("screen-stats").textContent = - `${frame.width} × ${frame.height} · ${fps} 帧/秒 · 采集 ${Math.round(frame.captureMs)} ms`; + while ( + state.samples.length && + performance.now() - state.samples[0] > 1000 + ) + state.samples.shift(); + updateStats(frame); image.hidden = false; $("screen-placeholder").hidden = true; controls(); @@ -196,7 +190,46 @@ export function screen({ call, host, notice, onBusy }) { if (failure) { notice(failure.message || String(failure)); await stop(); - } else schedule(state.pending ? 0 : 100); + } else schedule(0); + } + function updateStats(frame) { + const received = Number.isFinite(frame.receivedFps) + ? frame.receivedFps.toFixed(0) + : "—"; + const displayed = state.samples.filter( + (t) => performance.now() - t <= 1000, + ).length; + const bitrate = Number.isFinite(frame.mbps) + ? ` · ${frame.mbps.toFixed(1)} Mbps` + : ""; + $("screen-stats").textContent = + `${frame.width} × ${frame.height} · 接收 ${received} 帧/秒 · 显示 ${displayed} 帧/秒${bitrate}`; + } + async function flushInput() { + if (state.inputFlight || !state.pending || !canControl()) return; + const pending = state.pending; + state.pending = null; + if (Date.now() - pending.created > 1500) return; + const revision = state.revision; + const before = performance.now(); + state.inputFlight = call("screenInput", pending.request); + try { + await state.inputFlight; + if (revision === state.revision && !state.disposed) + $("screen-input-status").textContent = + `操作已发送 · ${Math.round(performance.now() - before)} ms`; + } catch (error) { + if (revision === state.revision && !state.disposed) { + state.controlRevision++; + state.control = false; + clearPending(); + controls(); + notice(error.message || String(error)); + } + } finally { + state.inputFlight = null; + if (revision === state.revision && !state.disposed) void flushInput(); + } } async function start() { if ( @@ -272,7 +305,7 @@ export function screen({ call, host, notice, onBusy }) { }, }; $("screen-input-status").textContent = "等待发送操作…"; - if (!state.flight) schedule(0); + void flushInput(); } function point(event) { return state.frame diff --git a/docs/harmony-connector.md b/docs/harmony-connector.md index 2f073a9..4ff0603 100644 --- a/docs/harmony-connector.md +++ b/docs/harmony-connector.md @@ -67,15 +67,15 @@ macOS 上的鸿蒙设备连接工具。通过 USB 收发文件与完整文件夹 在「设备与应用」选择已授权的 HDC 目标,点击「开始投屏」。默认仅观看;画面出现后勾选「启用鼠标与键盘控制」。功能依设备的 `uitest` 帮助和实际操作结果开放。 -- 连续显示手机画面,显示真实分辨率、实测刷新帧率和采集耗时。可放大面板,将当前画面保存为 JPEG。 +- 连续显示手机画面,显示真实分辨率、接收/显示帧率和码率。可放大面板,将当前画面保存为 JPEG。 - 点击、双击、长按、滑动、拖拽与滚轮滚动;坐标按实际手机尺寸映射,忽略画面周围留白。 - 返回、主页、音量、方向键、回车、退格等按键。快捷键只在手机画面获得焦点时生效。 - 用专用文字框发送文本,支持输入法;不读取系统剪贴板。文字能否进入目标输入框,以手机焦点和输入权限为准。 - 一个屏幕会话只保留一项待发送操作。停止、切换工作区、页面隐藏、断线时清空队列和旧画面,不在重连后重放输入。横竖屏变化后需重新启用控制。 -当前实现通过 HDC + UITest 连续采集截图,完成一帧再开始下一帧;不是 H.264/H.265 视频流,不承诺 scrcpy 的 30/60 FPS、音频或低延迟多点触控。拖动在松开时发送完整手势。采集临时文件使用每次唯一名称并清理;远端清理被断线阻断时,不扫描删除其他文件。 +当前源代码通过 HDC 部署官方 Hypium 代理,持续接收 JPEG 画面,并通过独立连接发送输入。用户无需开发者账号、编译、签名或安装手机应用。拖动在松开时发送完整手势。停止会删除本会话的代理和转发;其他调试工具占用设备时会提示。已发布 0.3.2 仍为逐帧截图,新路径的动态真机验收状态见[开发验证](harmony-realtime-development.md)。 -图像解码限制内存与尺寸,传给 UI 的 JPEG 最长边不超过 1600 像素;坐标仍按手机原始尺寸计算。画面过旧、方向变化、会话过期或输入失败时会阻止控制。受保护画面和锁屏遵循系统限制,不自动解锁。自动化测试和真机结果分别记录,详见[投屏能力调研](research/harmony-screen-control.md)。 +JPEG 采用半尺寸采集,坐标按手机原始尺寸计算。画面不变化时保留显示,通过独立控制连接检查存活;方向变化、会话过期或输入失败时会阻止控制。受保护画面和锁屏遵循系统限制,不自动解锁。自动化测试和真机结果分别记录,详见[HDC 持续投屏调研](research/harmony-hdc-only-screen.md)。 ## 重连问题与 debug diff --git a/docs/harmony-realtime-development.md b/docs/harmony-realtime-development.md index b9a6405..ff0868d 100644 --- a/docs/harmony-realtime-development.md +++ b/docs/harmony-realtime-development.md @@ -1,78 +1,40 @@ -# Harmony Connector 连续视频开发验证 +# Harmony Connector 持续投屏开发验证 -当前为待真机验证的开发组件,尚未接入插件播放器,也未发布新插件版本。已发布的 0.3.2 仍使用逐帧截图。不要将本篇的编码配置或本机生成视频测试结果描述成手机实测性能。 +运行路径为:已授权的 HDC USB 连接 → 官方 Hypium 设备代理 → 持续 JPEG 推送 → 插件显示。用户无需开发者账号、AppGallery Connect、HAP 安装、编译或签名。代理由插件自动部署到本次会话的临时文件,停止时删除。 -## 已完成与待验证 +## 当前状态 -2026-09-10 的原链路真机采集耗时为 696、803、802 ms,约 1.3 fps。截图命令、PNG 文件回传和图像转换是逐帧执行的;调整界面定时器不足以实现实时视频。 +2026-09-10:已发布的 0.3.2 仍使用逐张截图,真机原链路为 696、803、802 ms,约 1.3 fps。当前源代码已替换该路径,尚未发布新版本。 -新增源码: +官方 `xdevice-devicetest` 6.1.0.210 的 `uitest_agent_v1.2.2.so` 已在 HUAWEI Pura 70 Ultra 的商业系统上成功加载。独立探针收到真实 JPEG、屏幕尺寸 1260 × 2844,并成功调用尺寸、旋转和唤醒接口。设备端文件为 600245 字节,未改动签名原件。没有安装 HAP,也没有账号或系统共享确认步骤。 -- `curios/harmony-connector/companion`:官方 Empty Ability 模板上的普通手机应用。用户点击共享后,经系统授权,将 AVScreenCapture Surface 接到 H.264 编码器。初始配置最长边 1280、30 fps、4 Mbps CBR、Baseline、1 秒关键帧间隔,不采集音频。 -- `tools/harmony-stream.py`:独立 Mac 开发验证程序,建立本会话 HDC 转发、启动组件、接收与解码视频,输出接收帧率、解码帧数和码率。默认不保存画面文件、不发送输入。`--view` 用于人工观看。 -- `tools/harmony-stream.test.py`:协议尺寸与长度限制、断流、超时、非 H.264 数据,以及真正经过 FFmpeg 编码与解码的 20 帧生成视频测试。 +探测期间手机主要处于锁屏或静止状态。黑色首帧、短暂变化及收包时间不能证明动态帧率或端到端延迟达标。接入生产后端时手机变为 Offline,后端的完整真机连通、持续动态画面、输入及重连仍待验收。自动化替身测试不替代这项验收。完整自动化检查通过 85 项:47 项原生、32 项 UI/格式/坐标、6 项 USB 桥接与底座协议检查。 -已使用官方 Command Line Tools 26.0.0.821 编译出 arm64-v8a 未签名 HAP,包含 ArkTS 和本地 C++ 动态库;编译兼容级别 API 17,使用的采集接口最低 API 14。编译成功不代表商业设备运行授权与编码能力已经验证。 +之前的 HAP 实验源码和签名流程已移除。本机签名材料不属于插件或发行包。原方案的研究过程保留在[历史记录](research/harmony-realtime-stream.md),当前方案及来源见[HDC 持续投屏调研](research/harmony-hdc-only-screen.md)。 -签名工具已登录,但调用 `signature generate` 返回账号尚未完成开发者实名认证。尚未安装伴随应用、取得真机 H.264 视频、测量呈现帧率或端到端延迟。 - -## 构建与签名 - -需要完整官方 Command Line Tools、Node.js 22+、官方 `@deveco/deveco-cli@1.3.0-stable`。`DEVECO_CLI_CLT_PATH` 指向包含 `sdk`、`tool`、`hvigor` 的 `command-line-tools` 根目录,不是单独的 HDC 所在目录。 +## 构建和验证 ```sh -cd curios/harmony-connector/companion -# 首次准备;已有配置时保留本机签名。 -test -f build-profile.json5 || cp build-profile.template.json5 build-profile.json5 +node curios/harmony-connector/build.mjs +node tools/test-harmony.mjs -# 预先按本机实际路径设置 DEVECO_CLI_CLT_PATH。 -npx --yes @deveco/deveco-cli@1.3.0-stable build --modules entry --build-mode debug +# 手机开启 USB 调试并授权 Mac;多设备时在末尾加目标 ID。 +curios/harmony-connector/backend/harmony-connector --check-screen /absolute/path/to/hdc + +# 连续 20 秒,通过与 UI 相同的后端接口接收并实际解码 JPEG。 +curios/harmony-connector/backend/harmony-connector --check-screen-stream /absolute/path/to/hdc ``` -得到 `entry/build/default/outputs/default/entry-default-unsigned.hap`。真实手机安装必须有合法签名;需要已实名认证的华为开发者账号,按官方流程配置可调试设备。认证入口是 [AppGallery Connect](https://developer.huawei.com/consumer/cn/service/josp/agc/index.html),见[官方开发准备](https://developer.huawei.com/consumer/cn/appgallery/devstart/)。 +动态测量时保持手机解锁,并连续滑动桌面或滚动页面。`receivedFps` 与 `mbps` 是最近一秒收到的帧数和码率;`consumerFps` 是此验证程序在完整观察期解码的不同帧数除以时长,不是 WebView 呈现帧率。`frameAgeMs` 是收到画面后经过的时间,不是端到端延迟。静止画面不重复计帧。 -```sh -npx --yes @deveco/deveco-cli@1.3.0-stable auth login -npx --yes @deveco/deveco-cli@1.3.0-stable signature generate --product default -npx --yes @deveco/deveco-cli@1.3.0-stable build --modules entry --build-mode debug -``` +上述命令默认不保存画面、不启用控制,也不发送输入。基础连通命令的第三个参数可以是用户指定的保存目录。真实交互仍需在插件中检验:启用控制、点击、拖动、返回/主页、文字输入、停止后重新开始,以及拔线后旧画面清空。 -`build-profile.json5`、签名证书、profile 和密码材料均属于本机文件,不提交到仓库。模板 `build-profile.template.json5` 不包含签名配置。不要将绑定调试设备的 HAP 当作所有用户均可安装的发行包;正式手机组件需要发布者签名和正式分发流程。 +## 会话与协议 -## 真机验证 +- 插件只保留最新一张 JPEG,不积压视频队列。UI 用上一帧序号等待变化;静止时返回状态,不重复发送图片。 +- 图像与控制使用两个独立 socket,共用本会话的 HDC 转发。按键和手势通过持久 RPC 发送,文字使用已验证的 `uitest uiInput text`。 +- 代理回包包括 JSON 行与 JPEG;解析 JPEG 段长度,避免把 EXIF 数据中的字节误认作图像结尾。单帧上限 2 MiB,JSON 上限 64 KiB。 +- 静止画面不视为断线;独立控制连接查询尺寸检查存活。UI 停止请求超过 15 秒会结束会话。屏幕几何变化会关闭输入控制。 +- 每次部署使用唯一文件名,只结束加载该文件的进程,只删除本次转发和文件。发现其他 UITest 会话时提示占用,不接管或结束其他调试工具。 -先确认 `hdc list targets -v` 显示目标为 `Connected`。安装刚构建的 **signed** HAP,包名为 `ink.render.trove.harmonyconnector`。安装应选择明确目标,不自动安装到其他设备。 - -在仓库根目录执行以下命令,将 HDC 路径替换为本机工具路径;连接多台设备时另加 `--target`: - -```sh -python3 tools/harmony-stream.py --hdc /absolute/path/to/hdc --seconds 20 -# 人工观看连续画面;需 ffplay。 -python3 tools/harmony-stream.py --hdc /absolute/path/to/hdc --seconds 20 --view -``` - -运行时在手机点击「共享屏幕」,同意系统请求,滚动页面或移动窗口产生持续变化。默认验证需要 FFmpeg;它只用于开发测量,未引入生产插件依赖。 - -接收帧率目标至少 20 fps,默认解码模式同时要求解码帧数达到收到视频帧数的 95%。这些只是开发验收门槛,不能代替端到端延迟测量。`--view` 的 FFplay 不提供解码帧计数,需另外运行默认模式;人工确认的流畅程度应单独记录。静态画面可能由系统抑制重复帧,性能测试必须保持画面变化。 - -停止共享、系统拒绝、拔线、关闭验证程序都必须终止手机采集并清理仅本会话的转发。当前原型在屏幕尺寸变化时停止共享,提示重新开始;自动旋转重建、插件播放器集成及流式会话中的输入验证仍待完成。 - -## 传输与资源边界 - -手机仅监听 IPv4 loopback,由启动端提供随机远端端口和 32 字节会话随机值。连接后首先发送 64 个小写十六进制字符进行会话校验,不通过则断开。正常用户操作仍需手机点击共享以及系统录屏授权。 - -验证成功后,手机发送固定 24 字节头:`HCS1` + 5 个大端 u32,依次为编码宽、高、屏幕宽、高、配置帧率。随后每包为大端 `u32 payloadLength + u32 flags + i64 ptsUs + Annex B H.264 payload`,沿用公共编码器的 buffer flags。SPS/PPS 配置数据与编码帧均按输出顺序保留。 - -单包上限 2 MiB;采集回调复制数据后归还编码器 buffer。发送队列上限 6 包和 4 MiB,超过就结束会话,不积压旧帧,也不任意丢弃参考帧。Socket 发送超时 500 ms。主机发送一个零字节或断开连接可停止采集。系统停止与错误统一由资源所属线程收尾,释放 capture、encoder、surface、socket。 - -这仍是开发协议,尚未替代正式产品的配对、版本协商和播放器生命周期设计。普通录屏授权也不会赋予任意输入注入权限;后续控制需复用已授权的 UITest 能力并验证响应。 - -## 自动化验证 - -```sh -python3 tools/harmony-stream.test.py -v -``` - -测试不连接手机;使用本地 socket pair 验证接收行为,使用生成图案验证实际 H.264 解码。当前 8 项通过,20 帧均成功解码。它们不证明手机端授权、编码吞吐、后台保活或 USB 实时性。 - -API、权限和被拒绝的无安装路线见[连续视频调研](research/harmony-realtime-stream.md)。 +运行 HDC 不需要完整 SDK:本机独立验证了 `hdc` 与同目录 `libusb_shared.dylib` 的版本命令,总计约 6.4 MiB。完整工具包用于开发构建,不应成为普通投屏用户的依赖。本次尚未新增精简 HDC 发行包;插件继续使用已配置或自动发现的官方工具。 diff --git a/docs/research/harmony-hdc-only-screen.md b/docs/research/harmony-hdc-only-screen.md new file mode 100644 index 0000000..d59d155 --- /dev/null +++ b/docs/research/harmony-hdc-only-screen.md @@ -0,0 +1,149 @@ +# Harmony Connector:仅通过 HDC 的连续投屏 + +调研日期:2026-09-10。产品约束:最终用户只启用 USB 调试并授权 Mac,不注册开发者账号、不安装 HAP、不修改手机安全策略。目标是可交互的连续画面,不限定 H.264;帧率和延迟必须在真机上测量。本篇研究未操作设备。 + +## 当前结论 + +找到了一条此前漏查的公开分发路线:**使用华为 Hypium 的公开 PyPI 依赖包中原样分发的 UITest agent,由设备内置 `uitest` 加载,通过 HDC 转发持续 JPEG 与触控 RPC。** 该路线无需用户编译、签名或安装手机应用;它仍会向设备临时推送一个 agent 文件,作用类似 scrcpy 的临时设备端服务。不能把自编 unsigned ELF 或 addon 被 XPM 拒绝,推广为所有官方签名 agent 均无法加载。 + +Hypium 的公开说明支持 USB/Wi-Fi 调试连接,并明确 Driver 模式可作为 SDK 集成到其他工具。其 `xdevice-devicetest` 包公开包含原生 agent;对应的 `xdevice-ohos` 包提供选择、推送、启动和转发实现。[Hypium 官方发布页](https://pypi.org/project/hypium/6.1.0.210/)、[设备测试资源包](https://pypi.org/project/xdevice-devicetest/6.1.0.210/)、[设备连接包](https://pypi.org/project/xdevice-ohos/6.1.0.210/) + +**主任务真机进展:**官方 `v1.2.2.so` 使用唯一 `--extension-name` 已成功加载,Unix socket 能返回 JPEG,`Driver.create`、屏幕尺寸和旋转查询成功;不需要安装 HAP、开发者账号或录屏确认弹窗。初次收到的是 630 × 1422 黑帧,首帧约 195–235 ms,15 秒仅收到 3 帧;当时可能处于锁屏状态,**这些数字只证明链路连通,不能作为动态画面流畅度或端到端延迟的结论**。本文作者未操作手机,真机结果来自主任务当轮报告。 + +## 精确来源与许可证据 + +本轮从 PyPI 元数据取得 wheel 下载地址,在内存读取并校验 SHA256,没有安装或执行其中代码。 + +| 资源 | 版本、路径及 SHA256 | +| --- | --- | +| xdevice-devicetest wheel | `6.1.0.210`;`1c80f0da8d497d4e034f9873e966e8b2d8ef23ecc376c64c839c1493a813980e` | +| 新版 ARM64 agent | `devicetest/res/prototype/native/uitest_agent_v1.2.2.so`;`e1b8e75fad983aa29640784ee4b457fe7ac1c916a15f72c8b899d5a7716da651` | +| 旧版 ARM64 agent | `devicetest/res/prototype/native/uitest_agent_v1.1.10.so`;`1c9286456fb003ee15d86fef04e8c93f004027349e6dd2ef972c792e0a6d4bf8` | +| xdevice-ohos wheel | `6.1.0.210`;`548a09bb6fc9fcfd92a7dbb5b69180de0159ce8959057e133dec34774054bb12` | + +资源包的 `METADATA` 明确列出 `License-File: LICENSE`,`xdevice_devicetest-6.1.0.210.dist-info/LICENSE` 是完整 Apache License 2.0;本次清单未发现额外 EULA、NOTICE 或对 agent 的另行许可文件。Apache 2.0 提供商业使用及 object form 再分发条件;打包时保留该许可证、来源版本和校验值,保留现有版权声明,修改自有封装代码应说明。不要以第三方仓库的许可证替代原始发布包的许可。[原始 wheel](https://files.pythonhosted.org/packages/a2/b5/55bdfe4d669558331499848dbc68269506abb9b4a771e3524a65f9845127/xdevice_devicetest-6.1.0.210-py3-none-any.whl)、[Apache 2.0 条款](https://www.apache.org/licenses/LICENSE-2.0) + +原始 `v1.2.2.so` 尾部包含 ELF 签名块标记,并含 Huawei CBG Software Signing Service CA 证书链字符串。这里只确认原件附带签名结构,**没有进行独立密码学验签,也没有据此声称目标设备必然接受**。部署必须保持字节不变,不 strip、不重链接、不截掉 ELF 尾部。该 wheel 没有提供 agent 的 C++ 源码,因此应称“公开分发的官方 agent”,不能称为设备端也能完全自行重建的开源实现。 + +## 真实选择与启动路径 + +当前手机 UITest 版本由主任务报告为 `6.0.2.3`。官方 `xdevice-ohos 6.1.0.210` 内: + +- `ohos/environment/device.py::check_if_unix_socket_mode`:UITest 版本高于 `6.0.2.1` 且设备不是 x86_64 时使用 Unix socket。 +- `ohos/proxy/proxy_base.py::_init_so_resource`:此分支选择 `uitest_agent_v1.2.2.so`;旧分支才使用 v1.1.10/v1.1.5/v1.1.3。 +- `ohos/proxy/ui_proxy.py`:默认推送到 `/data/local/tmp/agent.so`,运行 `/system/bin/uitest start-daemon singleness`,连接 `localabstract:uitest_socket`。旧协议为设备 TCP 8012。 + +因此不能把“设备 6.x”硬编码为旧 TCP 8012,也不能只依据文件名相似选择第三方 agent。[对应公开 wheel](https://files.pythonhosted.org/packages/78/a6/8ac621bb958813cde648d515069c30188939b492ffcdd29e8d1e234550cf/xdevice_ohos-6.1.0.210-py3-none-any.whl) + +以下最小命令形态已由主任务用本轮官方原件在当前手机验证;参数仍必须来自所选设备与本机会话: + +```text +hdc -t file send /data/local/tmp/ +hdc -t shell uitest start-daemon singleness --extension-name +hdc -t fport tcp: localabstract:uitest_socket +``` + +独有 `--extension-name` 来自 OpenHarmony UITest 的扩展加载器:它将名称解析到 `/data/local/tmp/` 并加载扩展。官方 Python 默认使用 `agent.so`,独有名已在本轮商业手机上验证,其他固件仍需兼容验证。不要覆盖其他工具已有的 `agent.so`;官方框架内部的通配清理、强杀其他进程不应照搬到插件。[扩展加载器](https://github.com/openharmony/testfwk_arkxtest/blob/b04e30c40cf266c9abfbd52933e43a0456eb99a2/uitest/addon/extension_executor.cpp) + +## 持续 JPEG 与控制协议 + +公开客户端已有实际代码实现,不依赖教程中的口头描述。本节以 `devhelmkit` 锁定提交 `05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00` 为协议参考,设备 agent 原件仍从官方 wheel 获取。该项目的 `device/hdc.py`、`rpc/proxy_v2.py`、`screenshot_stream.py` 分别实现传输、RPC 和连续画面。[传输实现](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/device/hdc.py)、[RPC](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/rpc/proxy_v2.py)、[连续帧](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/screenshot_stream.py) + +客户端发送请求的 TCP 封包顺序: + +```text +ASCII "_uitestkit_rpc_message_head_" +u32 big-endian session ID +u32 big-endian UTF-8 JSON byte length +JSON body +ASCII "_uitestkit_rpc_message_tail_" +``` + +初始化和控制使用独立连接。调用 `Driver.create` 后使用返回的实际引用值,不能把 `Driver#0` 当成所有连接的固定保证。外层 `request_id` 为本次唯一字符串,transport session ID 是另一字段。 + +```json +{ + "module": "com.ohos.devicetest.hypiumApiHelper", + "method": "callHypiumApi", + "params": { + "api": "Driver.create", + "this": null, + "args": [], + "message_type": "hypium" + }, + "request_id": "" +} +``` + +后续只替换 `params` 中的 API、引用与参数,外层保持相同。以下是主任务确认的**解析后结果值**,不代表复制完整回包结构: + +| API | `this` / `args` | 当前手机结果 | +| --- | --- | --- | +| `Driver.create` | `null` / `[]` | `"Driver#0"` | +| `Driver.getDisplaySize` | 返回的 Driver 引用 / `[]` | `{"displayId":0,"x":1260,"y":2844}` | +| `Driver.getDisplayRotation` | 返回的 Driver 引用 / `[]` | `0` | +| `Driver.wakeUpDisplay` | 返回的 Driver 引用 / `[]` | `null` | +| `Driver.getDeviceInfo` | 返回的 Driver 引用 / `[]` | `No handler found`,当前手机不可用,不用于探活。 | + +物理输入坐标应依据屏幕尺寸与旋转转换,不能直接使用 JPEG 缩小后的像素坐标。`getDisplaySize` 可作为独立控制连接的低频探活;无新图不等于连接已断。 + +在独立采集 socket 发送: + +```json +{ + "module": "com.ohos.devicetest.hypiumApiHelper", + "method": "Captures", + "params": { + "api": "startCaptureScreen", + "args": { "options": { "displayId": 0, "scale": 0.5 } } + }, + "request_id": "" +} +``` + +注意 `Captures.args` 是对象,与 `callHypiumApi.args` 数组不同。JPEG 被推送到发送采集请求的 socket。**当前官方 v1.2.2 真机回包实测为 JSON 行 `{"result":true,"pts":...}\n` 与裸 JPEG `FF D8 … FF D9` 加换行,不使用上述 HEAD/TAIL 请求封包包住 JPEG。**不能只实现带 HEAD/TAIL 的接收器。参考客户端兼容协议封装与裸 JPEG;实现应依据实际格式使用有界长度及完整帧解析,不能假设一次 `recv` 对应一张图,也不能忽略 ACK/错误后无限等待。[采集请求与分帧](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/screenshot_stream.py#L677) + +实时触控使用相同外层与 `method: "Gestures"`,内层为 `api: "touchDown" | "touchMove" | "touchUp"`、`args: {"x": ..., "y": ...}`。客户端实现按下、移动、抬起接口,适合替换拖动后才发送整段 swipe 的延迟;必须限制 move 排队,并保证取消、失焦时结束本会话已按下触点。键盘、文字可继续使用现有已验证的 UITest 输入路径。[触控实现](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/driver.py#L687) + +未找到 `Gestures.keyDown`、`Gestures.keyUp` 或 `Gestures.text` 的公开调用依据。普通按键使用 `callHypiumApi`:`Driver.triggerKey` 的 `args` 为 `[keyCode]`;组合键 `Driver.triggerCombineKeys` 为 `[key1,key2]` 或三个键;Home/Back 分别是 `Driver.pressHome` / `Driver.pressBack`、`args:[]`。不要使用不存在的 `Driver.pressKey`。官方 `hypium/uidriver/arkuidriver.py` 声明 `triggerKey`、`triggerCombineKeys`、`pressBack`;其 Home 包装存在 `UiDriver.pressHome` 命名差异,因此仍应按当前设备能力验证客户端使用的 `Driver.pressHome`。[官方 Hypium wheel](https://files.pythonhosted.org/packages/b4/dc/f3b0abf2c518d11d57d8e9487026c133cc7eb0e3479af4b90d13c6db6169/hypium-6.1.0.210-py3-none-any.whl)、[客户端按键调用](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/driver.py#L712) + +官方 Python 的 `Driver.inputText` 参数为 `[{"x":x,"y":y},"text"]`,有定位输入的语义;它并不是已确认的 `Gestures` 当前光标文字接口。公开客户端对当前焦点使用 `uitest uiInput text `。当前阶段保留已有验证的文字通道,可避免引入未经验证的光标、追加与清空语义。[当前焦点输入](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/driver.py#L1487) + +停止时在采集连接发送 `method: "Captures"`、`params: {"api":"stopCaptureScreen","args":{}}`,随后关闭 socket、停止本机接收线程、移除本会话转发。若启用设备守护进程清理,仅结束自己创建并持有身份的进程,不使用 `killall uitest`。主机解码与渲染只保留最新完整帧;静止画面没有新帧不应误判断线,可用独立控制通道探活。[停止实现](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/screenshot_stream.py#L565) + +`startCaptureScreen` 是 agent 提供的 RPC 名称,**不是**设备 `uitest help` 中能直接运行的 CLI 子命令。设备帮助没有它,不证明公开 agent 不能提供它。 + +## 画面变化、帧率与保活 + +公开 UITest `screen_copy.cpp` 的采集线程调用 `DisplayManager::GetScreenshot`,通过 `memcmp` 比较前后像素,只有变化才通知 JPEG 编码线程。屏幕关闭时提供黑色画面并暂停常规采集,50 ms 的 `usleep` 仅用于检查关闭的屏幕是否重新亮起,**不能据此推算正常采集被限制在 20 fps**。常规采集循环没有显式 fps 计时上限,编码线程取最新帧。商业 agent 未提供其 C++ 源码,此处解释公开 UITest 实现,不能当作官方 v1.2.2 每一项内部行为均相同的证明;本机静止画面不连续发帧与这套行为一致。[变化检测与屏幕关闭](https://github.com/openharmony/testfwk_arkxtest/blob/b04e30c40cf266c9abfbd52933e43a0456eb99a2/uitest/addon/screen_copy.cpp#L153)、[消费最新帧](https://github.com/openharmony/testfwk_arkxtest/blob/b04e30c40cf266c9abfbd52933e43a0456eb99a2/uitest/addon/screen_copy.cpp#L245) + +核查的公开扩展与客户端只暴露 `displayId`、`scale`,没有可据以实现的 fps 或 JPEG quality 参数。`scale` 在获取原屏截图后缩放像素,能降低输出尺寸与编码、传输成本,但不消除原屏截图成本。Devhelmkit 的 `MAX_RECORD_FPS=30` 只约束事后 MP4 合成,与实时采集上限无关。不要把虚构的 `fps:60` 参数加入产品后声称已提速。[缩放位置](https://github.com/openharmony/testfwk_arkxtest/blob/b04e30c40cf266c9abfbd52933e43a0456eb99a2/uitest/addon/screen_copy.cpp#L221)、[实际采集参数](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/screenshot_stream.py#L670) + +参考客户端的采集 socket 连接后设为阻塞读取,没有周期发送采集心跳;尚无“必须在采集 socket 定期发送心跳”的源码证据。可保留本机读取超时用来检查取消状态,但超时本身不应标为失败;用独立控制连接的 `Driver.getDisplaySize` 区分静态画面与设备失联。若控制连接也无响应、TCP 关闭或 HDC 确认失联,再终止会话。[socket 建立与持续读取](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/src/devhelmkit/harmony/screenshot_stream.py#L651) + +## 两个开源客户端的来源核对 + +| 项目 | 本轮源码与文件核对 | 结论 | +| --- | --- | --- | +| `yabi-zzh/devhelmkit` | Apache 2.0;有连续 JPEG、独立控制 socket、down/move/up 和采集帧率统计;仓库 `agent_v2.so` SHA256 与本次官方 wheel 的 agent 不一致。 | 可参考其客户端协议,不把其未核清来源的 blob 作为发行原件。 | +| `yiyifred/Cloud-Phone` | Apache 2.0;包含 `uitest_agent_v1.1.10.so`,其 SHA256 **完全匹配**官方 wheel v1.1.10;`Gestures` 代码注释中的 ECHO/hdckit 指同类 RPC 操作,并不是设备原生内置 H.264 服务。 | 证明实际客户端采用 Hypium agent;其旧 agent/TCP 假设不能直接用于当前设备。 | + +[devhelmkit 许可](https://github.com/yabi-zzh/devhelmkit/blob/05c9bc0f7f9ea763d61c8b4b5d1cfbb076626b00/LICENSE)、[Cloud-Phone agent](https://github.com/yiyifred/Cloud-Phone/blob/98d130b20474cf8b18d51161d3bb0b65472c4778/backend/assets/harmony/uitest_agent_v1.1.10.so)、[Cloud-Phone RPC](https://github.com/yiyifred/Cloud-Phone/blob/98d130b20474cf8b18d51161d3bb0b65472c4778/backend/node/src/services/harmony-cast/uitest-rpc.js)、[Cloud-Phone 许可](https://github.com/yiyifred/Cloud-Phone/blob/98d130b20474cf8b18d51161d3bb0b65472c4778/LICENSE) + +## H.264 与其他路径的边界 + +同一官方资源 wheel 包含 `devicetest/res/recorder/libscrcpy_server1.z.so` 到 `libscrcpy_server4.z.so`。其 `controllers/tools/recorder/record_agent.py` 推送为 `/data/local/tmp/libscreen_recorder.z.so`,通过 UITest extension 启动,参数为 `-p -m 1 -screenId `,默认 gRPC 端口 5001;对应 `rpc_manager.py` 和生成的 protobuf 定义含 `ScrcpyService/onStart`、`onEnd`、`onRequestIDRFrame`。当前 Python 调用方主要用于步骤视频,停止后拉取 `mytest.mp4`。**仅凭资源名不能认定它是可直接使用的实时 H.264 投屏服务**;格式、stream payload 与当前固件兼容性仍需专门验证。它不是本轮 JPEG 路线的前置条件。[官方资源 wheel](https://pypi.org/project/xdevice-devicetest/6.1.0.210/) + +设备内置 UITest 公开 CLI 的 screenCap 是单张 PNG,uiRecord 是操作记录,start-daemon 是测试服务入口;不提供已确认的直接视频 stdout 命令。官方系统录屏组件的公开流程是录制后导出文件。对已经确认不存在的 `screenrecord`,不应反复尝试 Android 参数。[UITest 命令](https://github.com/openharmony/docs/blob/f41b9345badd47c7ab0c263344cd7f4b5a549afb/zh-cn/application-dev/application-test/uitest-guidelines.md)、[官方系统录屏](https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-screen-recording) + +自编 ELF 的执行权限错误与自编 addon 的 XPM 加载拒绝已由主任务复现;它们不应作为继续尝试关闭 XPM、SELinux、root 或借用私人签名的理由。公开 Hypium 原件是另一条正常工具分发与加载链路,需按原件、版本、协议重新验证。 + +## 产品验收与明确未知 + +- 当前证据确认公开来源、许可文件、官方选择和加载方式,以及开源客户端连续帧/触控协议;主任务已验证当前手机原件加载、Unix socket、Driver 初始化、JPEG 解码与屏幕尺寸查询。 +- 初测黑帧只证明连通,仍需设备解锁后的真实内容与交互画面验证;不得把收到 JPEG 等同于已达到 scrcpy 的流畅体验。 +- 用手机实际动画/滑动测量收到与呈现的帧率,独立记录排队及输入往返;静止画面频率不能当作最大帧率。没有实际结果前不承诺 30/60 fps。 +- 验证拖动跟手、旋转后的物理坐标、拒绝/断开、停止后不再采集与控制,以及重复启动清理;不影响其他使用 UITest 的工具。 +- 未确认 `Captures/Gestures` 跨版本稳定性;应固定已验收的 agent,报告能力与错误,避免无提示降为旧截图模式。 + +最终用户流程可以保持“连接 USB → 允许调试 → 开始投屏”。官方 agent 的获取、校验、部署、转发和清理应由插件完成,不能再把开发者账号或 HAP 签名作为该流程的要求。 diff --git a/docs/research/harmony-realtime-stream.md b/docs/research/harmony-realtime-stream.md index 21778e9..6ebb676 100644 --- a/docs/research/harmony-realtime-stream.md +++ b/docs/research/harmony-realtime-stream.md @@ -1,5 +1,7 @@ # Harmony Connector 实时视频流调研 +> 历史方案记录:本文的 H.264/HAP 实验已停止,实验源码和账号签名流程已移除。当前采用无需用户开发者账号的[官方 Hypium/HDC 路线](harmony-hdc-only-screen.md),状态及验证命令见[持续投屏开发验证](../harmony-realtime-development.md)。下文的早期“无安装”失败仅涉及自编未签名原件,不能推导为必须安装 HAP。 + 调研日期:2026-09-10。承接 [投屏与控制调研](harmony-screen-control.md),本篇只核查替换逐张截图链路所需的公开 API、进程授权和构建条件。文献研究与本机集成验证分别记录;尚未验证真机 H.264 视频性能。 ## 结论与实现顺序 @@ -140,7 +142,7 @@ devecocli build --modules entry --build-mode debug UITest addon 未进入 `OnInit`。随后读取设备日志确认:MUSL-LDSO 报 `Xpm check failed`、`errno for mmap is:13`,UiTestKit_Addon 的 `dlopen` 返回 `Permission denied`。这将本次失败定位到临时未签名模块的加载校验,不能解释为 ABI 不兼容;没有尝试关闭或绕过 XPM。临时程序、模块和手机上的本会话文件均已清理。 -华为公开 LLDB 调试矩阵将 user 镜像、SELinux 开启场景的支持范围列为签名 debug HAP;并区分其与 root 镜像上的普通可执行文件调试。它与上述限制相符,但不能仅凭该文档判定具体拒绝来自 SELinux、代码签名还是其他策略。继续走正常应用签名路径,不以关闭安全策略推进。[华为 Native 调试条件](https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/debug-lldb) +华为公开 LLDB 调试矩阵将 user 镜像、SELinux 开启场景的支持范围列为签名 debug HAP;并区分其与 root 镜像上的普通可执行文件调试。它与上述限制相符,但不能仅凭该文档判定具体拒绝来自 SELinux、代码签名还是其他策略。当时选择了普通应用签名实验;该路线随后已停止,当前改用官方分发且无需用户签名的 Hypium 代理。[华为 Native 调试条件](https://developer.huawei.com/consumer/cn/doc/doccenter-capabilities/debug-lldb) ## 最小验收 @@ -156,4 +158,4 @@ UITest addon 未进入 `OnInit`。随后读取设备日志确认:MUSL-LDSO 报 集成方已创建普通手机应用 `ink.render.trove.harmonyconnector`,实现系统授权的 Surface 采集、H.264 编码、带会话校验的 loopback TCP 和停止收尾。官方 CLI 已成功构建 ArkTS 与 arm64-v8a native 模块并生成未签名 HAP。独立 Mac 接收器的 8 项测试通过,其中生成的 20 帧视频经过真实 H.264 解码全部返回。 -官方 CLI 登录成功,但签名预检返回账号尚未完成开发者实名认证,未生成真机可安装的调试签名。因此未安装组件、未取得手机视频流,插件播放器集成、旋转重建和端到端时延验收仍未完成。源码和可复现命令见[开发验证说明](../harmony-realtime-development.md)。 +最初签名预检被账号认证状态阻塞;用户认证并刷新官方授权后,曾成功生成正常调试签名、构建并安装 HAP,收到首个 H.264 帧。接收器在第一帧统计时发生除零错误,故没有取得持续帧率或端到端延迟结果。随后按用户要求停止 HAP 路线,实验源码已从主分支移除;历史实现保留于提交 `ca382e6`。当前无需账号的实现和验证状态见[开发验证说明](../harmony-realtime-development.md)。 diff --git a/tools/harmony-stream.py b/tools/harmony-stream.py deleted file mode 100644 index 6adbab4..0000000 --- a/tools/harmony-stream.py +++ /dev/null @@ -1,233 +0,0 @@ -#!/usr/bin/env python3 -"""Measure the companion's HCS1 video stream; no screenshots/files are retained. - -Development tool, not the plugin's production player. Requires official HDC, -the signed companion on the phone, and ffmpeg (or ffplay with --view). -""" -import argparse -import json -import os -from pathlib import Path -import re -import secrets -import select -import shutil -import socket -import struct -import subprocess -import threading -import time - -BUNDLE = "ink.render.trove.harmonyconnector" -MAX_PACKET = 2 * 1024 * 1024 - - -def read_exact(sock, size, deadline): - result = bytearray() - while len(result) < size: - remaining = deadline - time.monotonic() - if remaining <= 0: - raise TimeoutError("Video stream timed out") - sock.settimeout(min(remaining, 0.2)) - try: - part = sock.recv(size - len(result)) - except socket.timeout: - continue - if not part: - raise EOFError("Screen sharing stopped or USB disconnected") - result.extend(part) - return bytes(result) - - -def read_hello(sock, deadline): - magic, width, height, display_width, display_height, fps = struct.unpack( - ">4s5I", read_exact(sock, 24, deadline)) - if (magic != b"HCS1" or not 1 <= fps <= 60 or - not all(2 <= d <= 8192 for d in (width, height, display_width, display_height)) or - width % 2 or height % 2 or max(width, height) > 1280): - raise ValueError("Unsupported stream header") - return {"width": width, "height": height, "displayWidth": display_width, - "displayHeight": display_height, "configuredFps": fps} - - -def read_packet(sock, deadline): - size, flags, pts = struct.unpack( - ">IIq", read_exact(sock, 16, deadline)) - if not 0 < size <= MAX_PACKET or flags & ~0x7f or pts < 0: - raise ValueError("Invalid video packet") - data = read_exact(sock, size, deadline) - if not data.startswith((b"\0\0\1", b"\0\0\0\1")): - raise ValueError("Encoder did not return Annex B H.264") - return flags, pts, data - - -class Decoder: - def __init__(self, view): - name = "ffplay" if view else "ffmpeg" - executable = shutil.which(name) - if not executable: - raise RuntimeError(f"Development measurement requires {name} on PATH") - args = [executable, "-hide_banner", "-loglevel", "error", - "-flags", "low_delay", "-probesize", "32", "-analyzeduration", "0", - "-f", "h264", "-i", "pipe:0"] - if view: - args += ["-window_title", "Harmony Connector · H.264 preview", "-autoexit"] - else: - args += ["-progress", "pipe:1", "-stats_period", "0.25", "-f", "null", "-"] - self.frames = 0 - self.error = bytearray() - self.process = subprocess.Popen(args, stdin=subprocess.PIPE, - stdout=subprocess.PIPE, stderr=subprocess.PIPE) - os.set_blocking(self.process.stdin.fileno(), False) - self.threads = [threading.Thread(target=self.progress, daemon=True), - threading.Thread(target=self.errors, daemon=True)] - for thread in self.threads: - thread.start() - - def progress(self): - for line in self.process.stdout: - if line.startswith(b"frame="): - self.frames = int(line.split(b"=", 1)[1]) - - def errors(self): - for line in self.process.stderr: - if len(self.error) < 8192: - self.error.extend(line[:8192 - len(self.error)]) - - def write(self, data): - deadline = time.monotonic() + 1 - view = memoryview(data) - while view: - if self.process.poll() is not None: - raise RuntimeError("Video decoder exited: " + self.error.decode(errors="replace")) - if time.monotonic() >= deadline: - raise TimeoutError("Decoder is falling behind; stopped instead of queuing video") - if not select.select([], [self.process.stdin], [], 0.05)[1]: - continue - try: - count = os.write(self.process.stdin.fileno(), view) - view = view[count:] - except BlockingIOError: - continue - - def close(self): - self.process.stdin.close() - try: - self.process.wait(timeout=3) - except subprocess.TimeoutExpired: - self.process.terminate() - try: - self.process.wait(timeout=1) - except subprocess.TimeoutExpired: - self.process.kill() - self.process.wait() - for thread in self.threads: - thread.join(timeout=1) - self.process.stdout.close() - self.process.stderr.close() - - -def main(): - parser = argparse.ArgumentParser(description=__doc__) - parser.add_argument("--hdc", required=True, type=Path) - parser.add_argument("--target") - parser.add_argument("--seconds", type=int, default=20) - parser.add_argument("--view", action="store_true") - args = parser.parse_args() - if not 5 <= args.seconds <= 120 or not args.hdc.is_file(): - parser.error("Use an existing HDC executable and 5–120 measurement seconds") - - def hdc(*command): - try: - result = subprocess.run([str(args.hdc.resolve()), *command], capture_output=True, - text=True, timeout=10, check=False) - except subprocess.TimeoutExpired: - raise RuntimeError("HDC command timed out") from None - if result.returncode: - raise RuntimeError("HDC command did not complete successfully") - if re.search(r"\b(fail(?:ed)?|error)\b", result.stdout + result.stderr, re.I): - raise RuntimeError("HDC command failed: " + result.stdout + result.stderr) - return result.stdout - - targets = [line.split()[0] for line in hdc("list", "targets", "-v").splitlines() - if "Connected" in line.split()] - target = args.target or (targets[0] if len(targets) == 1 else None) - if target not in targets: - raise RuntimeError("Select one connected, authorized phone with --target") - installed = hdc("-t", target, "shell", f"bm dump -n {BUNDLE}") - if BUNDLE not in installed: - raise RuntimeError("Install the signed Harmony Connector companion before measuring") - decoder = Decoder(args.view) - sock = None - forward = False - with socket.socket() as reservation: - reservation.bind(("127.0.0.1", 0)) - local_port = reservation.getsockname()[1] - remote_port = 20000 + secrets.randbelow(40000) - local, remote = f"tcp:{local_port}", f"tcp:{remote_port}" - token = secrets.token_hex(32) - frames = total_bytes = 0 - started = first_frame = None - try: - hdc("-t", target, "fport", local, remote) - forward = True - hdc("-t", target, "shell", f"aa start -b {BUNDLE} -a EntryAbility -m entry " - f"--ps token {token} --pi port {remote_port}") - print("请在手机点击「共享屏幕」,并同意系统授权。", flush=True) - deadline = time.monotonic() + 90 - while time.monotonic() < deadline: - try: - sock = socket.create_connection(("127.0.0.1", local_port), timeout=1) - sock.sendall(token.encode("ascii")) - hello = read_hello(sock, min(deadline, time.monotonic() + 2)) - break - except (OSError, EOFError, TimeoutError): - if sock: - sock.close() - sock = None - time.sleep(0.2) - if not sock: - raise TimeoutError("Phone did not start screen sharing") - print(json.dumps({"stage": "connected", **hello}), flush=True) - started = time.monotonic() - last_report = started - while first_frame is None or time.monotonic() - first_frame < args.seconds: - flags, _, data = read_packet(sock, time.monotonic() + (45 if first_frame is None else 3)) - decoder.write(data) - total_bytes += len(data) - now = time.monotonic() - if not flags & 8: - frames += 1 - if first_frame is None: - first_frame = now - print(json.dumps({"stage": "first-frame", "waitMs": round((now - started) * 1000)}), flush=True) - if first_frame and now - last_report >= 1: - elapsed = now - first_frame - print(json.dumps({"stage": "receiving", "frames": frames, - "receivedFps": round((frames - 1) / elapsed, 1), - "decodedFrames": decoder.frames, - "mbps": round(total_bytes * 8 / elapsed / 1000000, 2)}), flush=True) - last_report = now - elapsed = time.monotonic() - first_frame - finally: - if sock: - try: - sock.sendall(b"\0") - except OSError: - pass - sock.close() - try: - if forward: - hdc("-t", target, "fport", "rm", local, remote) - finally: - decoder.close() - passed = (frames - 1) / elapsed >= 20 and (args.view or decoder.frames >= frames * 0.95) - print(json.dumps({"passed": passed, "frames": frames, "decodedFrames": decoder.frames, - "receivedFps": round((frames - 1) / elapsed, 1), "durationSeconds": round(elapsed, 2), - "endToEndLatencyMeasured": False, "inputSent": False, "screenFilesSaved": False}), flush=True) - if not passed: - raise SystemExit(1) - - -if __name__ == "__main__": - main() diff --git a/tools/harmony-stream.test.py b/tools/harmony-stream.test.py deleted file mode 100644 index 5ad7fac..0000000 --- a/tools/harmony-stream.test.py +++ /dev/null @@ -1,87 +0,0 @@ -import importlib.util -from pathlib import Path -import re -import shutil -import socket -import struct -import subprocess -import time -import unittest - -spec = importlib.util.spec_from_file_location("harmony_stream", Path(__file__).with_name("harmony-stream.py")) -stream = importlib.util.module_from_spec(spec) -spec.loader.exec_module(stream) - - -class StreamProtocolTests(unittest.TestCase): - def setUp(self): - self.sender, self.receiver = socket.socketpair() - self.deadline = time.monotonic() + 1 - - def tearDown(self): - self.sender.close() - self.receiver.close() - - def test_negotiated_dimensions(self): - self.sender.sendall(struct.pack(">4s5I", b"HCS1", 566, 1280, 1260, 2844, 30)) - hello = stream.read_hello(self.receiver, self.deadline) - self.assertEqual((hello["width"], hello["displayHeight"], hello["configuredFps"]), (566, 2844, 30)) - - def test_unknown_version_rejected(self): - self.sender.sendall(struct.pack(">4s5I", b"HCS2", 640, 480, 1280, 960, 30)) - with self.assertRaises(ValueError): - stream.read_hello(self.receiver, self.deadline) - - def test_dimensions_bounded_before_video_allocations(self): - self.sender.sendall(struct.pack(">4s5I", b"HCS1", 65536, 480, 1280, 960, 30)) - with self.assertRaises(ValueError): - stream.read_hello(self.receiver, self.deadline) - - def test_oversized_packet_rejected_without_reading_payload(self): - self.sender.sendall(struct.pack(">IIq", stream.MAX_PACKET + 1, 2, 0)) - with self.assertRaises(ValueError): - stream.read_packet(self.receiver, self.deadline) - - def test_disconnect_in_packet_is_not_a_frame(self): - self.sender.sendall(struct.pack(">IIq", 32, 2, 42) + b"\0\0\1\x65") - self.sender.shutdown(socket.SHUT_WR) - with self.assertRaises(EOFError): - stream.read_packet(self.receiver, self.deadline) - - def test_silent_connection_has_bounded_wait(self): - with self.assertRaises(TimeoutError): - stream.read_packet(self.receiver, time.monotonic() + 0.02) - - def test_non_h264_payload_rejected(self): - self.sender.sendall(struct.pack(">IIq", 8, 2, 42) + b"JPEGdata") - with self.assertRaises(ValueError): - stream.read_packet(self.receiver, self.deadline) - - @unittest.skipUnless(shutil.which("ffmpeg"), "ffmpeg required for actual decoder validation") - def test_twenty_generated_frames_survive_transport_and_decode(self): - encoded = subprocess.run([ - "ffmpeg", "-hide_banner", "-loglevel", "error", "-f", "lavfi", "-i", - "testsrc2=size=160x96:rate=30", "-frames:v", "20", "-c:v", "libx264", - "-preset", "ultrafast", "-tune", "zerolatency", "-profile:v", "baseline", - "-g", "10", "-bf", "0", "-x264-params", "aud=1:repeat-headers=1", - "-f", "h264", "pipe:1"], capture_output=True, check=True, timeout=10).stdout - # Access unit delimiters separate independently timestamped encoder callbacks. - boundaries = [match.start() for match in re.finditer(b"\x00\x00\x00\x01\x09", encoded)] - self.assertEqual(len(boundaries), 20) - decoder = stream.Decoder(False) - try: - for index, (start, end) in enumerate(zip(boundaries, boundaries[1:] + [len(encoded)])): - data = encoded[start:end] - flags = 2 if index % 10 == 0 else 0 - self.sender.sendall(struct.pack(">IIq", len(data), flags, index * 33333) + data) - actual_flags, pts, actual_data = stream.read_packet(self.receiver, time.monotonic() + 1) - self.assertEqual((actual_flags, pts), (flags, index * 33333)) - decoder.write(actual_data) - finally: - decoder.close() - self.assertEqual(decoder.process.returncode, 0, decoder.error.decode()) - self.assertEqual(decoder.frames, 20, decoder.error.decode()) - - -if __name__ == "__main__": - unittest.main() diff --git a/tools/harmony-ui.test.mjs b/tools/harmony-ui.test.mjs index 723d672..bcf7710 100644 --- a/tools/harmony-ui.test.mjs +++ b/tools/harmony-ui.test.mjs @@ -59,6 +59,7 @@ async function app(t) { screenControl: false, screenFrameWait: null, screenFrameError: null, + screenUnchanged: false, openedUrls: [], selectedDirectory: "/fixture/folder", configureError: null, @@ -105,11 +106,23 @@ async function app(t) { handler("hdc.screenFrame", async () => { if (model.screenFrameWait) await model.screenFrameWait; if (model.screenFrameError) throw model.screenFrameError; + if (model.screenUnchanged && model.screenSequence) + return { + unchanged: true, + width: 1200, + height: 2400, + sequence: model.screenSequence, + geometry: model.screenGeometry, + control: model.screenControl, + receivedFps: 0, + mbps: 0, + }; return { dataUrl: "data:image/jpeg;base64,/9j/2Q==", width: 1200, height: 2400, - captureMs: 300, + receivedFps: 27, + mbps: 3.2, sequence: ++model.screenSequence, geometry: model.screenGeometry, control: model.screenControl, @@ -473,7 +486,7 @@ test("device disconnect clears app details and prevents stale target operations" assert.equal($("app-launch").disabled, true); }); -test("screen viewing starts read-only, keeps refreshing and reports measured capture time", async (t) => { +test("screen viewing starts read-only, keeps refreshing and reports stream throughput", async (t) => { const { $, click, tick, model } = await app(t); model.hdcAvailable = true; await click("tab-management"); @@ -482,7 +495,10 @@ test("screen viewing starts read-only, keeps refreshing and reports measured cap await tick(); assert.equal($("screen-image").hidden, false); assert.match($("screen-status").textContent, /仅观看/); - assert.match($("screen-stats").textContent, /1200 × 2400.*300 ms/); + assert.match( + $("screen-stats").textContent, + /1200 × 2400.*接收 27 帧\/秒.*3.2 Mbps/, + ); assert.equal($("screen-control").checked, false); assert.equal($("app-install").disabled, true); const before = model.screenSequence; @@ -516,6 +532,52 @@ test("screen text and navigation require enabled control and use the displayed s assert.equal($("app-install").disabled, false); }); +test("an unchanged live screen preserves its image and does not count repeated frames", async (t) => { + const { $, click, tick, model } = await app(t); + model.hdcAvailable = true; + await click("tab-management"); + await click("screen-start"); + await tick(); + await click("screen-control"); + const source = $("screen-image").src; + const sequence = model.screenSequence; + model.screenUnchanged = true; + await tick(); + await tick(); + assert.equal($("screen-image").src, source); + assert.equal($("screen-image").hidden, false); + assert.equal(model.screenSequence, sequence); + assert.equal($("screen-control").checked, true); + assert.match($("screen-stats").textContent, /接收 0 帧\/秒/); + assert.ok(!model.calls.includes("hdc.screenStop")); +}); + +test("control does not wait behind a pending video frame", async (t) => { + const { $, click, tick, model } = await app(t); + model.hdcAvailable = true; + await click("tab-management"); + await click("screen-start"); + await tick(); + await click("screen-control"); + let release; + model.screenFrameWait = new Promise((resolve) => { + release = resolve; + }); + await tick(); + $("screen-inputs").querySelector('[data-screen-key="home"]').click(); + await settle(); + assert.ok( + model.parameters.some( + ([name, params]) => + name === "hdc.screenInput" && params.input.key === "home", + ), + ); + release(); + model.screenFrameWait = null; + await settle(); + await click("screen-stop"); +}); + test("stopping during a pending frame discards that response and permits a fresh screen session", async (t) => { const { $, click, tick, model } = await app(t); model.hdcAvailable = true; diff --git a/curios/harmony-connector/companion/legal/Apache-2.0.txt b/vendor/harmony-connector/hypium/LICENSE similarity index 89% rename from curios/harmony-connector/companion/legal/Apache-2.0.txt rename to vendor/harmony-connector/hypium/LICENSE index d645695..f433b1a 100644 --- a/curios/harmony-connector/companion/legal/Apache-2.0.txt +++ b/vendor/harmony-connector/hypium/LICENSE @@ -175,28 +175,3 @@ of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/harmony-connector/hypium/provenance.json b/vendor/harmony-connector/hypium/provenance.json new file mode 100644 index 0000000..18a7d8e --- /dev/null +++ b/vendor/harmony-connector/hypium/provenance.json @@ -0,0 +1,10 @@ +{ + "package": "xdevice-devicetest", + "version": "6.1.0.210", + "url": "https://files.pythonhosted.org/packages/a2/b5/55bdfe4d669558331499848dbc68269506abb9b4a771e3524a65f9845127/xdevice_devicetest-6.1.0.210-py3-none-any.whl", + "wheelSha256": "1c80f0da8d497d4e034f9873e966e8b2d8ef23ecc376c64c839c1493a813980e", + "member": "devicetest/res/prototype/native/uitest_agent_v1.2.2.so", + "sha256": "e1b8e75fad983aa29640784ee4b457fe7ac1c916a15f72c8b899d5a7716da651", + "license": "Apache-2.0", + "modified": false +} diff --git a/vendor/harmony-connector/hypium/uitest_agent_v1.2.2.so b/vendor/harmony-connector/hypium/uitest_agent_v1.2.2.so new file mode 100644 index 0000000000000000000000000000000000000000..d54e0a98c6effbc4fb97b6ff0f129ec195f54207 GIT binary patch literal 600245 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 z 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⋘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 z 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∋5e%klWdp&&OZAYK;YEJlLX6238PRx5+h#tDVdEzYgY~Rnjkd)^>7oM{1W|iSJMH1pt1S5R8wXk6#2SUx8oEf6*rL1PK4o zGX`f61dS2h0u543EIHjA!B0kK*cOH3@8?tCl9QD9M1z~#+qU<9(Z#dJX+A3zv{{@D zr4x$&S-N{1p_GvZv)5=6ai~-)p3W=hS>?&_O07FT?bk(fyRrSn$Lriw$laLt$e?O< z<#zeE90Z6IK!C3QmE3cp?;qZ8aEao0$l@BH95)v?jTG-6a{rsVf#6C=#8)!K0ML=A zzhD2B$PK`4iHt`Uf2Dq8>;Ke02oreloBmA!W56)eAX7g~@6Y=GU;MZsgOxqpofoNi zMO%BgypxyXmHMSD;jZpJ&Tt7Bz{=~2RD`KD-(PmdubaRc4X^?Ob|45$TgR-BjM-VG z&R6ZG6ybt+!pn;s;|ao9$6Y>8#vKXH=FJRvWSZL^JH_=yF!0dUpd<0};0cvcUFB`= zkOneu#n5%*ZB4|ObZyc8?Bf|S#R|fQl^QVB{Qd6y9&;E1Uno9SFik47M`5CKzpH;jQ9eQFJdQf zOZ|Np-(R8u7@`QsgXyu~9-G?Dlk195MSydqaM^YT`3Ax}