-
public final class DeviceSignalsWhat the collector observed about this device.
Every field is nullable and every field means three things, not two:
true,false, andnullfor "could not determine". That distinction is load bearing. A signal that collapses an honestfalseinto "absent" destroys its own denominator, and you can no longer compute a rate for it at all. We have already paid for that lesson once server-side, whereosMismatchrecorded 121 rows, all of them true, across 12,172 devices, becausefalse || false || undefinedisundefined. Send the boolean you actually measured.
-
-
Field Summary
Fields Modifier and Type Field Description private final BooleanisEmulatorprivate final BooleanisRootedprivate final BooleanisClonedprivate final BooleanisHookedprivate final BooleanisSideloadedprivate final BooleanisAdbEnabledprivate final BooleanisMockLocationprivate final BooleanisVpnActiveprivate final BooleanisDebuggableprivate final BooleanisAutoTimeOff
-
Method Summary
Modifier and Type Method Description final BooleangetIsEmulator()running under an emulator (BlueStacks, LDPlayer, Nox, the AVD) final BooleangetIsRooted()root is present: su, Magisk, or a test-keys build final BooleangetIsCloned()an app-cloning container (Parallel Space, Island, Dual Space) final BooleangetIsHooked()live instrumentation: Frida, Xposed, LSPosed final BooleangetIsSideloaded()installed from something other than the Play Store final BooleangetIsAdbEnabled()USB debugging enabled in developer settings final BooleangetIsMockLocation()a mock location provider is active final BooleangetIsVpnActive()the active network is a VPN transport final BooleangetIsDebuggable()the app manifest carries android:debuggable final BooleangetIsAutoTimeOff()Automatic network time is OFF, so the wall clock is whatever the user set. final Map<String, Boolean>toWireMap()Beacon wire form. -
-
Method Detail
-
getIsEmulator
final Boolean getIsEmulator()
running under an emulator (BlueStacks, LDPlayer, Nox, the AVD)
-
getIsRooted
final Boolean getIsRooted()
root is present: su, Magisk, or a test-keys build
-
getIsCloned
final Boolean getIsCloned()
an app-cloning container (Parallel Space, Island, Dual Space)
-
getIsHooked
final Boolean getIsHooked()
live instrumentation: Frida, Xposed, LSPosed
-
getIsSideloaded
final Boolean getIsSideloaded()
installed from something other than the Play Store
-
getIsAdbEnabled
final Boolean getIsAdbEnabled()
USB debugging enabled in developer settings
-
getIsMockLocation
final Boolean getIsMockLocation()
a mock location provider is active
-
getIsVpnActive
final Boolean getIsVpnActive()
the active network is a VPN transport
-
getIsDebuggable
final Boolean getIsDebuggable()
the app manifest carries android:debuggable
-
getIsAutoTimeOff
final Boolean getIsAutoTimeOff()
Automatic network time is OFF, so the wall clock is whatever the user set.
Corroboration only, never a verdict on its own. Turning auto-time off is a legitimate thing people do, and a phone whose battery died reports a wildly wrong clock through no fault of its owner. It matters because it is the precondition for the thing we actually care about: a clock moved forward to defeat a cooldown.
-
-
-
-