{"id":185,"date":"2011-04-24T08:24:16","date_gmt":"2011-04-24T06:24:16","guid":{"rendered":"http:\/\/blog.thomasius.net\/?p=185"},"modified":"2011-04-24T08:24:16","modified_gmt":"2011-04-24T06:24:16","slug":"android-gespeicherte-standortdaten","status":"publish","type":"post","link":"https:\/\/blog.embedded-system-design.de\/index.php\/2011\/04\/24\/android-gespeicherte-standortdaten\/","title":{"rendered":"Android: Gespeicherte Standortdaten"},"content":{"rendered":"<p>Ohne GPS kann die eigene Position anhand von WLAN-Netzen und Handy-Zellen im Empfangsbereich gesch\u00e4tzt werden. Hierzu m\u00fcssen lediglich die Geokoordinaten der Sender mit ihrer weltweit eindeutigen Kennung bekannt sein. \u00dcber eine ausreichend gut gef\u00fcllte Datenbank k\u00f6nnen die Identifikationsnummern der WLAN-Netze und Handyzellen in grobe Geokoordinaten \u00fcbersetzt werden.<\/p>\n<p>Nicht nur Androidger\u00e4tenutzer helfen gemeinschaftlich beim Verzeichnen der WLAN-Netze und Handy-Zellen. Um die notwendige Datenbasis zu schaffen, l\u00e4\u00dft u.a. Google die Geoposition seiner Androiden samt empfangener WLAN-Adressen und Basisstationskennungen nach Hause funken. Wer die Lokalisierung per Netz nutzen will, muss der anonymisierten \u00dcbermittlung der gesammelten Daten zustimmen, um den Dienst zugleich mit frischen Daten zu versorgen. Mit Hilfe auf dem Ger\u00e4t zwischengespeicherter Informationen kann eine  Positionsbestimmung ohne weitere Datenbankabfrage im Internet erfolgen.<\/p>\n<p>Nachdem <a title=\"Hidden Feature auf dem iPhone: Peilsender\" href=\"http:\/\/www.netzpolitik.org\/2011\/neues-hidden-feature-in-ios-4-peilsender\/\" target=\"_blank\">die unbegrenzte Protokollierung der Aufenthaltsorte auf dem iPhone<\/a> bekannt geworden ist, hat der schwedischen Software-Entwickler Magnus Eriksson (aka packetlss) <a title=\"Android Location Database Dump\" href=\"https:\/\/github.com\/packetlss\/android-locdump\" target=\"_blank\">die Cache-Datenbank des Android-Lokalisierungsdienstes analysiert<\/a>.<\/p>\n<blockquote><p>Following the latest days internet outrage\/overreaction to the revelation that <a href=\"http:\/\/radar.oreilly.com\/2011\/04\/apple-location-tracking.html\">iPhone has a cache<\/a> for its location service, I decided to have look what my Android devices caches for the same function. (<a href=\"http:\/\/bit.ly\/dJdeMI\">bit.ly\/dJdeMI<\/a>)<\/p><\/blockquote>\n<p>Die Datenbanken liegen im Verzeichnis <em>\/data\/data\/com.google.android.location\/files<\/em> auf dem Android-Ger\u00e4t. Darin werden die Kennungen der Basisstationen (<em>cache.cell<\/em>) und MAC-Adressen der WLAN-Netze (<em>cache.wifi<\/em>) mit Geokoordinaten und Zeitstempel abgelegt. Auf GitHub hat Eriksson ein <a href=\"https:\/\/github.com\/packetlss\/android-locdump\" target=\"_blank\">Python-Skript zum Parsen der Daten<\/a> publiziert. Um die Dateien lesen zu k\u00f6nnen, ben\u00f6tigt man root-Rechte auf dem Ger\u00e4t.<\/p>\n<p>Der<a href=\"http:\/\/android.git.kernel.org\/\"> freie Quellcode des Google-Standortcaches<\/a> erm\u00f6glicht seine Analyse. Sie zeigt, dass die Eintr\u00e4ge erst entfernt  werden, wenn die maximale Anzahl von Eintr\u00e4gen erreicht ist, so dass  auch sehr alte Daten enthalten sein k\u00f6nnen. Bis zu 50  Handyzellen-Eintr\u00e4ge und 200 WLAN-Netze k\u00f6nnen im\u00a0 Cache liegen.  Handyzellen-Informationen sind g\u00fcltig, bevor das Ger\u00e4t erneut beim  Server anfragt. Bei WLAN-Netzen ist das maximale Alter auf 48 Stunden  festgelegt. Ich kann das leider nur f\u00fcr die Android-Version 1.0 best\u00e4tigen. Nur daf\u00fcr liegt der Quelltext f\u00fcr die Klasse <em>android.location.LocationCache<\/em> vor. In den folgenden Versionen finde ich z.B. die Dateinamen f\u00fcr die Caches nur in bereits kompilierten Bin\u00e4rdateien, nicht jedoch in den Quellen. Daher kann in aktuellen Version auch eine andere Implementierung m\u00f6glich sein.<\/p>\n<blockquote><p>However, data is only pruned when new info is added.  There is no time   based pruning unless there is new data being added to  the cache. This   could lead to old data being if there is limited  movement of the device. (<a href=\"http:\/\/bit.ly\/dJdeMI\">bit.ly\/dJdeMI<\/a>)<\/p><\/blockquote>\n<p>So wie ich das beobachtet habe, erfolgt ein neuer Eintrag nur, wenn es  sich um unbekannte Stationen handelt. Alte Informationen zu einer breits registrierten Station werden mit  neuen Daten \u00fcberschrieben. So ist es nicht verwunderlich, dass in dem mir vorliegenden Cache-File  jede  WLAN-Adresse nur einmalig aufgef\u00fchrt ist. Das stimmt mit der  Implementierung in Android 1.0 \u00fcberein.<\/p>\n<pre>        <strong>private<\/strong> <strong>void<\/strong> <span style=\"color: #2040a0;\">insert<\/span><span style=\"color: #4444ff;\"><strong>(<\/strong><\/span><span style=\"color: #2040a0;\">String<\/span> <span style=\"color: #2040a0;\">key<\/span>, <span style=\"color: #2040a0;\">LocationCache<\/span>.<span style=\"color: #2040a0;\">Record<\/span> <span style=\"color: #2040a0;\">record<\/span><span style=\"color: #4444ff;\"><strong>)<\/strong><\/span> <span style=\"color: #4444ff;\"><strong>{<\/strong><\/span>\n            <span style=\"color: #2040a0;\">remove<\/span><span style=\"color: #4444ff;\"><strong>(<\/strong><\/span><span style=\"color: #2040a0;\">key<\/span><span style=\"color: #4444ff;\"><strong>)<\/strong><\/span><span style=\"color: #4444ff;\">;<\/span>\n            <span style=\"color: #2040a0;\">put<\/span><span style=\"color: #4444ff;\"><strong>(<\/strong><\/span><span style=\"color: #2040a0;\">key<\/span>, <span style=\"color: #2040a0;\">record<\/span><span style=\"color: #4444ff;\"><strong>)<\/strong><\/span><span style=\"color: #4444ff;\">;\n<\/span>            ...\n        }<\/pre>\n<p>Eine vollst\u00e4ndige  Bewegungsprofilrekonstruktion w\u00e4re damit allein nicht m\u00f6glich. Die auf  dem Ger\u00e4t zwischengespeicherten Daten lassen nur den einmaligen Besuch  eines Ortes erkennen. &#8211; Warum mein Besuch in Dortmund nicht aufgef\u00fchrt  ist? Da habe ich ausschlie\u00dflich per GPS navigiert.<\/p>\n<p>Die Funktion zum Zwischenspeichern kann auf Androidger\u00e4ten in den Einstellungen unter<em> Standort &amp; Sicherheit \/ Drahtlosnetzwerke<\/em> deaktiviert werden. Unter Android 2.3 werden damit die Cache-Dateien gel\u00f6scht. Unter der Version 2.2 werden keine neuen Informationen zum Cache hinzugef\u00fcgt.<\/p>\n<div id=\"_mcePaste\" class=\"mcePaste\" style=\"position: absolute; left: -10000px; top: 336px; width: 1px; height: 1px; overflow: hidden;\">So wie ich das beobachtet habe, erfolgt ein neuer Eintrag nur, wenn es  sich um unbekannte Stationen handelt. Alte Informationen werden mit  neuen \u00fcberschrieben. In dem mir vorliegenden Cache-File ist jede  WLAN-Adresse nur einmalig aufgef\u00fchrt. Eine vollst\u00e4ndige  Bewegungsprofilrekonstruktion ist damit allein nicht m\u00f6glich. Die auf  dem Ger\u00e4t zwischengespeicherten Daten lassen nur den einmaligen Besuch  eines Ortes erkennen. &#8211; Warum mein Besuch in Dortmund nicht aufgef\u00fchrt  ist? Da habe ich ausschlie\u00dflich per GPS navigiert.<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ohne GPS kann die eigene Position anhand von WLAN-Netzen und Handy-Zellen im Empfangsbereich gesch\u00e4tzt werden. Hierzu m\u00fcssen lediglich die Geokoordinaten der Sender mit ihrer weltweit eindeutigen Kennung bekannt sein. \u00dcber eine ausreichend gut gef\u00fcllte Datenbank k\u00f6nnen die Identifikationsnummern der WLAN-Netze und Handyzellen in grobe Geokoordinaten \u00fcbersetzt werden. Nicht nur Androidger\u00e4tenutzer helfen gemeinschaftlich beim Verzeichnen der &hellip; <\/p>\n<p><a class=\"more-link btn\" href=\"https:\/\/blog.embedded-system-design.de\/index.php\/2011\/04\/24\/android-gespeicherte-standortdaten\/\">Weiterlesen<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[1,16],"tags":[18,37],"_links":{"self":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/posts\/185"}],"collection":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/comments?post=185"}],"version-history":[{"count":0,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/posts\/185\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/media?parent=185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/categories?post=185"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.embedded-system-design.de\/index.php\/wp-json\/wp\/v2\/tags?post=185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}