Files
SteamFramelyHomebrew--framely/native/android
toorux d4af27d63b Add in-headset review for app-requested APK updates
Intercept content, file and PackageInstaller requests in managed Lepton containers and route retained APKs through the normal review, backup and installation flow. Persist presentation receipts, retry delivery, and reopen repeated requests without duplicating packages.

Use authenticated localized update windows with visible laser cursors, and switch native Steam runtime aliases back to stable context names for installation. Verified all three request paths and a live Steam-runtime reinstall on Frame with backup creation and unchanged save data.
2026-10-24 22:05:47 +08:00
..

Android task window helper

FramelyWindow.java uses the Android 11 task service to put only the requested package's foreground task into fullscreen. A startup windowing-mode option alone can leave a restored Lepton task in freeform mode. This helper changes task mode without stopping the game or changing its installation, data, Android image or host compositor. VR launches do not invoke it. It exits after success or a bounded five-second wait; it does not prevent later manual window adjustments.

The small checked-in DEX is embedded in Framely. window.sh supplies ART's runtime environment for podman exec; both files are mounted read-only into the container. No APK installation or network access is required at runtime. An unsupported task API fails explicitly instead of guessing Binder transaction numbers.

Rebuild with bash tools/build-android-window.sh (JDK and curl required). This uses Google's D8 8.3.37, pinned by SHA-256. D8 is a build tool and is not shipped.

中文

FramelyWindow.java 通过 Android 11 的任务接口,只将指定包的前台任务切换为全屏。 Lepton 恢复已有任务时,仅指定启动窗口模式仍可能留下自由窗口。此助手不停止游戏, 不修改安装、数据、Android 镜像或宿主合成器。VR 启动不调用助手。成功后立即退出, 等待最多五秒,不持续限制用户之后手动调整窗口。

小型 DEX 随 Framely 内置;window.sh 为 podman exec 补充 ART 运行环境。二者以 只读方式挂载,运行时无需安装 APK 或联网。不支持的任务接口会明确失败,不猜测 Binder 调用编号。

执行 bash tools/build-android-window.sh 可重新生成,需要 JDK 和 curl。 构建使用 Google D8 8.3.37,并校验固定 SHA-256;安装包不包含 D8。

APK update interception

FramelyUpdates.java runs as Android root inside Framely-launched Lepton containers. The private launch adapter mounts the helper and a package allowlist read-only, redirects Lepton's VIEW pipe to a bounded reader, and retains the original pipe for unrelated links. Android's activity controller intercepts installer intents and pending PackageInstaller confirmations. Complete, single-package APKs are retained in a private host queue; review and installation use Framely's existing APK manager. No system image, host root daemon or runtime JDK is required.

The helper targets Android 11's Binder APIs. If startup fails, its supervisor forwards URI requests through the original Steam pipe. Split APK, multi-package and staged sessions are reported as unsupported rather than partially installed. The controller does not intercept privileged silent package-manager installations. Source URIs, credentials and tokens are never written to the queue or its logs.

Rebuild the embedded DEX with bash tools/build-android-updates.sh. Android SDK platform 30 and D8 are downloaded with pinned SHA-256 checksums at build time only.