On this page

Runtime evidence

See emulator and instrumentation clues separately

A useful event says which build marker, file, property, thread, class, library, pipe, or port was observed. It does not compress those values into an unexplained boolean.

Use independent observation layers

LayerExamplesWhy preserve it
Build and hardwareBuild fingerprint, model, ABI, QEMU properties, virtual CPU markersExplains why an environment resembled an emulator.
Filesystem and packagesKnown emulator files and installed emulator-related packagesSupports family-specific analysis without a global verdict.
RuntimeDebugger state, hook classes, stack frames, mapped libraries, threadsCaptures instrumentation that build metadata may not reveal.
Local endpointsFrida handshake, reverse-engineering ports, injector pipesProvides transaction-time evidence with explicit failure states.

Emulator and simulator observations

Android checks can return the matching build fingerprint, virtual hardware properties, CPU and vendor markers, sensor counts, camera availability, emulator file paths, related packages, and which checks actually ran. Recognized families can include AOSP or Google emulators, Genymotion, BlueStacks, Nox, MuMu, LDPlayer, MEmu, and others represented in the published catalog.

iOS reports simulator build and environment markers when available. Development simulators are legitimate tools, so emulator evidence needs action context rather than automatic blocking.

Frida and hook observations

The standalone Android integrity collector inspects already-loaded class names without initializing third-party code, mapped libraries and stack frames, process thread names, and known injector pipe targets. It does not open sockets. The separate Frida scan, now owned by the optional active-probes component, connects to localhost and reports port-open and handshake-prefix booleans. It currently collapses connection errors into false and handshake errors into a false reject flag; it does not expose separate native timeout or unavailable outcomes. A REJECT-like reply is protocol evidence, not proof of a service's identity.

The active scan lives in a separate optional component that is allowed loopback socket I/O; the passive collector opens no socket. Its existing React Native default is unchanged. Calibrate observations on physical devices before using them in backend policy.

Collect at the right moment

Long-lived startup values and action-time runtime values answer different questions. Collect a baseline after app initialization, then collect a narrow transaction profile near confirmation of a payment, recovery, or protected account change. Bind both events to the same server-created action while giving each upload its own idempotency key.

See the protected actions and payments guides for complete flows.

Calibrate before policy

  1. Test release builds on supported physical devices and OS versions.
  2. Keep emulator and simulator samples as separate development cohorts.
  3. Measure probe latency, timeout rate, missingness, and value distributions.
  4. Review vendor-modified Android builds and managed enterprise devices.
  5. Never block from one observation and provide a recovery path for policy decisions.

The SDK does not calculate a risk score or return a trusted or untrusted verdict.