Как «монтировать --bind» каталоги в Android 4.4?

Мне просто интересно, есть ли способ связать внутреннюю /sdcardпапку с другой внутренней /sdcardпапкой, и обычные приложения могут писать в нее для версий Android, начиная с 4.4?

У меня есть папка с именем ./MyPicsво внутреннем файле /sdcard. Я хочу привязать его к ./DCIM/Camera, ./Pictures/Screenshots, ./Movies/Screencasts. SD-карта монтируется /mnt/shell/emulated/0как sdcardfs, и на нее есть символическая ссылка /storage/emulated/legacy. Более того, есть директория /storage/emulated/0, которая не является ни точкой монтирования, ни симлинком. Это очень странный каталог.

  1. Я пробовал следующее:

    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  
    

    но это бесполезно: такие приложения, как Камера, не смогли записать в/DCIM/Camera

  2. Я пробовал следующее:

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

    но это тоже бесполезно

  3. Я пробовал следующее:

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

    Если есть файл с именем a.jpgв /MyPics, он появляется в /data/media/0/DCIM/Camera, но не появляется в/storage/emulated/legacy/DCIM/Camera

  4. Я пытался использовать такие приложения, как LuckPatcher, чтобы выполнить эту работу, но снова не получилось

Вы пробовали использовать ln -s? ln -s /sdcard/MyPics /sdcard/DCIM/Camera. Сначала вам нужно переместить папку «Камера».

Ответы (1)

К сожалению, начиная с Android 4.2, на большинстве устройств больше невозможно смонтировать папку и сделать ее доступной для других приложений. Подробности о том, как это работает и почему это было изменено, можно найти здесь: Исправление для пустых каталогов, установленных в приложениях (CifsManager и т. д.) в Android 4.2 .

На упомянутой выше странице говорится следующее:

Первоначально опубликовано сообщением фиксации патча Zygote

Zygote: ограничение пространства для монтирования ведомых устройств, чтобы приложения Dalvik могли монтировать общесистемные тома Android 4.2 реализует многопользовательское хранилище с использованием пространств имен монтирования для каждого процесса. Первоначально все под «/» (вся иерархия файловой системы) помечается как рекурсивно-ведомое пространство монтирования для всех экземпляров zygote. Это сделано для того, чтобы монтирование песочницы пользовательского хранилища в каталоге /storage/emulated было скрыто от других приложений и пользователей. К сожалению, это означает, что любое приложение Dalvik (на самом деле, любая программа, чьи предки клона/форка включают зиготу Dalvik, то есть все, кроме служб, порожденных непосредственно из init) не может монтировать общесистемные тома. Таким образом, такие приложения, как CifsManager, фактически сломаны в Android 4.2, поскольку его монтирования cifs видны только самому приложению CifsManager. Все остальные приложения видят пустые точки монтирования вместо смонтированного тома. Более того,

Здесь мы ограничиваем ведомое пространство монтирования /storage (и, из-за возможной ошибки ядра, /mnt/shell/emulated), чтобы приложения Dalvik могли монтировать общесистемные тома в другом месте (с соответствующим разрешением, как в более ранних версиях Android). , сохраняя при этом полную совместимость с многопользовательским хранилищем. Это изменение требует, чтобы том tmpfs был смонтирован как /storage в файле init.rc. Если этот том недоступен, Zygote возвращается к предыдущему поведению, помечая всю иерархию файловой системы как подчиненную. Это также неявно требует, чтобы EMULATED_STORAGE_TARGET имел префикс пути (часть подиерархии) ANDROID_STORAGE, что является типичным случаем.

Это сводится к тому, что если приложения монтируют каталог или блочное устройство, смонтированный каталог должен быть виден только для приложений, которые выполнили монтирование, если у приложения нет специальных разрешений, которые обычно недоступны для несистемных приложений. И даже если вам удастся смонтировать каталог глобально, разрешения Linux все равно будут мешать вам.

Таким образом, монтирование, вероятно, не самое простое решение вашей проблемы, но если вы действительно хотите использовать монтирование, вы должны иметь возможность добавить команды, /system/bin/debuggerdа затем (как root) войти start debuggerd, чтобы выполнить свой собственный скрипт с системными привилегиями.

Однако существует более простой способ обойти проблемы только для чтения: либо установить это приложение, либо вручную добавить media_rwгруппу WRITE_EXTERNAL_STORAGEв файл разрешений. Это позволяет приложениям, имеющим разрешение на запись на эмулируемую SD-карту, также записывать на «внешнюю» SD-карту.

После того, как ваше внешнее хранилище станет доступным для записи, вы сможете использовать символические ссылки ( ln -s /sdcard/MyPics /sdcard/DCIM/Camera), чтобы обеспечить быстрый доступ к этим каталогам.