Android monta la tarjeta sd externa obb a la tarjeta SD interna con éxito

(Publicé esta pregunta en Stack Overflow antes ( https://stackoverflow.com/questions/42738392/android-mount-obb-to-external-sd-card-failed ), luego descubrí que aquí puede ser un mejor lugar para publicar esta pregunta.)

Quiero mover el obb (1 GB) de un juego a la tarjeta SD. Copié el archivo obb en la tarjeta SD y el enlace simbólico mediante:

su
ln -sf /storage/sdcard1/Android/obb/com.game /sdcard/Android/obb/com.game

pero falló con "función no implementada".

Lo busqué en Google y obtuve "algún sistema de archivos no admite enlaces simbólicos".

Así que traté de usar el montaje por comando:

su
mount -o bind /storage/sdcard1/Android/obb/com.game /sdcard/Android/obb/com.game

pero encontré que solo la raíz puede ver los archivos en la carpeta. Entonces lo hago:

cd /system/bin/
chmod 4777 ./toolbox #make anyone can use mount(in toolbox)
su u0_aXXX #the game's uid
mount -o bind /storage/sdcard1/Android/obb/com.game /sdcard/Android/obb/com.game
ls -l /sdcard/Android/obb/com.game
$ -rwxrwx--- u0_aXXX sdcard_r com.game.obb

pero cuando yo

cat /sdcard/Android/obb/com.game/com.game.obb
$ cat: /sdcard/…ame.obb permission denied

Estoy usando android5, ¿alguna solución? Gracias.

Respuestas (1)

(Si está encontrando cómo mover obb a una tarjeta SD externa y volver a montarla en la interna, ¡aquí está el lugar correcto!) ¡Finalmente encontré la solución a esta pregunta por mí mismo! La aplicación no puede acceder al obb por sí misma, requiere media_rw para acceder. Encontrado por lsof:

sdcard 340 media_rw 15 ??? ??? ??? ???
/data/media/obb/com.game/com.game.obb
sdcard 340 media_rw 17 ??? ??? ??? ???
/data/media/obb/com.game/com.game.obb
com.game 26335 u0_a266 36 ??? ??? ??? ???
/storage/emulated/0/Android/obb/com.game/com.game.obb
com.game 26335 u0_a266 37 ??? ??? ??? ???
/storage/emulated/0/Android/obb/com.game/com.game.obb 

Así que tengo que montar la carpeta de la tarjeta SD externa en dos lugares y cada uno debe tener su propietario correcto:

owner    folder
u0_a266  /storage/emulated/legacy/Android/obb/com.game
media_rw /data/media/obb/com.game

Pero si monto /storage/sdcard1/Android/obb/com.game en esos dos lugares, se convertirá en:

owner    folder
u0_a266  /storage/emulated/legacy/Android/obb/com.game
u0_a266  /data/media/obb/com.game

Entonces encontré si lo hago:

mount -o bind /storage/sdcard1/Android/obb/com.game /storage/emulated/legacy/Android/obb/com.game
mount -o bind /mnt/media_rw/sdcard1/Android/obb/com.game /data/media/obb/com.game

Encontré que esto funciona bien, porque la fuente y el destino del comando de montaje es su propietario original. ¡La aplicación puede funcionar muy bien!