Wie kann man Verzeichnisse in Android 4.4 "mounten --bind"?

Ich frage mich nur, ob es eine Möglichkeit gibt, einen internen /sdcardOrdner an einen anderen internen /sdcardOrdner zu binden, in den normale Apps für Android-Versionen seit 4.4 schreiben können.

Ich habe einen Ordner mit dem Namen ./MyPicsin der internen /sdcard. Ich möchte es an ./DCIM/Camera, ./Pictures/Screenshots, binden ./Movies/Screencasts. Die SD-Karte ist /mnt/shell/emulated/0als gemountet sdcardfsund mit symbolisch verknüpft /storage/emulated/legacy. Außerdem gibt es ein Verzeichnis /storage/emulated/0, das weder ein Einhängepunkt noch ein Symlink ist. Es ist ein sehr seltsames Verzeichnis.

  1. Folgendes habe ich versucht:

    mount -o bind,dmask=0000,fmask=0000 /mnt/shell/emulated/0/MyPics /mnt/shell/emulated/0/DCIM/Camera  
    mount -o bind,dmask=0000,fmask=0000 /mnt/shell/emulated/0/MyPics /mnt/shell/emulated/0/Pictures/Screenshots  
    mount -o bind,dmask=0000,fmask=0000 /mnt/shell/emulated/0/MyPics /mnt/shell/emulated/0/Movies/Screencasts  
    

    aber es hat keinen Zweck: Apps wie die Kamera konnten nicht hineinschreiben/DCIM/Camera

  2. Folgendes habe ich versucht:

    mount -o bind,dmask=0000,fmask=0000 /storage/emulated/legacy/MyPics /mnt/shell/emulated/0/...
    ....
    

    aber es nützt auch nichts

  3. Folgendes habe ich versucht:

    mount -o bind,dmask=0000,fmask=0000 /data/media/0/MyPics /data/media/0/...
    ....
    

    Wenn es eine Datei mit dem Namen a.jpgin /MyPicsgibt, erscheint sie in /data/media/0/DCIM/Camera, aber nicht in/storage/emulated/legacy/DCIM/Camera

  4. Ich habe versucht, Apps wie LuckPatcher zu verwenden, um die Arbeit zu erledigen, aber es ist wieder fehlgeschlagen

Hast du es mit versucht ln -s? ln -s /sdcard/MyPics /sdcard/DCIM/Camera. Sie müssen zuerst den Kameraordner verschieben.

Antworten (1)

Leider ist es seit Android 4.2 auf den meisten Geräten nicht mehr möglich, einen Ordner zu mounten und ihn auch anderen Apps zur Verfügung zu stellen. Die Details dazu, wie dies funktioniert und warum dies geändert wurde, finden Sie hier: Fix für leere App-gemountete Verzeichnisse (CifsManager usw.) in Android 4.2 .

Auf der oben genannten Seite steht folgendes:

Ursprünglich geschrieben von Zygote-Patch-Commit-Nachricht

Zygote: Beschränken Sie den Slave-Mountspace, damit Dalvik-Apps systemweite Volumes mounten können. Android 4.2 implementiert Multi-User-Speicher mit Mount-Namespaces pro Prozess. Ursprünglich ist alles unter „/“ (die gesamte Dateisystemhierarchie) als rekursiver Slave-Mountspace für alle Zygote-Instanzen markiert. Dies geschieht, damit Benutzerspeicher-Sandbox-Mounts unter /storage/emulated vor anderen Apps und Benutzern verborgen werden. Leider bedeutet dies, dass jede Dalvik-App (eigentlich jedes Programm, dessen Klon-/Fork-Vorfahren eine Dalvik-Zygote enthalten, was alles ist, außer Dienste, die direkt von init hervorgebracht werden) keine systemweiten Volumes mounten kann. Daher werden Apps wie CifsManager in Android 4.2 effektiv beschädigt, da seine cifs-Mounts nur für die CifsManager-App selbst sichtbar sind. Alle anderen Apps sehen leere Mountpoints anstelle des gemounteten Volumes. Außerdem,

Hier beschränken wir den Slave-Mountspace auf /storage (und aufgrund eines möglichen Kernel-Fehlers auf /mnt/shell/emulated), damit Dalvik-Apps systemweite Volumes an anderer Stelle einhängen können (mit entsprechender Erlaubnis, wie in früheren Versionen von Android). , während die volle Speicherkompatibilität für mehrere Benutzer erhalten bleibt. Diese Änderung erfordert, dass ein tmpfs-Volume als /storage in init.rc gemountet wird. Wenn dieses Volume nicht verfügbar ist, fällt Zygote auf das vorherige Verhalten zurück und markiert die gesamte Dateisystemhierarchie als Slave. Es erfordert auch implizit, dass EMULATED_STORAGE_TARGET ein Pfad-Präfix von (Teil der Unterhierarchie von) ANDROID_STORAGE ist, was der typische Fall ist.

Es kommt darauf an, dass, wenn Apps ein Verzeichnis mounten oder ein Gerät blockieren, das gemountete Verzeichnis nur für die Apps sichtbar sein sollte, die das Mounten durchgeführt haben, es sei denn, die App verfügt über spezielle Berechtigungen, die Nicht-System-Apps im Allgemeinen nicht zur Verfügung stehen. Und selbst wenn Sie es schaffen, das Verzeichnis global zu mounten, werden Ihnen die Linux-Berechtigungen immer noch im Weg stehen.

Daher ist das Mounten wahrscheinlich nicht die einfachste Lösung für Ihr Problem, aber wenn Sie wirklich Mounts verwenden möchten, sollten Sie in der Lage sein, die Befehle hinzuzufügen /system/bin/debuggerdund dann (als Root) einzugeben start debuggerd, um Ihr eigenes Skript mit Systemrechten auszuführen.

Es gibt jedoch eine einfachere Möglichkeit, die Nur-Lese-Probleme zu umgehen, entweder durch Installieren dieser App oder durch manuelles Hinzufügen der media_rwGruppe zur WRITE_EXTERNAL_STORAGEin der Berechtigungsdatei. Dadurch können Apps, die die Berechtigung haben, auf die emulierte SD-Karte zu schreiben, auch auf die „externe“ SD-Karte schreiben.

Nachdem Sie Ihren externen Speicher beschreibbar gemacht haben, sollten Sie Symlinks ( ln -s /sdcard/MyPics /sdcard/DCIM/Camera) verwenden können, um einen schnellen Zugriff auf diese Verzeichnisse zu ermöglichen.