Android монтирует внешнюю SD-карту obb на внутреннюю SD-карту успешно

(Я уже публиковал этот вопрос в Stack Overflow ( https://stackoverflow.com/questions/42738392/android-mount-obb-to-external-sd-card-failed ), затем я обнаружил, что здесь может быть лучшее место для публикации этот вопрос.)

Я хочу переместить кэш игры (1 ГБ) на SD-карту. Скопировал файл obb на SD-карту и символическую ссылку:

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

но не удалось с «функция не реализована».

Я погуглил и получил "некоторая файловая система не поддерживает символическую ссылку".

Поэтому я попытался использовать mount по команде:

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

но я обнаружил, что только root может видеть файлы в папке. Затем я делаю:

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

Но когда я

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

Я использую android5, есть решение? Спасибо.

Ответы (1)

(Если вы ищете, как переместить obb на внешнюю SD-карту и смонтировать ее обратно на внутреннюю, то вам сюда!) Наконец-то я сам нашел решение этого вопроса! Приложение не может получить доступ к obb само по себе, для доступа к нему требуется media_rw. Найдено с помощью 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 

Поэтому мне нужно смонтировать внешнюю папку SD-карты в два места, и у каждого должен быть свой правильный владелец:

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

Но если я смонтирую /storage/sdcard1/Android/obb/com.game в эти два места, получится:

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

Затем я обнаружил, что если я это сделаю:

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

Я обнаружил, что это работает нормально, потому что источником и местом назначения команды mount является их первоначальный владелец. Приложение может работать очень хорошо!