(Я уже публиковал этот вопрос в 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, есть решение? Спасибо.
(Если вы ищете, как переместить 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 является их первоначальный владелец. Приложение может работать очень хорошо!