Four passive collectors join long mode: SSDP (passive NOTIFY plus paced M-SEARCH from the capture socket, so unicast replies land in the same capture), LLMNR, NetBIOS-NS and WS-Discovery. All are periodic and sparse by nature, which is exactly why they belong to a window rather than a probe - a thirty-second run mostly hears silence and would report an empty network as confidently as a quiet one. NetBIOS reports unsupported on the app tier and says why: UDP 137 is privileged. The decoder and evidence shape are tested and waiting for the Shizuku tier; a recorded reason beats a missing test. Silence without a multicast lock or a group join is PARTIAL, never OK - that case is a fact about this app, not about the network. Hostnames, banners and device UUIDs are classified in core-privacy so the anonymizer treats them like every other identifier rather than letting a neighbour's device model ride out in an upload. No active WSD Probe and no NBSTAT sweep: the app listens to what a network broadcasts, it does not announce itself to strangers or interrogate its neighbours. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
37 lines
1.3 KiB
Kotlin
37 lines
1.3 KiB
Kotlin
// SPDX-FileCopyrightText: 2026 Echolot contributors
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
plugins {
|
|
// AGP 9 has built-in Kotlin — do NOT also apply kotlin.android (double-registers
|
|
// the `kotlin` extension). Only the serialization compiler plugin is added.
|
|
alias(libs.plugins.android.library)
|
|
alias(libs.plugins.kotlin.serialization)
|
|
}
|
|
|
|
// Device-tier probes (Android platform APIs), emitting core-measurement Test
|
|
// objects. Ported/adapted from the validated echolot-prober. minSdk 26 to
|
|
// match the prober and the feasibility findings.
|
|
android {
|
|
namespace = "app.echo_lot.probe"
|
|
compileSdk = 36
|
|
|
|
defaultConfig {
|
|
minSdk = 26
|
|
}
|
|
compileOptions {
|
|
sourceCompatibility = JavaVersion.VERSION_17
|
|
targetCompatibility = JavaVersion.VERSION_17
|
|
}
|
|
}
|
|
|
|
dependencies {
|
|
implementation(project(":core-measurement"))
|
|
implementation(libs.kotlinx.serialization.json)
|
|
implementation(libs.kotlinx.coroutines.android)
|
|
// JVM unit tests for the pure wire-format decoders (DiscoveryParsers.kt) against realistic and
|
|
// deliberately malformed payloads — no device, no Android runtime. Same setup as core-shizuku's
|
|
// dump-parser tests: JUnit 4, because that is what AGP's unit-test source set runs.
|
|
testImplementation(libs.kotlin.test.junit)
|
|
testImplementation(libs.junit4)
|
|
}
|