Seiten

Samstag, 10. März 2012

Android Werbung ohne Root entfernen

Vorneweg noch ein paar Worte: Viele Webseiten oder Apps im Android Market schalten Werbung, um damit ihre Kosten für die Betreibung der Server oder die Entwicklung zu sichern. Deshalb ist das Deaktivieren der Werbung ein zweischneidiges Schwert. Bei Apps oder Webseiten, die euch gefallen solltet ihr ruhig den Werbeblocker deaktivieren und/oder auf Werbung klicken, um kostenlose Angebote zu fordern.

Bei Smartphones und den damit verbundenen Tarifen ist es durchaus nützlich Werbung zu blockieren, um die -sowieso schon begrenzte -  Bandbreite zu schonen. Im Market gibt es zum Blocken von Werbung schon eine App namens Adfree. Leider hat diese einen Nachteil und zwar das Root-Rechte benötigt werden. Wenn man jedoch sein Smartphone nicht rooten möchte, muss man mit der Werbung leben.

Hinweis: Die Anleitung richtet sich an versierte Nutzer. Es ist durchaus möglich, damit auch Schaden am Gerät oder an der Firmware anzurichten. Ich übernehme keine Haftung für eventuelle Schäden.

Die App Adfree basiert darauf, dass eine Liste von bekannten Werbeservern in die Hosts-Datei des Betriebssystems eingetragen werden und diese mit der lokalen IP (127.0.0.1) verbunden wird. Deshalb wird jede Anfrage an einen dort eingetragenen Server auf das eigene Gerät umgeleitet. Beispiele für solche Hosts-Dateien gibt es im Netz zu finden. Diese werden später für die Anleitung benötigt. Ladet euch eine Datei herunter und speichert diese unter hosts.txt. Downloads gibt es z.B. hier:




Mit ein paar Linux-Kenntnissen ist es möglich dieses Verhalten manuell zu tun, um damit die Werbung zu blocken. Dazu benötigt man das Android SDK, in dem z.B. das Tool adb enthalten ist. Dieses wird benötigt, um eine Shell auf dem Telefon zu starten. Einfach den Installer laden und die Tools in einen Ordner eurer Wahl installieren. Den SDK Manager im Anschluss starten und die Plattform-Tools installieren. Alles andere kann abgewählt werden:


Im Telefon muss Debugging noch aktiviert werden, damit wir Verbindung aufnehmen können. Das ist zu finden unter Einstellungen -> Anwendungen - >Entwicklung:



Im Folgenden wird davon ausgegangen, dass das SDK in D:\android-sdk-windows installiert ist und das Telefon an den USB-Anschluss angeschlossen ist (Nur Laden). Die vorher heruntergeladene Hosts-Datei ist im Unterordner platform-tools abgelegt. Also unter d:\android-sdk-windows\platform-tools\hosts.txt.
Zuerst starten wir eine Konsole (Win+R->cmd->Enter), hangeln uns zu den Plattform-Tools durch und starten eine Shell per ADB:

cd /d "d:\android-sdk-windows\platform-tools"
adb shell

Auch wenn keine weitere Ausgabe erfolgts sind wir nun auf dem Gerät eingeloggt. Zuerst müssen wir die Systempartition schreibbar machen, standardmäßig ist diese nur lesbar. Im Anschluss beenden wir die Shell gleich wieder:

mount -o remount,rw /system
exit

Die Hosts-Datei muss nun auf das Gerät übertragen werden. Dafür benutzen wir den push-Befehl und speichern diese gleich auf dem Gerät unter /system/etc (der Ordner kann sich bei anderen Geräten unterscheiden, dies ist aber der Standardpfad!) ab. Nun gehen wir zurück aufs Gerät und browsen direkt zum Ordner

adb push hosts.txt /system/etc
adb shell
cd /system/etc

Aus Sicherheitsgründen benennen wir die alte Hosts-Datei um und geben der neuen Datei ihren Namen:

mv hosts hosts_old
mv hosts.txt hosts

Nun noch die Shell beenden und das Gerät neu starten. Nun sollte die Werbung komplett entfernt sein.
Hier noch einmal ein Screenshot der kompletten Vorgehensweise:


Kommentare:

  1. Hi,

    klasse Anleitung. Ich habe nur das Problem, dass bei mir adb anscheinend nicht den remount Befehl kennt. Wenn ich versuche, das /System Verzeichnis zu mounten liefert er nur mögliche Eingaben beim mount-Befehl. Mehr passiert nicht.

    Was genau soll die Ergänzung remount bewirken? Die anderen Parameter sind mir klar.

    Gruß
    Phil

    AntwortenLöschen
  2. Hallo Phil,

    remount bewirkt, dass nur die Flags des Mountpoints umgesetzt werden anstatt das Dateisystem vorher komplett auszuhängen und wieder neu einzuhängen. Ein umount (also das Aushängen) funktioniert bei einem Dateisystem nicht, welches gerade in Verwendung ist.

    Bei der Anleitung ist es wichtig auf Groß- und Kleinschreibun zu achten, vielleicht ist das schon dein Problem. Alternativ kannst du auch probieren meine Anleitung im Recoverymodus nachzuvollziehen. Bei HTC musst du dazu die "Leiser" -Taste beim Einschalten drücken. HIer hast du normalerweise mehr Rechte und kannst /system auch aus- und einhängen.

    Gruß,
    Danny

    AntwortenLöschen
  3. Hallo Danny,

    danke für die Antwort.
    Bei der Schreibweise habe ich komplett alles klein geschrieben, daran sollte es also nicht liegen. Ich habe ein Xperia Ray mit der aktuellen .069 Firmware, bei der noch kein Root möglich ist. Es geht nur über den Downgrade auf eine ältere FW, was ich aber erstmal vermeiden wollte. Daher käme mir deine Lösung sehr gelegen, um auch ohne Root die Werbebanner wegzubekommen.

    Den Recovery-Modus gibt es bei meinem Gerät auch und das werde ich als nächstes ausprobieren.

    Gruß
    Phil

    AntwortenLöschen
  4. Hallo Danny,

    Ich habe eine Frage zu diesen Thema!
    Entstehen bei dieser Vorgehensweise Garantieverluste?

    Mfg.
    Franz

    AntwortenLöschen
  5. Hallo Franz,

    Garantieverluste entstehen keine, da hier lediglich eine Datei geändert wird. Hier wird nichts (wie beim Rooten) am Bootloader oder tief im System geändert. Natürlich solltest du dich dabei genau an die Anleitung halten ;) Wenn du Fehler machen solltest ist es bei den Androiden auch normalerweise sehr einfach das Gerät auf den Auslieferungszustand zurückzusetzen.

    Gruß,
    Danny

    AntwortenLöschen
  6. Hi Danny,

    leider komme ich nicht weiter, da es den Recovery-Mode im Auslieferungszustand nicht gibt. Gibt es eine Möglickeit, wie ich über die adb-shell weiter vorankomme?
    Wenn ich in der Shell nur mount eingebe erhalte ich folgendes:
    ----------
    $ mount
    mount
    rootfs / rootfs ro,relatime 0 0
    tmpfs /dev tmpfs rw,relatime,mode=755 0 0
    devpts /dev/pts devpts rw,relatime,mode=600 0 0
    proc /proc proc rw,relatime 0 0
    sysfs /sys sysfs rw,relatime 0 0
    tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
    tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
    /dev/block/mtdblock0 /system yaffs2 ro,relatime 0 0
    /dev/block/mtdblock3 /data yaffs2 rw,nosuid,nodev,relatime 0 0
    /dev/block/mtdblock2 /cache yaffs2 rw,nosuid,nodev,relatime 0 0
    /dev/block/mtdblock1 /data/idd yaffs2 rw,nosuid,nodev,relatime 0 0
    --------
    Bringt mich das irgendwie sinnvoll weiter? Muss ich evtl. nur den Befehl anpassen, um deine Anleitung befolgen zu können?

    Gruß
    Phil

    AntwortenLöschen
  7. Hallo Phil,

    das sieht wohl eher schlecht dann aus. Etwas könntest du aber noch probieren:
    Gib in der Shell "su" und Enter ein, dann solltest du Superuserrechte haben, danach gibst du "cat /proc/mounts" ein. Die Ausgabe sieht in etwa so aus:
    cat /proc/mounts
    rootfs / rootfs rw 0 0
    proc /proc proc rw,relatime 0 0
    sys /sys sysfs rw,relatime 0 0
    tmpfs / tmpfs ro,relatime 0 0
    /dev/sda1 /mnt ext3 rw,relatime,errors=continue,barrier=0,data=writeback 0 0
    /dev/sda1 /system ext3 rw,relatime,errors=continue,barrier=0,data=writeback 0 0
    tmpfs /cache tmpfs rw,relatime 0 0
    /dev/sda1 /data ext3 rw,relatime,errors=continue,barrier=0,data=writeback 0 0
    tmpfs /dev tmpfs rw,relatime,mode=755 0 0
    devpts /dev/pts devpts rw,relatime,mode=600 0 0

    Hier sucht du die Zeile mit /system heraus (im Bsp. ist das:
    /dev/sda1 /system ext3 rw,relatime,errors=continue,barrier=0,data=writeback 0 0

    Vor dem ersten Leerzeichen steht der Devicename, den du nun für den modifizierten mount-Befehl verwenden kannst:

    "mount -o remount,ro /dev/sda1 /system"

    Kann nicht versprechen, dass es funktiomiert aber ein Versuch ist es wert.

    Gruß,
    Danny

    AntwortenLöschen
  8. Hi Danny,
    Wenn ich mount -o remount,rw /system eingebe kommt das hier:
    Usage: mount [-r] [-w] [-o options] [-t type] device directory
    Soweit ich weiß ist da etwas im Befehl falsch!

    Mfg,
    Franz

    AntwortenLöschen
  9. Hi Danny,

    schade, su geht leider nicht (permission denied) und auch der mount-befehlt direkt auf den System-Ordner schlägt dann ohne superuser-Rechte fehl. :-/

    Muss ich wohl doch in den sauren Apfel beißen, und irgendwann ein Downgrade auf eine ältere, rootbare FW-Version, durchführen.

    Trotzdem danke für deine Unterstützung.

    Gruß
    Phil

    AntwortenLöschen
  10. Hallo Franz,

    anscheinend funktioniert der Befehl (warum auch immer) bei manchen Geräten nicht. Das selbe Problem hatte Phil auch. Schau mal in meine Antwort auf Phils Frage (direkt über deinem Kommmentar) und probiere mal diese Lösung aus, vielleicht ist das bei deinem Gerät so möglich.

    @Phil:
    Schade, anscheinend hat Sony da zusätzliche Sicherungsmaßnahmen eingebaut.

    Gruß,
    Danny

    AntwortenLöschen
  11. Hallo,
    ich habe ein Galaxy Note 10.1 und möchte gern die HOSTS Datei austauschen!
    Habe diese Anweisung gelesen, aber leider klappt es bei mir nicht!
    ist es evtl. nicht möglich dies auch auf dem Galaxy Note 10.1 zu machen
    ich bekommen beim Mounten die Meldung
    Operation not permitted

    kann jemand helfen?

    AntwortenLöschen
  12. Hallo,

    also ich finde dein Beitrag hier entweder nicht richtig oder total Absurt und Widersprüchlich.
    Denn wie soll man die Befehle hier ohne Root Rechte ausführen können?!

    Um in der Verzeichnis /System ... etwas zu ändern (da reicht auch Dateiname ändern - sprich wie oben beschrieben sollen wir Dateinamen mit "mv" ändern) braucht man Root Rechte.

    Und wenn man das Handy eh gerootet hat, dann kann man direkt die anderen Software installieren die auf gerooteten Handys funktionieren und die ganze Arbeit und Aufwand den Software überlässt.

    Also bitte eine gescheite Lösung hier Anbieten!

    Gruß
    Daniel

    AntwortenLöschen