Wie kann man Verzeichnisse in Android 4.4 einbinden?

7

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

Ich habe einen Ordner ./MyPicsim internen benannt /sdcard. Ich möchte es binden ./DCIM/Camera, ./Pictures/Screenshots, ./Movies/Screencasts. Die SD-Karte ist in /mnt/shell/emulated/0as sdcardfseingelegt und mit dieser verknüpft /storage/emulated/legacy. Darüber hinaus gibt es ein Verzeichnis /storage/emulated/0, das weder ein Einhängepunkt noch ein Symlink ist. Es ist ein sehr seltsames Verzeichnis.

  1. Ich habe folgendes 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 Sinn: Apps wie Camera konnten nicht schreiben /DCIM/Camera

  2. Ich habe folgendes versucht:

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

    aber es hat auch keinen Sinn

  3. Ich habe folgendes versucht:

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

    Wenn eine Datei mit dem Namen a.jpgin vorhanden ist /MyPics, wird sie in angezeigt /data/media/0/DCIM/Camera, jedoch nicht in/storage/emulated/legacy/DCIM/Camera

  4. Ich habe versucht, Apps wie LuckPatcher zu verwenden, um den Job zu erledigen, aber es ist erneut fehlgeschlagen

zccoding
quelle
Haben Sie versucht, zu verwenden ln -s? ln -s /sdcard/MyPics /sdcard/DCIM/Camera. Sie müssen zuerst den Kameraordner verschieben.
Keepcalm

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: Korrektur für leere App-gemountete Verzeichnisse (CifsManager usw.) in Android 4.2 .

Die oben erwähnte Seite sagt dies:

Zitat von Zygote Patch Commit Nachricht

Zygote: Beschränken Sie den Slave-Mountspace, damit Dalvik-Apps systemweite Volumes bereitstellen können. Android 4.2 implementiert Mehrbenutzerspeicher mithilfe prozessbezogener Mount-Namespaces. Ursprünglich ist alles unter "/" (die gesamte Dateisystemhierarchie) als rekursiver Slave-Mountspace für alle Zygote-Instanzen markiert. Dies geschieht, damit Benutzerspeicher-Sandbox-Bereitstellungen unter / storage / emulated vor anderen Apps und Benutzern ausgeblendet werden. Leider bedeutet dies, dass jede Dalvik-App (tatsächlich jedes Programm, dessen Klon- / Gabel-Abstammung eine Dalvik-Zygote enthält, die alles außer Diensten ist, die direkt von init erzeugt wurden) keine systemweiten Volumes bereitstellen kann. Daher sind Apps wie CifsManager in Android 4.2 effektiv kaputt, da die Cifs-Mounts nur für die CifsManager-App selbst sichtbar sind. Alle anderen Apps sehen leere Mountpunkte 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 bereitstellen können (mit entsprechender Berechtigung, wie in früheren Versionen von Android). unter Beibehaltung der vollständigen Speicherkompatibilität für mehrere Benutzer. Diese Änderung erfordert, dass ein tmpfs-Volume als / storage in init.rc bereitgestellt wird. Wenn dieses Volume nicht verfügbar ist, greift Zygote auf das vorherige Verhalten zurück, bei dem die gesamte Dateisystemhierarchie als Slave markiert wurde. Es erfordert auch implizit, dass EMULATED_STORAGE_TARGET dem Pfad (Teil der Unterhierarchie von) ANDROID_STORAGE vorangestellt wird, was der typische Fall ist.

Wenn Apps ein Verzeichnis mounten oder ein Gerät blockieren, sollte das gemountete Verzeichnis nur für die Apps sichtbar sein, die das Mounten durchgeführt haben, es sei denn, die App verfügt über spezielle Berechtigungen, die für Nicht-System-Apps im Allgemeinen nicht verfügbar sind. Und selbst wenn Sie es schaffen, das Verzeichnis global bereitzustellen, stehen Ihnen die Linux-Berechtigungen weiterhin im Weg.

Daher ist das Mounten wahrscheinlich nicht die einfachste Lösung für Ihr Problem. Wenn Sie jedoch 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 Systemberechtigungen auszuführen.

Es gibt jedoch eine einfachere Möglichkeit, die schreibgeschützten Probleme zu umgehen, indem Sie diese App installieren oder die media_rwGruppe manuell WRITE_EXTERNAL_STORAGEzur Berechtigungsdatei hinzufügen . Auf diese Weise können Apps, die zum Schreiben auf die emulierte SD-Karte berechtigt sind, 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.

gertmenkel
quelle