Files
echolot/echolot-prober
Markus RambossekandClaude Opus 5 edcad3e539 prober: AGP 9.2 / Gradle 9.6 / Kotlin 2.2.10, targetSdk 36, build 5
Lifts the build off the JDK-21 ceiling — the old AGP 8.7.3 pin could not run
on JDK 25. Two AGP-9 migration edits were required:

- AGP 9 ships built-in Kotlin support, so applying org.jetbrains.kotlin.android
  alongside it fails with "extension with name kotlin already registered";
  the alias is dropped (kotlin.compose / kotlin.serialization stay, they are
  separate compiler plugins).
- kotlinOptions { jvmTarget } came from that plugin and no longer resolves;
  AGP derives jvmTarget from compileOptions instead.

compileSdk/targetSdk 35 -> 36, since Android Studio ships API 36.1 by default
and installing 35 was avoidable churn. versionCode 5 so the reports from this
toolchain are attributable (build 4 was already archived from the old one).

Also fixes a missing comma that left .claude/settings.json invalid JSON.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-07-30 17:34:54 +02:00
..

Echolot Capability Prober

A throwaway diagnostic app that runs the borderline no-root operations from the Echolot feasibility matrix on a real device and reports what actually works on that Android build. Its job is to turn "should work / needs verification" spec notes into observed facts before the production app hardens around them. Several probes naturally evolve into the tier-detection code the real app needs anyway.

Package / appId: app.echo_lot.prober (derived from the echo-lot.app domain; hyphen → underscore because Android application IDs and Java packages cannot contain hyphens).

What it probes

Probe Question it answers Expected result
link.snapshot What does LinkProperties expose per active network? SUPPORTED
icmp.ping4 / icmp.ping6 Does the unprivileged ICMP datagram socket work? SUPPORTED (no root needed)
sockopt.matrix Are IP_TTL, IP_TOS, IP_RECVERR, IP_MTU_DISCOVER accepted? SUPPORTED / PARTIAL
trace.errqueue_reachable Is errqueue traceroute reachable from the Os API? likely PARTIAL → needs a small native shim
multinetwork.request_and_bind Can we hold + bind Wi-Fi / cellular / ethernet concurrently? SUPPORTED for links present now
local.mdns_discover Does multicast reception / mDNS work with a MulticastLock? SUPPORTED
peer.ble_advertise Can this chipset advertise BLE (peer-mode channel)? device-dependent
shizuku.command_battery Does the Shizuku shell tier return neighbor table, RA routes, DHCP logs? SUPPORTED if Shizuku running

Each result carries a verdict (SUPPORTED / PARTIAL / UNSUPPORTED / INCONCLUSIVE / ERROR), a one-line summary, and raw evidence (sockopt return codes, addresses, timings, and the actual dump excerpts from the Shizuku commands — capturing the per-device format the real parsers must handle). Export the whole run as JSON with the Export button and share it anywhere.

Building

Needs Android Studio (Koala or newer) or a local Android SDK; this repo was scaffolded without network access to Google's Maven, so dependencies download on your first local build.

# Point the build at your SDK (or let Android Studio create local.properties):
echo "sdk.dir=/path/to/Android/sdk" > local.properties

./gradlew :app:assembleDebug
./gradlew :app:installDebug     # with a device/emulator attached

The debug APK lands in app/build/outputs/apk/debug/.

Using the Shizuku tier

  1. Install Shizuku and start it via wireless ADB pairing (no root).
  2. Launch the prober, tap Run all probes. The Shizuku probe requests permission on first use.
  3. If Shizuku isn't running the probe reports INCONCLUSIVE (everything else still runs).

Notes / known gaps

  • Errqueue traceroute (MSG_ERRQUEUE recvmsg + cmsg parse) is expected to need a native C-over-JNI shim; this prober only confirms the sockopts + call-path availability. Wiring the shim is the next spike if the verdict is PARTIAL.
  • Multi-network probe can only bind transports physically present at run time. To exercise USB ethernet, attach an adapter first.
  • BLE advertising support is genuinely chipset-dependent; a UNSUPPORTED here is a real finding.

License

GPL-3.0-or-later, like the rest of the Echolot code — see ../LICENSE. The specs in ../docs/ are CC-BY-4.0.

Relationship to the specs

Result IDs mirror the measurement-schema.md test-type registry where one exists, and the JSON report shape is a stripped-down cousin of the full measurement document. The specs live in ../docs/feature-catalog-and-feasibility.md, measurement-schema.md, probe-protocol.md.