Récapitulatif des techniques de télémétrie pour les apps Android

5 juillet 2025 — Thibaut Lombard — @lombardweb
Catégorie Exemple clé JSON API/Source Notes
1️⃣ Infos système & appareil — Toutes accessibles sans autorisation ; sûres pour l’analyse/télémétrie.
Modèle de l'appareil"device_model": "Pixel 7"Build.MODELIdentifie le modèle (ex. : « Pixel 7 »).
Fabricant"manufacturer": "Google"Build.MANUFACTURERFabricant de l’appareil (ex. : « Google »).
Version Android"android_version": "14"Build.VERSION.RELEASEVersion de l’OS (ex. : « 14 »).
Version SDK"sdk_int": 34Build.VERSION.SDK_INTNiveau API (ex. : 34 pour Android 14).
Nom de l’appareil"device_name": "walleye"Build.DEVICENom de code interne (ex. : « walleye »).
Marque"brand": "Samsung"Build.BRANDMarque de l’appareil (ex. : « Samsung »).
Matériel"hardware": "exynos9820"Build.HARDWAREIdentifiant matériel (ex. : « exynos9820 »).
Architecture CPU"cpu_abi": ["arm64-v8a"]Build.SUPPORTED_ABISTableau des ABIs supportés.
Langue du système"locale": "fr-FR"Locale.getDefault().toString()Langue et région (ex. : « fr-FR »).
Fuseau horaire"timezone": "Europe/Paris"TimeZone.getDefault().getID()Fuseau de l’appareil.
2️⃣ Infos réseau (basiques) — Données réseau limitées sans ACCESS_NETWORK_STATE.
Type de connexion (WebView)"network_type": "4g"navigator.connection.type (JS WebView)Via WebView ; ex. : « 4g », « wifi ».
IP publique"ip_address": "logged_server_side"Journal côté serveurLe client ne peut pas l’obtenir de façon fiable.
Proxy"proxy": "none"System.getProperty("http.proxyHost")Souvent inutile ; renvoie l’hôte proxy ou « none ».
3️⃣ Infos sur l’app — Toujours accessibles.
Version de l’app"app_version": "1.0.0"PackageManager.getPackageInfo().versionNameDepuis build.gradle.
Code version"version_code": 1PackageManager.getPackageInfo().versionCodeDepuis build.gradle.
Nom du package"package_name": "com.example.myapp"context.packageNameIdentifiant unique.
Premier lancement"first_launch": trueSharedPreferencesFlag conservé en SharedPreferences.
UUID local"device_uuid": "generated-uuid"UUID.randomUUID() + SharedPreferencesGénéré & sauvegardé localement.
4️⃣ Données d’usage (analytics basique) — Sans autorisation.
Date/heure actuelle"timestamp": "2025-07-05T23:03:00Z"System.currentTimeMillis() + SimpleDateFormatFormat UTC ISO 8601.
Durée de session"session_duration": 145Logique de l’appTemps en ms ou s.
Pages/écrans vus"screen_view": "Accueil"Logique de l’appNom de l’écran ou de l’Activity.
Clics/taps"event": "button_clicked"Logique de l’appInteractions utilisateur.
Erreurs JS"js_error": "TypeError at script.js:10"window.onerror (JS WebView)Capturer erreurs JS ; `window.onerror` requis.
5️⃣ Stockage local (WebView) — Sécurisé, sans autorisation.
LocalStorage"local_storage": {"key": "value"}localStorage (JS WebView)Clés/valeurs internes.
Cookies"cookies": {"session_id": "abc123"}document.cookie (JS WebView)Cookies du domaine WebView.
6️⃣ Capacités de l’appareil — Sans autorisation.
Orientation"orientation": "portrait"context.resources.configuration.orientation« portrait » ou « landscape ».
Largeur écran"screen_width": 1080context.resources.displayMetrics.widthPixelsEn pixels.
Hauteur écran"screen_height": 1920context.resources.displayMetrics.heightPixelsEn pixels.
Densité écran"density": 3.0context.resources.displayMetrics.densityEx. : 3.0 pour xxxhdpi.
Mode sombre"dark_mode": trueUI_MODE_NIGHT_MASKVrai si activé.
Niveau batterie"battery_level": 87BatteryManager.getIntProperty()% batterie (API 21+).
❌ Données restreintes — Autorisation explicite requise ; jamais contourner.
ContactsN/AREAD_CONTACTSPermission « dangereuse ».
SMSN/AREAD_SMSPermission « dangereuse ».
Numéro/IMEIN/AREAD_PHONE_STATERestreint.
Historique appelsN/AREAD_CALL_LOGPermission « dangereuse ».
Localisation GPSN/AACCESS_FINE_LOCATIONPermission « dangereuse ».
Numéro série uniqueN/AAPI 26+Inaccessible sans autorisation.