Многие пользователи смартфонов на замечательной ОС Android, сталкиваются с проблемой нехватки памяти.
В большинстве случаев предлагается переносить приложения на карту памяти, хотя это не единственный способ «освободить» место на телефоне.
Дело в том, что все устанавливаемые пользователем приложения, попадают в директорию /data/app, а предустановленные (системные) в /system/app. Эти директории расположены на разных логических дисках и, соответственно, имеют разную «вместимость».
Для уверенного Unix-юзера дальнейшие действия, я думаю, понятны, но тем, кому не понятны
Подготовка:
1. Устанавливаем Android SDK (нам понадобится только утилита adb). Информации полно в сети, т.ч. не буду заострять на этом внимание.
2. «Рутуем» телефон (я использовал AndroidSU.com).
К настоящему моменту я уже удалил некоторые системные приложения и перенёс приложения ВКонтакте и Facebook (т.к. они занимают много места, а также дополняют контакты). Сейчас будем переносить виджет прогноза погоды от Яндекса.
Стоит отметить, что не все приложения будут согласны с переносом. Например, Dr.Web Light умирает от такого варварства.
Не забудьте сделать бэкап!!!
Для начала подключимся к консоли телефона:
> sudo adb start-server
[sudo] password for sabo:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
> adb shell
$ su
# ash
BusyBox v1.14.1 (2010-01-29 17:22:20 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
/ #
Я использую командную оболочку Almquist shell (ash) для удобства работы (например, автодополнения).
Смотрим установленные приложения:
/ # ls -l /data/app
-rw-r--r-- system system 6581180 2012-11-14 21:25 com.google.android.apps.maps-1.apk
-rw-r--r-- system system 6441811 2012-11-14 21:27 com.google.android.apps.docs-2.apk
-rw-r--r-- system system 13766444 2012-11-16 13:59 com.facebook.katana-1.apk
-rw-r--r-- system system 2364762 2012-04-05 14:36 com.google.android.gm-1.apk
-rw-r--r-- system system 6327832 2012-11-14 17:30 com.google.android.youtube-2.apk
-rw-r--r-- system system 2321797 2012-03-19 15:49 com.google.android.voicesearch-1.apk
-rw-r--r-- system system 5482490 2012-11-01 03:14 com.android.vending-2.apk
-rw-r--r-- system system 468393 2012-08-30 05:36 com.katzoft.gmailwidget-2.apk
-rw-r--r-- system system 5559098 2012-08-14 04:39 ru.yandex.weatherplugin-2.apk
-rw-r--r-- system system 1735029 2012-10-04 21:12 com.google.android.gms-1.apk
-rw-r--r-- system system 264451 2012-10-12 12:58 com.google.android.street-1.apk
ru.yandex.weatherplugin-2.apk — это приложение и будем переносить, что позволит нам освободить более 5 МБ! :)
Занято / свободно:
/ # df
Filesystem Size Used Free Blksize
/dev 158M 40K 158M 4096
/mnt/asec 158M 356K 157M 4096
/mnt/obb 158M 0K 158M 4096
/system 238M 228M 9M 4096
/mnt/nvm 2M 90K 1M 512
/cache 25M 13M 12M 4096
/mnt/.lfs: Function not implemented
/efs 6M 6K 6M 512
/data 165M 146M 18M 4096
/marvell 6M 5M 500K 512
/mnt/sdcard 1G 919M 990M 32768
/mnt/secure/asec 1G 919M 990M 32768
/mnt/asec/org.connectbot-1 2M 728K 1M 4096
/mnt/asec/com.adobe.reader-1 12M 10M 1M 4096
/mnt/asec/ru.yandex.yandexmaps-1 20M 18M 2M 4096
/mnt/asec/com.region-1 3M 1M 1M 4096
/mnt/asec/ru.yandex.rasp-1 3M 1M 1M 4096
/mnt/asec/appinventor.ai_progetto2003.SCAN-1 3M 1M 1M 4096
/mnt/asec/com.lingualeo.android-1 11M 10M 1M 4096
/mnt/asec/com.lonedwarfgames.tanks.androidpaid-2 20M 18M 2M 4096
/mnt/asec/com.ea.worms_row-1 3M 1M 1M 4096
/mnt/asec/com.itbenefit.android.Minesweeper-1 2M 692K 1M 4096
/mnt/asec/com.opera.browser-2 20M 19M 1M 4096
/mnt/asec/com.google.android.apps.chrometophone-1 2M 196K 1M 4096
mount:
/ # mount
rootfs / rootfs ro,relatime 0 0
tmpfs /dev tmpfs rw,relatime,mode=755 0 0
devpts /dev/pts devpts rw,relatime,mode=600 0 0
proc /proc proc rw,relatime 0 0
sysfs /sys sysfs rw,relatime 0 0
tmpfs /mnt/asec tmpfs rw,relatime,mode=755,gid=1000 0 0
tmpfs /mnt/obb tmpfs rw,relatime,mode=755,gid=1000 0 0
/dev/stl16 /system rfs ro,relatime,vfat,log_off,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl19 /mnt/nvm rfs rw,nosuid,nodev,relatime,vfat,llw,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl20 /cache rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl21 /mnt/.lfs j4fs rw,relatime 0 0
/dev/stl22 /efs rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl17 /data rfs rw,nosuid,nodev,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/stl18 /marvell rfs rw,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=cp437 0 0
/dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/179:1 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
tmpfs /mnt/sdcard/.android_secure tmpfs ro,relatime,size=0k,mode=000 0 0
/dev/block/dm-0 /mnt/asec/org.connectbot-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-1 /mnt/asec/com.adobe.reader-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-2 /mnt/asec/ru.yandex.yandexmaps-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-3 /mnt/asec/com.region-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-4 /mnt/asec/ru.yandex.rasp-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-5 /mnt/asec/appinventor.ai_progetto2003.SCAN-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-6 /mnt/asec/com.lingualeo.android-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-7 /mnt/asec/com.lonedwarfgames.tanks.androidpaid-2 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-8 /mnt/asec/com.ea.worms_row-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-9 /mnt/asec/com.itbenefit.android.Minesweeper-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-10 /mnt/asec/com.opera.browser-2 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/dm-11 /mnt/asec/com.google.android.apps.chrometophone-1 vfat ro,dirsync,nosuid,nodev,relatime,uid=1000,fmask=0222,dmask=0222,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
Как видим, директория /data/app находится на устройстве /dev/stl17, а директория /system/app на /dev/stl16, где свободно целых 9М!
Для того, чтобы иметь возможность записывать в system, нам необходимо перемонтировать устройство с флагом rw:
/ # mount -o rw,remount /dev/stl16 /system
/ # mount | grep system
/dev/stl16 /system rfs rw,relatime,vfat,llw,check=no,gid/uid/rwx,iocharset=cp437 0 0
Далее копируем выбранной приложение и удаляем его по старому адресу (mv не работает, т.к. это разные логические диски):
/ # cp /data/app/ru.yandex.weatherplugin-2.apk /system/app/ru.yandex.weatherplug
in-2.apk
/ # rm /data/app/ru.yandex.weatherplugin-2.apk
После этого я, на всякий случай, перезагружаю телефон.
Проверим свободную память:
/ # df
Filesystem Size Used Free Blksize
/dev 158M 40K 158M 4096
/mnt/asec 158M 360K 157M 4096
/mnt/obb 158M 0K 158M 4096
/system 238M 234M 4M 4096
/mnt/nvm 2M 90K 1M 512
/cache 25M 13M 12M 4096
/mnt/.lfs: Function not implemented
/efs 6M 6K 6M 512
/data 165M 141M 23M 4096
/marvell 6M 5M 500K 512
/mnt/sdcard 1G 919M 990M 32768
/mnt/secure/asec 1G 919M 990M 32768
/mnt/asec/com.region-1 3M 1M 1M 4096
/mnt/asec/com.google.android.apps.chrometophone-1 2M 196K 1M 4096
/mnt/asec/ru.yandex.yandexmaps-1 20M 18M 2M 4096
/mnt/asec/com.adobe.reader-1 12M 10M 1M 4096
/mnt/asec/ru.yandex.rasp-1 3M 1M 1M 4096
/mnt/asec/org.connectbot-1 2M 728K 1M 4096
/mnt/asec/com.ea.worms_row-1 3M 1M 1M 4096
/mnt/asec/com.lonedwarfgames.tanks.androidpaid-2 20M 18M 2M 4096
/mnt/asec/appinventor.ai_progetto2003.SCAN-1 3M 1M 1M 4096
/mnt/asec/com.itbenefit.android.Minesweeper-1 2M 692K 1M 4096
/mnt/asec/com.opera.browser-2 20M 19M 1M 4096
/mnt/asec/com.lingualeo.android-1 11M 10M 1M 4096
Перенос приложения не даёт никакого дискомфорта при работе с ним (единственное отличие — этображение приложения как системное, но это не мешает ему автоматически обновляться).
Дополнительный совет:
В директории /data содержится куча разной информации, например логи (/data/log).
Если проявить определённую смелость и осторожность, можно получить ещё немного места.
Вопросы, на которые я пока не могу ответить:
— Нужно ли установить пароль на root-пользователя. По идее, это было бы не плохо, т.к. вызов su даёт root-привелегии без каких-либо вопросов.
— Можно ли до упора «забить» /system. По моим наблюдениям, размер директории не растёт, да и нет там содержимого, которое могло бы «вырости», но сохранять разумный предел, думаю, стоит.
Автор: devpreview