7 votos

¿Cómo "montar --bind" directorios en Android 4.4?

Me pregunto si hay una forma de vincular un /sdcard a otra carpeta interna /sdcard y las aplicaciones normales pueden escribir en ella para las versiones de Android desde la 4.4?

Tengo una carpeta llamada ./MyPics en el interior /sdcard . Quiero vincularlo a ./DCIM/Camera , ./Pictures/Screenshots , ./Movies/Screencasts . La tarjeta SD se monta en /mnt/shell/emulated/0 como sdcardfs y está vinculado a /storage/emulated/legacy . Además, existe un directorio /storage/emulated/0 que no es ni un punto de montaje ni un enlace simbólico. Es un directorio muy extraño.

  1. Intenté lo siguiente:

    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  

    pero no tiene ninguna utilidad: Las aplicaciones como Camera no pudieron escribir en /DCIM/Camera

  2. Intenté lo siguiente:

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

    pero tampoco tiene ninguna utilidad

  3. Intenté lo siguiente:

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

    Si hay un archivo llamado a.jpg en /MyPics aparece en /data/media/0/DCIM/Camera pero no aparece en /storage/emulated/legacy/DCIM/Camera

  4. Intenté usar aplicaciones como LuckPatcher para hacer el trabajo, pero volvió a fallar

0 votos

¿Has probado a utilizar ln -s ? ln -s /sdcard/MyPics /sdcard/DCIM/Camera . Primero tendrás que mover la carpeta de la Cámara.

1voto

slugster Puntos 27178

Desafortunadamente, desde Android 4.2 ya no es posible en la mayoría de los dispositivos montar una carpeta y hacerla disponible para otras aplicaciones también. Los detalles de cómo funciona esto y por qué se cambió se pueden encontrar aquí: Corrección de directorios vacíos montados en aplicaciones (CifsManager, etc.) en Android 4.2 .

La página mencionada anteriormente dice esto:

Publicado originalmente por Zygote patch commit message

Zygote: Restringir el espacio de montaje esclavo para que las aplicaciones Dalvik puedan montar volúmenes de todo el sistema Android 4.2 implementa el almacenamiento multiusuario utilizando espacios de nombres de montaje por proceso. Originalmente, todo lo que está bajo "/" (toda la jerarquía del sistema de archivos) se marca como espacio de montaje esclavo recursivo para todas las instancias de zygote. Esto se hace para que los montajes sandbox de usuario bajo /storage/emulated estén ocultos a otras aplicaciones y usuarios. Desafortunadamente, esto significa que cualquier aplicación Dalvik (en realidad, cualquier programa cuyo clon/fork incluya un cigoto Dalvik, que es todo excepto los servicios generados directamente desde init) no puede montar volúmenes a nivel de sistema. Por lo tanto, aplicaciones como CifsManager están efectivamente rotas en Android 4.2, ya que sus montajes cifs sólo son visibles para la propia aplicación CifsManager. Todas las demás aplicaciones ven puntos de montaje vacíos en lugar del volumen montado. Además, Linux no proporciona ninguna disposición para que un proceso "escape" de un espacio de montaje recursivo-esclavo en versiones anteriores a Linux 3.8 (setns syscall).

En este caso, restringimos el espacio de montaje esclavo a /storage (y, debido a un posible error del kernel, a /mnt/shell/emulated) para que las aplicaciones Dalvik puedan montar volúmenes de todo el sistema en cualquier otro lugar (con los permisos adecuados, como en versiones anteriores de Android), al tiempo que se mantiene la compatibilidad total con el almacenamiento multiusuario. Este cambio requiere que se monte un volumen tmpfs como /storage en init.rc. Si este volumen no está disponible, entonces Zygote vuelve al comportamiento anterior de marcar toda la jerarquía del sistema de archivos como esclavo. También requiere implícitamente que EMULATED_STORAGE_TARGET esté prefijado por (parte de la subjerarquía de) ANDROID_STORAGE, que es el caso típico.

Lo que viene a decir es que si las aplicaciones montan un directorio o un dispositivo de bloque, el directorio montado sólo debería ser visible para las aplicaciones que hicieron el montaje, a menos que la aplicación tenga permisos especiales, que generalmente no están disponibles para las aplicaciones no relacionadas con el sistema. E incluso si consigues montar el directorio de forma global, los permisos de Linux seguirán estorbando.

Por lo tanto, el montaje no es probablemente la solución más fácil a su problema, pero si usted realmente quiere usar montajes debe ser capaz de añadir los comandos a /system/bin/debuggerd y luego (como Root) introduzca start debuggerd para ejecutar su propio script con privilegios del sistema.

Sin embargo, hay una forma más fácil de evitar los problemas de sólo lectura, ya sea instalando esta aplicación o añadiendo manualmente el media_rw grupo a la WRITE_EXTERNAL_STORAGE en el archivo de permisos. Esto permite que las aplicaciones que tienen permiso para escribir en la tarjeta SD emulada también escriban en la tarjeta SD "externa".

Después de hacer que su almacenamiento externo sea escribible, debería poder utilizar enlaces simbólicos ( ln -s /sdcard/MyPics /sdcard/DCIM/Camera ) para permitir un acceso rápido a estos directorios.

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X