В предыдущей статье «Проблема перемещения приложений на SD карту» я поделился трудностями, стоящими перед пользователями желающими решить проблему нехватки внутренней памяти на телефонах, и в общем-то для меня и моего планшета задача казалось неразрешимой, но прошло время и я нашел решение для моего планшета Леново Таб 3 8 Плюс (модель TB-8703X), которое я хочу привести в рамках этой статьи.
Идея установки довольна проста: найти на планшете какой-нибудь каталог, в который можно записать рукотворный скрипт по поддержке приложения Link2SD, причем он должен запускаться в конце загрузки и перед запуском самой системы. В нем надо организовать всевозможную поддержку данного приложения.
Вроде бы все просто.
Это сделано на нижеуказанном устройстве, на других устройствах не испытывалось.
Итак мы имеем:
Планшет Lenovo Tab 3 8 Plus (модель TB-8703x)
OS Android Marshmallow v.6.0.1
Процессор qualcomm snapdragon 625
Размер внутренней памяти 16 GB
Дополнительно я купил SD-карту фирмы Samsung — 64.0 GB, class 10.
Вспомогательные требования:
- Планшет должен быть рутирован
- Установлен ADB — ошибка каталог для размещения скрипта /data/adb/service.d — создает magisk
- Shell для создания скриптов
Инструменты (для удобства):
- Эмулятор терминала (у меня termoneplus)
- Explorer (у меня TotalCommander)
- Apk Inspector или Apk Analyser (но можно обойтись)
У меня приложение com.buak.Link2SD_apkdone.com.apk или другое со словами Link2SD внутри.
Итак начнем, с формирования скрипта поддержки:
- Разбейте вашу SD-карту на два первичных раздела, первый отформатируйте FAT32, второй — ext4, вставьте в планшет. У меня 32 Гб и 30 Гб.
- Установите Link2SD (все равно нужен), если работает, то возрадуемся, на этом все.
- Если не работает, попробуем по другому:
У меня стоит Shell /system/bin/sh, думаю и у вас тоже. К сожалению, целый ряд причин делает работу с init.d, написание и отладку скриптов чрезвычайно неудобной, не работает awk, stdin, stdout,… .
Поэтому я отказался от этого каталога и остановился на каталоге: /data/adb/service.d
В качестве logfile-а я взял /data/local/tmp/log.txt. - С помощью ApkInspector или ApkAnalyser определите каталог данных приложения Link2SD
(Это будет Data Dir или Data Path) , если у вас их нет, просто откройте в Total Commander каталог
/data/user/0/com.buak.Link2SD (после '0' название вашего продукта), откройте подкаталог /files, возьмите на просмотр/редактирование файл init-link2sd.sh , у вас будет что-то наподобие:
mount -t ext4 -o,noatime /dev/block/mmcblk1p2 /data/sedext2 1>>$Log 2>>$Log
mount -t ext4 -o,noatime /dev/block/vold/public:179_66 /data/sedext2 1>>$Log 2>>$Log
Внимание: названия устройств сохраняйте буквально.
Для правильной работы приложения Link2SD, обе команды должны быть выполнены, если ваша SD-карта подготовлена правильно, то по меньшей мере первый диск /dev/block/mmcblk1p2 должен быть в списке устройств и быть в списке смонтированных устройств (команда mount без аргументов), то есть должна существовать точка монтирования-каталог /data/sdext2. Вторая команда монтирует этот же раздел к специальному файлу /dev/block/vold/public:179_66, он должен быть нулевой длины и находиться в каталоге /dev/block/vold/ с названием public:179_66. Если его не будет, и если у вас также как у меня "не все дома", то после перезагрузки он исчезнет. Это означает, что нам будет нужна следующая команда: - Команда создания специального файла:
mknod -m 600 /dev/block/void/public:179_66 b 179 66
Она создает специальный файл устройства нулевой длины public:179_66 в каталоге /dev/block/void/
Для того чтобы он сохранился и после перегрузки нужна следующая команда. - Это команда перезапуска демона vold:
setprop ctl.restart vold
Пояснение: В каталоге /etc/ в файле vold.fstab написано:
dev_mount sdcard /storage/sdcard1 auto /devices.msm_sdcc.2/mmc_host
Эта команда связывает специальный файл с драйвером SD карты.
Таким образом мы составили скрипт link2sd-support.sh:
#!/system/bin/sh
set +e
echo "$(date) проверка специального файла устройства" > "/data/local/tmp/log.txt"
file=/dev/block/vold/public:179_66
test -b "$file"
res="$?"
echo «test -b file ended with $res» >>"/data/local/tmp/log.txt"
if [ $res -ne 0 ]
then
mknod -m 600 /dev/block/vold/public:179_66 b 179 66
echo «mknod ended eq $?» >>"/data/local/tmp/log.txt"
fi
echo "$(date) vold restart" >>"/data/local/tmp/log.txt"
setprop ctl.restart vold
echo «vold restarted» >> "/data/local/tmp/log."
sleep 2
echo "$(date)mounting..." >> "/data/local/tmp/log.txt"
mount -t ext4 -o rw,noatime /dev/block/mmcblk1p2 /data/sdext2
echo «mount mmcblk1p2 ended with $?» >> "/data/local/tmp/log."
sleep 10
mount -t ext4 -o rw,noatime /dev/block/vold/public:179_66 /data/sdext2
echo «mount public ended with $?» >> "/data/local/tmp/log.txt"
mount >> "/data/local/tmp/log.txt"
echo «mount finished» >> "/data/local/tmp/log.txt"
chmod 773 /data/dalvik-cache
Внимание: После того как вы поместили скрипт link2sd-support.sh в каталог /data/adb/service.d не забудьте предоставить право на выполнение -rwxr-xr-x и владения (root). После перезагрузки Link2SD должен заработать, в противном случае смотрите лог и исправляйте ошибки.
Внимание: В случае успеха при просмотре total commander-ом, в приложении SD-maid вы должны увидеть новый диск "SD-карта 20.5G / 23.9G ... /data/sdext2", обратите на название диска SD-карта - слово карта на русском!? Кто-то из русскоговорящих есть и там!
Результат: У меня пользовательских приложений 31, после перемещения я получил выигрыш внутренней памяти 3.4 Гб
Содержимое и разбор лог файла (/data/local/tmp/log.text):
Содержимое лог файла (/data/local/tmp/log.text):
echo "$(date) проверка специального файла устройства" > "/data/local/tmp/log.txt"
Sun Sep 27 17:26:06 ALMT 1970 проверка специального файла устройства
как видите в момент выдачи этого эха дата еще не рабоате — дата начала эпохи
file=/dev/block/vold/public:179,66
test -b "$file"
res="$?"
echo «test -b file ended with $res» >>"/data/local/tmp/log.txt"
test -b file ended with 1 результат проверки наличия спец.файла равен 1, значит файла нет, выполянем команду создания спец.файла
if [ $res -ne 0 ]
then
mknod -m 600 /dev/block/vold/public:179_66 b 179 66
echo «mknod ended eq $?» >>"/data/local/tmp/log.txt"
fi
mknod ended eq 0
Это сообщение подтверждает успешное выполнение операции создания спецюфайла
echo "$(date) vold restart" >>"/data/local/tmp/log.txt"
Fri Jan 20 20:20:32 ALMT 2023 vold restart
как видите дата пришла в порядок
setprop ctl.restart vold
echo «vold restarted» >> "/data/local/tmp/log.
vold restarted
перезапуск vold сделан
echo "$(date)mounting..." >> "/data/local/tmp/log.txt"
Fri Jan 20 20:20:34 ALMT 2023mounting...
монтирование началось...
mount -t ext4 -o rw,noatime /dev/block/mmcblk1p2 /data/sdext2
echo «mount mmcblk1p2 ended with $?» >> "/data/local/tmp/log.
mount mmcblk1p2 ended with 0
первая команда монтирования завершилась успешно
sleep 10
mount -t ext4 -o rw,noatime /dev/block/vold/public:179_66 /data/sdext2
echo «mount public ended with $?» >> "/data/local/tmp/log.txt"
mount public ended with 255
вторая команда монтирования не выполнилась
/* особенность выполнения 2-х команд mount с одной точкой монтирования вторая команда дает сообщение «device or resource busy»
небольшая задержка (2-10 msec) ничего не меняет, большая задержка (1000 msec) скорее всего выполнение скрипта прекращается, что в самом деле происходит не знаю.
Однако есть особенность, если /dev/block/mmcblk1p2 есть всегда, то достаточно отмонтировать его вручную один раз, он будет в наличии и после перезагрузки и может его не надо больше монтировать, /dev/block/vold/public:179_66 при перезагрузке каждый раз удаляется, поэтому монтировать его, на всякий случай, нужно раньше другого. Хотя диск SD-карта уже есть и отображен на /data/sdext2, так что ошибка монтирования в скрипте не отражается на его наличии. Похоже демон vold вносит их в список устройств (device list) и они монтируются автоматически. Это мое предположение, те не менее Link2SD работает. Я перенес 30 моих приложений и сэкономил 3.4 Гб.
*/
mount >> "/data/local/tmp/log.txt"
rootfs on / type rootfs (ro,seclabel,size=1353428k,nr_inodes=338357)
tmpfs on /dev type tmpfs (rw,seclabel,nosuid,relatime,size=1459096k,nr_inodes=364774,mode=755)
devpts on /dev/pts type devpts (rw,seclabel,relatime,mode=600)
proc on /proc type proc (rw,relatime)
sysfs on /sys type sysfs (rw,seclabel,relatime)
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)
debugfs on /sys/kernel/debug type debugfs (rw,seclabel,relatime)
none on /acct type cgroup (rw,relatime,cpuacct)
none on /sys/fs/cgroup type tmpfs (rw,seclabel,relatime,size=1459096k,nr_inodes=364774,mode=750,gid=1000)
tmpfs on /mnt type tmpfs (rw,seclabel,relatime,size=1459096k,nr_inodes=364774,mode=755,gid=1000)
none on /dev/cpuctl type cgroup (rw,relatime,cpu)
/dev/block/bootdevice/by-name/system on /system type ext4 (ro,seclabel,relatime,discard,data=ordered)
/dev/block/bootdevice/by-name/cache on /cache type ext4 (rw,seclabel,nosuid,nodev,relatime,data=ordered)
/dev/block/bootdevice/by-name/persist on /persist type ext4 (rw,seclabel,nosuid,nodev,relatime,data=ordered)
/dev/block/bootdevice/by-name/dsp on /dsp type ext4 (ro,seclabel,nosuid,nodev,relatime,data=ordered)
/dev/block/bootdevice/by-name/modem on /firmware type vfat (ro,context=u:object_r:firmware_file:s0,relatime,uid=1000,gid=1000,fmask=0337,dmask=0227,codepage=437,iocharset=iso8859-1,shortname=lower,errors=remount-ro)
tmpfs on /storage type tmpfs (rw,seclabel,relatime,size=1459096k,nr_inodes=364774,mode=755,gid=1000)
tmpfs on /sbin type tmpfs (rw,seclabel,relatime,size=1459096k,nr_inodes=364774,mode=755)
none on /config type configfs (rw,relatime)
adb on /dev/usb-ffs/adb type functionfs (rw,relatime)
/dev/block/dm-0 on /data type ext4 (rw,seclabel,nosuid,nodev,relatime,discard,noauto_da_alloc,data=ordered)
/sbin/.magisk/block/system on /sbin/.magisk/mirror/system type ext4 (ro,seclabel,relatime,discard,data=ordered)
/sbin/.magisk/block/data on /sbin/.magisk/mirror/data type ext4 (rw,seclabel,relatime,discard,noauto_da_alloc,data=ordered)
/sbin/.magisk/block/data on /sbin/.magisk/modules type ext4 (rw,seclabel,relatime,discard,noauto_da_alloc,data=ordered)
/sbin/.magisk/block/data on /system/app/PhaseBeam/PhaseBeam.apk type ext4 (rw,seclabel,relatime,discard,noauto_da_alloc,data=ordered)
/dev/block/mmcblk1p2 on /data/sdext2 type ext4 (rw,seclabel,noatime,data=ordered)
/dev/fuse on /mnt/runtime/default/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
/dev/fuse on /storage/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
/dev/fuse on /mnt/runtime/read/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
/dev/fuse on /mnt/runtime/write/emulated type fuse (rw,nosuid,nodev,noexec,noatime,user_id=1023,group_id=1023,default_permissions,allow_other)
echo «mount finished» >> "/data/local/tmp/log.txt"
mount finished
chmod 773 /data/dalvik-cache
Присылайте вопросы по мере их возникновения. Постараюсь ответить.
С уважением,
Радмир.
Сейчас у меня на Link2SD памяти доступно 24 Гб и используется 4.6 Гб
Мой планшет не дает возможности сделать разблокировку загрузчика, в итоге я искал другое решение.
С уважением,
Радмир.