Telemetry technologies for Android Apps

5 July 2025 — Thibaut Lombard — @lombardweb
Category Example JSON Key API/Source Notes
1️⃣ System & Device Info — All accessible without permissions; safe for analytics/debug.
Device model"device_model": "Pixel 7"Build.MODELIdentifies device model (e.g., "Pixel 7").
Manufacturer"manufacturer": "Google"Build.MANUFACTURERDevice manufacturer (e.g., "Google").
Android version"android_version": "14"Build.VERSION.RELEASEOS version (e.g., "14").
SDK version"sdk_int": 34Build.VERSION.SDK_INTAPI level (e.g., 34 for Android 14).
Device name"device_name": "walleye"Build.DEVICEInternal device codename (e.g., "walleye" for Pixel).
Brand"brand": "Samsung"Build.BRANDDevice brand (e.g., "Samsung").
Hardware"hardware": "exynos9820"Build.HARDWAREHardware identifier (e.g., "exynos9820").
CPU architecture"cpu_abi": ["arm64-v8a"]Build.SUPPORTED_ABISArray of supported ABIs (e.g., ["arm64-v8a", "armeabi-v7a"]).
System language"locale": "en-US"Locale.getDefault().toString()Device language and region (e.g., "en-US").
Timezone"timezone": "Europe/Paris"TimeZone.getDefault().getID()Device timezone (e.g., "Europe/Paris").
2️⃣ Network Info (Basic) — Limited network data without ACCESS_NETWORK_STATE.
Approx. connection type (WebView)"network_type": "4g"navigator.connection.type (WebView JS)Requires WebView; returns "4g", "wifi", etc.
Public IP"ip_address": "logged_server_side"Backend loggingClient can’t reliably get public IP; log server-side.
Proxy info"proxy": "none"System.getProperty("http.proxyHost")Rarely useful; returns proxy host or "none".
3️⃣ App Info — App-specific, always accessible.
App version"app_version": "1.0.0"PackageManager.getPackageInfo().versionNameVersion name from build.gradle.
Version code"version_code": 1PackageManager.getPackageInfo().versionCodeVersion code from build.gradle.
Package name"package_name": "com.example.myapp"context.packageNameUnique app ID (e.g., "com.example.myapp").
First launch flag"first_launch": trueSharedPreferencesTrack first launch; persist in SharedPreferences.
Local UUID"device_uuid": "generated-uuid"UUID.randomUUID() + SharedPreferencesGenerate & persist unique device ID.
4️⃣ Usage Data (Basic Analytics) — App-specific; no permission needed.
Current date/time"timestamp": "2025-07-05T23:03:00Z"System.currentTimeMillis() + SimpleDateFormatUTC timestamp (ISO 8601).
Session duration"session_duration": 145App logicTime in ms or sec; use lifecycle tracking.
Screen/page views"screen_view": "Home"App logicTrack screen or Activity name.
Clicks/taps"event": "button_clicked"App logicLog user interactions.
JS errors"js_error": "TypeError at script.js:10"window.onerror (WebView JS)Capture JS errors; requires `window.onerror`.
5️⃣ Local Storage (WebView) — Sandboxed, no permissions needed.
Local storage"local_storage": {"key": "value"}localStorage (WebView JS)Key-value pairs in WebView.
Cookies"cookies": {"session_id": "abc123"}document.cookie (WebView JS)Domain cookies via WebView JS.
6️⃣ Device Capabilities — Hardware/software, no permissions needed.
Screen orientation"orientation": "portrait"context.resources.configuration.orientation"portrait" or "landscape".
Screen width"screen_width": 1080context.resources.displayMetrics.widthPixelsWidth in pixels.
Screen height"screen_height": 1920context.resources.displayMetrics.heightPixelsHeight in pixels.
Screen density"density": 3.0context.resources.displayMetrics.densityDensity (e.g., 3.0 for xxxhdpi).
Dark mode"dark_mode": trueUI_MODE_NIGHT_MASKTrue if dark mode is active.
Battery level"battery_level": 87BatteryManager.getIntProperty()Battery % (API 21+).
❌ Restricted Data — Requires explicit user permission; never bypass.
ContactsN/AREAD_CONTACTSDangerous permission required.
SMSN/AREAD_SMSDangerous permission required.
Phone number / IMEIN/AREAD_PHONE_STATERestricted; permission required.
Call logsN/AREAD_CALL_LOGDangerous permission required.
GPS locationN/AACCESS_FINE_LOCATIONDangerous permission required.
Unique device serialN/ARestricted since API 26+Inaccessible without permission.