feat(adb): complete ADB device support for Android reverse engineering (#1552)

* feat(adb): acquire installed APK sets from connected Android devices

Add a read-only ADB device-acquisition family over the caller's adb binary:
inspect_adb_client, list_adb_devices, inspect_adb_device, list_adb_packages,
and pull_adb_package, exposed through the CLI and MCP with shared admission,
Evidence provenance (binary, version, serial, transport), and fixed argv
vectors that never reach a shell.

pull_adb_package acquires the complete split set reported by pm path into a
package-named directory that must not exist, digesting every file with
SHA-256 and keeping per-file failure reasons and partial coverage. Device
kind is reported as an inference with its basis; getprop whitelisting keeps
build identity bounded. REA installs nothing and never manages devices or
emulators; the first device query may start the caller's local adb server,
recorded when observed.

Verified against adb 34.0.5 on Linux with an Android 14 (API 34) x86_64
emulator: full 224-package inventory, a real two-APK split set pulled with
byte-exact digests, and a 73.9 MB system-package pull. npm run verify:adb
records the lane; parser goldens come from the same device. READMEs carry
the new row in every supported language.

* feat(adb): complete the adb surface with observation, transfer, and lifecycle tools

Extend the ADB family from five to twenty-four operations, all through
fixed adb argument vectors with no shell exposure:

Observation: read_adb_logcat (bounded dump, count/buffer/pid), inspect_adb_package
(dumpsys package projection), list_adb_processes (ps -A), list_adb_directory
(ls -la with kinds and symlink targets), list_adb_features (hex GL versions),
list_adb_services (AIDL slash-suffixed names), inspect_adb_display (wm size and
density), inspect_adb_window (focus declarations), read_adb_setting (device-side
nulls reported as such), capture_adb_screen (exec-out screencap with PNG
dimensions), collect_adb_bugreport (digested device archive).

Transfer and search: pull_adb_file and push_adb_file (device-side sha256sum
verification, explicit overwrite authority), resolve_adb_packages (substring
package search with exact-match flag — the find step of an easy get).

Lifecycle for dynamic analysis, each declaring mutatesTarget:
install_adb_package and uninstall_adb_package preserving the device's
Success/Failure verdict, start_adb_app (resolve-activity then am start -W),
start_adb_activity (typed extras as --es/--ez/--ei/--el/--ef), and stop_adb_app
(am force-stop).

Verified end-to-end against adb 34.0.5 on Linux with an Android 14 (API 34)
x86_64 emulator: 287 services, 92 features, split-set pulls with byte-exact
digests, verified push/pull roundtrip, sized screen capture, and the full
install → resolve → start → observe-in-ps → force-stop → uninstall lifecycle.
Fixed a v-mode regex incompatibility in the settings key pattern and added
argument descriptions required by the CLI catalog audit.

* fix(adb): quote remote shell operands and protect captured output

* test(adb): cover bugreport destinations containing spaces

---------

Co-authored-by: REA Contributor <contributor@rea.tools>
Co-authored-by: morluto <76467478+morluto@users.noreply.github.com>
This commit is contained in:
authored and GitHub committed 2026-10-10 23:01:24 +08:00
1 parent efd81f9776
commit fef6f73064
48 files changed
+6862 -1

No files matched your search

+24
View File
@@ -45,6 +45,30 @@ export const CLI_COMMANDS = Object.freeze({
inspectFirmwareRegions: "inspect-firmware-regions",
extractFirmware: "extract-firmware",
inspectAndroidPackage: "inspect-android-package",
inspectAdbClient: "inspect-adb-client",
listAdbDevices: "list-adb-devices",
inspectAdbDevice: "inspect-adb-device",
listAdbPackages: "list-adb-packages",
pullAdbPackage: "pull-adb-package",
readAdbLogcat: "read-adb-logcat",
inspectAdbPackage: "inspect-adb-package",
pullAdbFile: "pull-adb-file",
pushAdbFile: "push-adb-file",
captureAdbScreen: "capture-adb-screen",
listAdbProcesses: "list-adb-processes",
listAdbDirectory: "list-adb-directory",
listAdbFeatures: "list-adb-features",
listAdbServices: "list-adb-services",
inspectAdbDisplay: "inspect-adb-display",
inspectAdbWindow: "inspect-adb-window",
readAdbSetting: "read-adb-setting",
collectAdbBugreport: "collect-adb-bugreport",
resolveAdbPackages: "resolve-adb-packages",
installAdbPackage: "install-adb-package",
uninstallAdbPackage: "uninstall-adb-package",
startAdbApp: "start-adb-app",
startAdbActivity: "start-adb-activity",
stopAdbApp: "stop-adb-app",
searchAndroidClasses: "search-android-classes",
inspectAndroidClass: "inspect-android-class",
inspectAndroidMethod: "inspect-android-method",