Немного об A2SD и App2SD

Андроид 2.3 очень порадовал тем, что теперь эффективность встроенного A2SD (возможность переноса приложений на флешку) возросла в разы. А изменилось не столь многое: если раньше переносился только *.apk-пакет, а данные оставались в основной памяти, то теперь вместе с пакетом переносится и часть данных, а именно, папка /lib, которая обычно занимает больше всего места. Подробности дальше.

Вкратце: Каждое приложение в операционной системе Андроид состоит из одного *.apk-файла, который является и установочным, и установленным. Но при установке происходят некоторые действия, увеличивающие занимаемое место, а именно:
• apk-файл переименовывается в соответствии с классом (уникален), помещается в /data/app/
• создаётся папка данных, совпадающая с классом пакета, например /data/data/com.google.android.youtube с подкаталогами, предназначенными для различных данных:
— lib — бинарные библиотеки приложения, *.so-файлы.
— files — различные файлы приложения, возможен любой контент.
— shared_prefs — xml-описание настроек.
— cache — кэш, временные файлы. Может быть очищен системой при нехватке места в памяти.
— databases — базы данных (sqlite), основное хранилище данных.
• создаётся dalvik-кеш исполняемого файла (проще говоря, распаковывается dex-файл для более быстрого обращения)
• если в приложении присутствуют бинарные библиотеки, они распаковываются в папку /lib для более быстрого обращения

so-файлы написаны на С/С++, обладают максимальной производительностью и потому очень популярны в играх. К тому же, часто разработчики при портировании игр оставляют всю логику в библиотках, а на Java пишут лишь оболочку. В результате часто эти файлы обладают особо большим размером.

Из-за нехватки основной памяти для хранения большого количества приложений в системе сначала сторонние разработчики придумали модуль A2SD, который автоматически переносит все пользовательские программы (/data/app/*.apk) и весь dalvik-cache на флешку, в предварительно созданный дополнительный раздел формата ext2/3/4. В системе, начиная с версии 2.2, появился встроенный механизм переноса приложений на флешку, называемый app2sd, в этом случае на флешке создаётся зашифрованный контейнер (файл), в который помещается apk-файл. Из вышенаписанного, думаю, понятно, что это освобождает далеко не весь объём, занимаемый приложением, а иногда даже менее 30% от него.

Наконец, в системе 2.3 значительно улучшили app2sd, добавив лишь такую незначительную деталь, как перенос и папки /lib, таким образом доведя процент экономии места в памяти почти до 100%! Я решил посчитать выгоду от использования обоих методов, основываясь на самых больших установленных программах и играх. Для начала сравним используемые объёмы в разных сочетаниях, итого 4 варианта, на примере достаточно большой игры, Gangstar:

Видно, что наиболее экономным является сочетание методов, но у каждого метода есть свои минусы:
• оба метода не будут работать при извлечённой флешке, при этом физическое извлечение недопустимо для A2SD
• app2sd создаёт зашифрованные контейнеры, поэтому приложения не будут работать с этой флешки на другом аппарате, следует быть осторожным при обновлении телефона. К тому же, шифрование даётся тоже не бесплатно, немного нагружая ЦП при обращениях, а контейнеры поддерживаются процессами, запускающимися для каждого такого контейнера, расходуя оперативную память.
• с другой стороны, A2SD тоже ограничен скоростью чтения/записи флешки, и например, на флешки четвёртого класса могут уже заметно ограничивать скорость загрузки приложений.

Итак, итоговая таблица, в которой для примера я проверил эффективность переноса 11 приложений:

В итоге, мы разобрались с методами переноса приложений на внешнюю память, увидели разницу между ними. Лично мне на моём HTC Desire категорически не хватает места, и я не знаю, что бы я делал без A2SD, т.к. сейчас используется 527МБ пямяти (при объёме раздела в 147МБ, курам на смех!), это 221МБ – приложения(110шт), 226МБ – данные и 80МБ – далвик-кэш. При этом особо большие приложения (с десяток игрушек сверху списка в управлении приложениями при сортировке по размеру) приходится «повторно» переносить на флеешку, чтобы сэкономить ещё несколько драгоценных мегабайт (иногда и более десятка с игрушки!).

Показать pdf-файл

Итак, в дополнение, для полной ясности, давайте посмотрим, сколько же реально места занимают папки с библиотеками в разных приложениях. Простой командой du -L -d 2 /data/data/ мы получим список папок с указанием размера, а отфильтровав и отсортировав получим следующее.
Итак, кто же занимает больше всего места своими библиотеками, не поддающимися переносу на 2.1 и 2.2?
Покажу свой список приложений с либами больше двух мегабайт:

com.opera.browser — 13,7
com.gameloft.android.TBFV.GloftGMHP.ML — 9,5
com.glu.android.toyshop_paid — 8,5
com.adobe.flashplayer — 7,9
com.redirectin.rockplayer.android.unified — 3,8
com.adobe.reader — 3,6
com.glu.android.gunbros_free — 2,5
com.rainman.cuttheropelite — 2,0

Андроид , ,

23 comments


  1. Foxter

    Доброго дня!
    Я так понял, что принцип работы app2sd заключается лишь в том, что механизм переноса приложения на карту памяти автоматизирован и срабатывает при установке приложения, если оное поддерживает этот перенос. Я прав?

    • ArtRoman

      Нет, для этого есть программы в Маркете, в том числе бесплатные. А дополнительная функция в прошивке (точнее, её поддержка) заключается в наборе скриптов для автоматической привязки (линковка или монтирование) папок данных в заранее созданный специальный раздел на флешке (с файловой системой ext2/ext3/ext4). При этом система работает с данными как обычно, даже не подозревая, что физически они все находятся на внешней памяти.
      Это можно сделать хоть вручную. Например, для Hero я делал свою модификацию dalvik2cache, при которой dalvik-кэш приложений переносится в раздел /cache, который там был неожиданно большого размера, почти совпадающий с разделом системы и данных.

      • Foxter

        Ладно, а как проверить работает ли app2sd на прошивке? Раздел ext3 создан, но памяти в телефоне как было мало, так и осталось.
        На всякий случай: тело Desire, прошивка MIUI.
        Пробовал через терминал подключать раздел командой a2sd cachesd. Изменений также не заметил…

        • ArtRoman

          Раздел создан из рекавери? Если на компе, «вручную» делать, не всегда корректно подцепляется. Чаще всего мелкие проблемы с разделом не дают использовать это. А проверить можно в терминале (с рутом) командой «ls -l /data» для случая линкования (тогда будет видно, что data, dalvik-cache и app-private ссылаются на соответствующие папки в /sd-ext/*) или «df» (или «mount») для случая монтирования, но это сейчас редко используется.

          • Foxter

            Создан из под linux. Сначала fat32, затем ext3
            В терминале выдает следующее. Я так понимаю, что a2sd не работает?

            • ArtRoman

              Да, не работает. Но командой df стоит посмотреть, подключен ли sd-ext раздел — я на чистом Cyanogen заметил, что раздел подключается, но симлинки не прописываются, т.е. раздел не используется. Это легко исправить.
              Отвечайте в новую ветку )

  2. Foxter

    Тут параллельно советуют A2SDGUI. Я уже даже не знаю… Возможно ли из терминала запустить этот пресловутый app2sd или все же лучше будет воспользоваться сторонним софтом?

    • ArtRoman

      Это гуй для Darktremor’овских скриптов, они должны быть установлены. В интернетах пишут, что MIUI использует как раз это, так что стоит попробовать эту программу, только предварительно не забудьте сделать бекап системы и данных.

  3. Foxter

    Итак, поставил это приложение. Пока ничего не применял. Только считал настройки. На текущий момент такая картина:
    1 2 3
    Судя по всему на втором скрине нужно переместить кэш? Но если мы с Вами выяснили что сейчас a2sd не работает, то почему на первом скрине есть отметка о «включенности» этой опции? Или речь идет о том что это возможно при данной прошивке?

    • ArtRoman

      Возможно, это просто галочка активирована, а настоящий перенос не был произведён. Хотя Darktremor должен работать нормально, я сам его использовал. Стоит попробовать отключить, затем снова включить опцию (после перезагрузки). Позже и кэш перенести, место экономит очень сильно.

      • Foxter

        Попробовал. Правда перед этим перенес кэш на SD-EXT.
        Из первого скрина опция не изменяется. Видимо потому что кэш уже на карте и переносить его некуда в память.
        Применил команду «ls -l /data» на выходе такая картина. Видимо сам кэш уже на карте памяти?

        • ArtRoman

          Да. Исключительно кэш. Однако, уже это должно освободить 20-50мб памяти.
          Кстати

          Пробовал через терминал подключать раздел командой a2sd cachesd. Изменений также не заметил…

          этим вы пытались перенести лишь кэш, и странно, что он не перенёсся.
          Покажите вывод команды «du /sd-ext», решим как поступить дальше.

          • Foxter

            Вот вывод указанной Вами команды.
            И еще момент: где-нибудь отражается то что работает a2sd? Или система так и будет показывать общую (стоковую) память, а на деле — использовать помимо нее a2sd

            • ArtRoman

              Извиняюсь за задержку. Да, по выводу перенесён только кэш, даже папка для данных не создана. Честно — странно, аппы должны переноситься чуть ли не сами. Можно перенести и вручную, в три шага: создаём папку /sd-ext/app, переносим туда приложения из /data/app, линкуем папку /data/app на /sd-ext/app.
              За подробностями можете обратиться в im.

            • Superb intromafion here, ol’e chap; keep burning the midnight oil.

  4. alex100

    у меня то же. на команду отвечает:
    /sd-ext/lost+found
    /sd-ext/
    ничего не понимаю… раздел создавал разными способами, через рекавери и MiniTool Partition Wizard Home Edition..

  5. Dim

    Подскажите — поставил станд прошивку 2.3 с a2sd — титаниум показывает из 719Мб раздела ext3 свободно 642.
    Это нормально? при том что внутренняя память — 154 и свободно 65 мб?
    установлено немного программ/игр .
    Работает ли a2sd?
    Я думал a2sd все данные программ и сами программы записывает в ext3 раздел.
    выходит нет
    и еще вопрос — при перемещении во встроенную память с помощю ТБ — это в ext3 раздел переносятся проги? у меня ТБ пишет: «Не найден каталог data2sd» и никуда ничего не перемещает — помогите

    • ArtRoman

      По-моему, это вполне нормально, так как обычно переносятся не все данные, а лишь само приложение (apk-файл) и его кэш (соответствующий dex-файл в папке dalvik-cache). Переносить сами данные приложения не стоит, так как обычно их объём минимален, а встроенная память зачастую быстрее внешней. Кстати, отмена переноса кэша при наличии свободного пространства может достаточно заметно увеличивать производительность аппарата, особенно при частых запусках программ и переключениях между ними, опять-же, из-за разницы скоростей работы внутренней и внешней памяти (точнее, даже из-за не реальной скорости работы, а того, как с ней работает контроллер).

      • Андрей

        Помогите разобраться.
        Успешно установил CyanogenMod 7 на HTC Desire.
        В официальной инструкции к прошивке не упоминается о создании ext-раздела на карте памяти. Интересно почему?
        Зная, что самый эффективный способ переноса приложений на карту памяти — это с помощью ext-раздела, я решил его создать из-под recovery до перепрошивки.
        Сейчас после установки нескольких приложений от google на телефоне уже недостаточно памяти. Я думал, что ext-раздел не используется, но проверка показала, что на нем есть 65Мб данных (против 272Мб в памяти телефона). Подскажите, почему так мало данных переносится на ext-раздел?

        • Ice

          just got a droid x2 a week ago. stumbling through it all. Thx for the tips! still han&9e#3v;t figured out camera because when we take photo's they look like shit!!!

  6. Очень полезная статья, спасибо)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *