Перенос приложений в системную память на Android

в 9:10, , рубрики: android, метки:

Многие пользователи смартфонов на замечательной ОС Android, сталкиваются с проблемой нехватки памяти.
В большинстве случаев предлагается переносить приложения на карту памяти, хотя это не единственный способ «освободить» место на телефоне.
Дело в том, что все устанавливаемые пользователем приложения, попадают в директорию /data/app, а предустановленные (системные) в /system/app. Эти директории расположены на разных логических дисках и, соответственно, имеют разную «вместимость».

Для уверенного Unix-юзера дальнейшие действия, я думаю, понятны, но тем, кому не понятны

Дополнительная информация
Все действия проводились на Samsung GALAXY Xcover c Android 2.3.6 на борту.

Подготовка:

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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js