22 октября 2017

Почему приложения такие большие

Идея материалов этого цикла появилась после того, как меня попросили проанализировать приложение «Мой МТС». Приложение вроде бы не очень сложное, а объем вызывал искреннее недоумение. Основным потребителем места тогда оказалась банальная реклама – в виде изображений и видео. Но случаи, как известно, бывают разные. Поэтому посмотрим, что еще может занимать драгоценные мегабайты внутри apk-файлов.

Как получить APK

Как ни банально звучит, но для этого его необходимо скачать. Например, установить приложение из Google Play. Но после этого потребуется получить установленный APK. Самый простой способ для этого – файловый менеджер (например, ES Проводник) или другая утилита, умеющая передавать установленные приложения (например, ShareIT).

 

Но если хочется странного, то можно скопировать APK через TWRP или даже попробовать скачать APK через плагин к браузеру. При этом важно удостовериться, что архитектура пакета будет ARM, а не x86 (хотя, если интересен анализ пакета для x86, то наоборот – эта архитектура и нужна).

Как смотреть

APK представляет собой zip-файл, его можно просто переименовать и распаковать. Или воспользоваться инструментом «Analyze APK» из Android Studio. В этом случае сразу будет виден размер папок, и можно будет понять, что стоит детально проанализировать, а на что можно не обращать внимания.

Что значат папки

  • assets и res/raw – бинарные ресурсы (там может быть что угодно, что для приложения выглядит просто как некий произвольный «файл»).
  • lib – нативные библиотеки (на С++), скомпилированные для определенной архитектуры (ARM, x86).
  • res/drawable* и res/mipmap* – изображения. Если в имени папки присутствует *dpi, то это изображения для указанного dpi (подробнее о dpi см. в статье «Почему большие устройства на самом деле маленькие»).
  • res/layout – схемы экранов.
  • classes.dex – скомпилированное приложение вместе с библиотеками на Java.

Конечно, в APK можно найти еще много разных файлов (а в папке res – много разных типов ресурсов), но основные здесь перечислены.

«Пожиратели» мегабайт

В случае с приложением «Мой МТС» все оказалось просто: больше всего объема уходит на банальную рекламу в виде картинок и видео.

Но бывают и другие «пожиратели» мегабайт:

  • Внутренние справочники тех или иных данных. В том же приложении «Мой МТС» справочник тарифов занимает 4,6 Мб.
  • Библиотеки. Например, разработчик приложения решил подключить для чатов библиотеку Hyphenate. И не посмотрел, что по умолчанию предлагается вариант с кодеками для голосовых звонков и видеовызовов. В итоге приложение получает в нагрузку несколько десятков мегабайт.
  • Графика. Однажды я помогал дизайнеру участвовать в конкурсе компании Samsung. Разрабатываемое приложение представляло собой офлайн-справочник, довольно простой с точки зрения разработки (немного анимаций да простое перелистывание страниц), но очень насыщенный графикой. Было нарисовано больше сотни изображений в разрешении QHD. После одной из промежуточных версий (включавшей в себя далеко не все изображения) стало понятно, что приложение получается слишком большим. И было принято решение ограничить графику разрешением HD. Оценка результата на целевом планшете (Galaxy Tab S) дизайнера устроила, а объем при этом был уменьшен почти в 4 раза.

Что дальше?

Я планирую сделать несколько выпусков в этой рубрике. И в каждом выпуске рассматривать несколько приложений (либо от одного производителя, либо одной тематики) и рассказывать, чем в каждом конкретном случае обусловлен большой объем приложений.

Читайте также

  • Alexandr.Noskov

    Очень интересно, наконец-то понятно, откуда из APK можно дергать красивые картинки для статьи или коллажа. Значит Analyze APK+WinRAR 🙂

  • Emiliy Narimanov

    Самым большим пожирателем на андроид является What’sUp. Я когда увидел чуть не упал. Если даже без рутов зайдете в папку, где вотсапп хранит ваши медиа файлы, то там, помимо тех, что вы получили и хранятся у вас в галерее ( и вы можете их удалить) будут храниться копии всех ваших отправленных фото/видео/голосов сообщений, которые в галерее не видны. Так как папка находится во внутренней памяти, то у меня быстро пропали мои 16 Гб на Самсунг А7. 6 Гб из этого были отправленные видео и фото в вотсапп.

  • Андрей

    WhatsApp. Скорее всего зависит от того каким мессенжером вы больше пользуетесь. Там и идёт активная переписка, приём/отправление фото и видео. У меня он занимает 127 Мб.
    А рекорд как всегда у Сервисов Гугл Плей — 485 Мб.

  • Der Rote Baron

    TotalCommander
    Он и извлекать apk из системы без рута умеет, и распаковывать

  • Der Rote Baron

    По тому же, почему веб такой тяжелый и тормозной
    Ценится не качество приложений, а функции(но не качество их работы) и скорость разработки. Ну и дезигн иногда
    И плевать, если для простого приложения, которое выгружает одну фотку на сервер и с него забирает другую тянется Xamarin с собственной средой исполнения всего лишь потому, что было лень писать по разу для iOS и Android

  • Serge Kar

    Классная статья и полезная! Тоже не мог понять после твита Сергей Потресова, почему у МТС такое большое приложение

  • LMCo

    Меня очень удивил объем офисных приложений от Microsoft, который, ко всему прочему, увеличивается еще на 100 мегабайт после первого запуска. При том, что функционал уступает таковому, скажем, у офиса 97, который летал на Windows 98 на компе с 500-мегабайтным винтом и 64 метрами оперативы.

  • dkvlnk

    Предлагаю освежевать Фейсбук, потому что он непонятно почему много весит, так еще и каждую неделю новая версия.

  • федор емельяненко

    офис 97?) он летал на моем 486 с 8 МБ памяти и весил ~15мб. Причем по возможностям он вполне пойдет и для современных задач тех же студентов или рядовых офисных работников

  • Метелёв Михаил

    Функциональность

  • Djem46

    Поддерживаю.
    Почти полгигабайта…

  • Владимир Цветков

    Прошло два года как я оставил отзыв на плеймаркете и мтс обещали уменьшить приложение. С тех пор оно стало только больше.
    Ау, мтс, если у вас приложение занимает больше 2 мб то вы делаете что то не так..

  • С мессенджерами еще бывает беда, что они хранят то, что фактически является кэшем, не как кэш, а просто выкидывая файлы наружу. Тогда эти данные в статистике не учитываются, но место отжирают. Я рассматривал это на примере Telegram в http://android.mobile-review.com/articles/51647/

  • Sunrise

    очистите кэш

  • Ty3ik

    +1 За тотал коммандер!
    А вот запаковывать (если, допустим, графику в приложении хочется поменять) надо WinRAR-ом. И потом ZipSigner-ом подписать в зверьке. А иначе на зверька приложение не встанет.

  • Андрей

    Понял. Но пока у меня такого не было. Возможно из-за того, что каждые три месяца делал полный сброс для профилактики стабильной работы.

  • Der Rote Baron

    Если подправить пару изображений, то можно и тоталом, если сжатие 0 поставить, а для остального есть apktool, а на крайний — jadx и студия

  • Dm Abrosimov

    Аналогично, блин. Только мне в комментарии к отзыву, что я оставлял где-то с пол года назад, ТП МТС ответила, мол перешлите ваш вопрос нам на почту, мы будем разбираться. Зачем писать на почту, когда это отзыв на приложение в магазине приложений?.. Смысл запрягать эту телегу? Тупка какая-то.

  • Дмитрий

    А есть ли какой-нибудь клиент к гугл-плею, чтобы можно было сортировать приложения по размеру? Ну или само официальное приложение как-то умеет, а я не знаю.
    А то нужен какой-нибудь ежедневник, без всяких там прикреплений фоток и т.д., самый простой, пусть его и скачало всего 1000 человек, а не 10 млн. Так — фиг найдешь, а вот если бы по размеру отсортировать… Сразу понятно было бы — вот эти маленькие, значит без всяких ненужных свистоперделок, можно брать и пробовать.

  • oreon

    А еще мтс приложение требует кучу ненужных разрешений (звонки, смс итд). И без них не запускается.

  • ikki906

    Оказалось куча народа до сих пор сидит на WinRAR (видимо пиратском). Вот она сила бренда.

  • Валера K

    ну… есть же кнопка «позвонить в службу поддержки», вот и разрешение просит 🙂

  • Валера K

    теперь стало понятно, МТС позабоились чтоб сэкономить трафик и закачали рекламу сразу… хотя и пишут «внутри этого приложения трафик не тарифицируется». Наверное это чтоб просмотр рекламы никогда не тормозил 🙂

  • Юрий Банаков

    Тут есть два момента, конфликтующих с утверждением МТС.
    1. Реклама онлайн в приложении загружается и в очень приличном объёме. Так как при подключении через EDGE/GPRS, приложение просто виснет. Тот объём информации, что отражает данные по тарифу, весит мизер. Приложение от мегафона в таком режиме прекрасно работает.
    2. Изначально сложилось так, что на мегафоне у меня интернет, а на мтс голосовая связь. Таким образом, просмотр рекламы в приложении я оплачивают за свой счет.

  • есть 4pda там делают моды APK и все лишнее вырезают

  • менее 15 мб стала занимать прога Мой МТС после редактирования разработчиком — https://4pda.ru/forum/index.php?showtopic=722747&st=60#entry49241307

  • на 4pda есть урезанная версия на 14 мб, кто мешает скачать и пользоваться? всегда качаю оттуда репаки всего софта, даже Сбербанк усмирили, вырезали его проверялки на вирусы и рут

  • off_fy

    А какая практическая польза в ковырянии? Ну, узнал я почему и что с этим знанием делать? Вот, если бы дали совет как это «ненужное» безболезненно удалить, другое дело!

  • Evgeny K

    Настройки, память ( или хранилище) называется по разному. Дальше приложения. Вверху выбираете сортировать по размеру. По умолчанию они по имени. Вот

  • на 4pda уже все за вас удалено, там есть Light моды для многого софта популярного

  • Дмитрий

    Не, вы не поняли. Мне не в телефоне смотреть, сколько занимают, а в магазине гугла. По умолчанию он при поиске сортирует приложения в зависимости от соотношения оценки к количеству скачиваний. Мне же надо отсортировать по размеру.
    Например, я некоторое время пользовался форком Гугл Плея, таким черным вариантом — но там тоже нельзя сортировать.
    Да, конечно, можно заходить в описания программы и смотреть там, но это неудобно — держать в голове, переходя от одного приложения к другому.

  • ACP

    Статья, безусловно, интересная, но она всё же не отвечает на основной вопрос- почему приложения стали так сильно раздуваться?
    Понятное дело что могут включать много графики и рекламы, но ведь если для того же дроида 2.3 было типичным размер приложения 1-5мб, то сейчас это уже и 200-300 мб не предел.
    Зачем столько библиотек включают в состав приложения?
    Больше всего меня изумляют приложения от Facebook’а , в них, такое ощущение, что ещё и собственная операционная система включена.

  • ACP

    у этого приложения функционала и на 1 мб не наберётся )

    а так сам пользуюсь этими лайт-модами.

  • Alexandr.Noskov

    Андрей, а вот допустим если некий исследователь вытащит видеорекламу из приложения, обрежет все ролики до 1 секунды и засунет обратно, а потом отключит приложение от интернета, оно будет работать? Есть ли стандартный внутренний инструмент, который проверяет размер этих роликов?

  • Это зависит от приложения. Судя по тому, как «чистят» на 4пда, никаких особых проверок нет.

  • >> она всё же не отвечает на основной вопрос- почему приложения стали так сильно раздуваться?

    Так ведь есть же раздел «Пожиратели мегабайт» 🙂
    Больше примеров будет в следующих статьях цикла.

    >> Зачем столько библиотек включают в состав приложения?

    Зачем — это уже отдельная тема. Обычно с библиотеками проще и быстрее выпустить приложение.

  • >> А какая практическая польза в ковырянии?

    Это информация для тех, кому интересно, как и что устроено. Если вам не интересно — просто проходите мимо этих статей.

  • ACP

    Некоторые создатели приложений подходят к решению проблемы с чужеродным внедрением/изменением несколько иначе — они подписывают приложения и сверяют хэши. Соответственно, если эти условия не выполняются, то приложение просто отказывается работать.
    Преуспели в этом вопросе разработчики приложения для Яндекс такси. Но оно и понятно, т.к. уже был печальный опыт в перехвате/воровстве клиентов такси.

  • Илья

    Молодец!
    Разберите, пожалуйста, приложение Яндекс.Такси и их неуёмную процессорную активность, судя по wakelock.

  • Evgeny K

    Я бы сделал так : замерил с компа папки в телефоне, их размеры и тд потом посмотрел что на сколько изменилось. Если можно конечно скачать его не устанавливая.) (

  • ACP

    Приложение MyAndroidTools вам в помощь. В нём можно не только полностью разобрать по деталям (активностям) любое приложение, но ещё и перенастроить его (если имеются рут права)

  • ACP

    оно и без кэша монструозное. Так что полностью поддерживаю идею препарации пациента ФБ )

  • Alexandr.Noskov

    Андрей))) Я не помню точно, но вроде бы, можно как-то так обрезать любой медийный ролик, чтобы он сам закрывался. Какой-то «баг» был законный (еще во времена SE K750i попадалась инфа). Не помнишь случайно? Ну т.е. ролик запускается, а потом «э, не могу», закрывался, но ошибки при этом не возникало?

  • Саша, давай еще раз: по умолчанию, если ты (как разработчик приложения) включаешь ролик, он просто играется. Без проверок. Будет 1 секунда — ОК, значит, так и надо. Но если хочешь — можешь навставлять любые проверки, которые тебе нравятся.

  • Alexandr.Noskov

    Я не об этом. Вот например у Ubisoft после просмотра роликов надо нажимать на (х), сами они не закрываются. А вот если повредить видеофайл определенным образом, то он сам бы закрывался, сразу после попытки воспроизведения. В этом и вопрос, как именно можно повредить видеофайл, чтобы он сам закрывался, но ошибки при этом не возникало? :-))))

  • Программный признак закрытия находится не внутри ролика. Максимум — там будет картинка итоговая (сам крестик). Поэтому если проверки целостности роликов нет, то вырезай на здоровье все, что хочешь. Но если в последнем кадре нарисован крестик, не удаляй этот кадр.

  • Alexandr.Noskov

    Спасибо за инфу, я таким не занимаюсь, просто интересно)

  • Иван Благовещенский

    Не спец, но на вскидку- на Андроид 2.3 нужна была совместимость с 1.6-2.3, т.е. 5 АПИ, а сейчас большинство приложений делают минимум с 4.4 (а то и с 4.0) до 8.0 и это 6 АПИ, с учётом большего количества датчиков и возможностей интерфейса это делает количество библиотек больше. Я думаю, как-то так)

  • Макс Любин

    Кошмар!))) Андрей, прям из под носа тему статьи увёл))) как раз планировал об этом написать)))))

  • David

    спасибо большое, буду ждать следующие статьи цикла

  • Alexandr.Noskov

    А я тебя давно просил, напиши пожалуйста развернутую статью, как отличить отремонтированный телефон от нового. Ты же их все изнутри видел) И знаешь где снаружи могут быть микроцарапинки и капельки клея)

  • Ну, я с Евгением предварительно тему согласовывал заранее, если что 🙂

  • Sevilho

    но приложения испоьзуют вызовы библиотек API, а не сами libs. Неужели вызовы столько места занимают?

  • >> Неужели вызовы столько места занимают?

    Пустое приложение без поддержки совместимости с Android 4 и более ранними версиями — 150 kb
    Пустое приложение с поддержкой совместимости — 1,5 Mb

    Но на самом деле сторонние библиотеки, обычно больше добавляют, конечно.

  • ACP

    Дмитрий, по-моему такого ещё не изобрели. Самого интересует подобный момент.

    Если вы ищите простейшее и лёгкое приложение для записей, посмотрите ColorNote (с жёлтым листом на иконке) — весит 562 килобайта. Даже виджет есть )

  • rrrrex

    Зачастую разработчики не заморачиваются над написанием кода, используют фреймворки, подключают готовые библиотеки. Функций из дополнительных библиотек им требуется не много, но сами библиотеки могут весить очень даже не мало, порой и десятки мегабайт.

  • Phoenixavi

    Глобально пофиг. 3года назад стандарт был 32 гига. Теперь меньше 64 покупать смысла нет. Ещё через 3года. Будет 128. Памяти хватает в целом.

  • GrishaTav

    Пока у программистов не начнут вычитать из зарплаты за каждый лишний мегабайт — приложения будут раздуваться, просто потому, что так проще и быстрее программировать.

  • Слава Айтишников

    Банеры в png это диагноз… Ну и «справочник тарифов занимает 4.6 Мб», чудесно, к слову «Большая Советская Энциклопедия в 30 томах» занимает ~70 Мб (тексты).

  • Дмитрий

    Спасибо, попробую.
    Вообще, конечно, интересно с этим магазином гугл плей. Они пользуются своим де-факто монопольным положением на рынке.
    Вот в обычном интернет-магазине — как хочешь, так и сортируй товар: хочешь — по цене, хочешь — по оценкам, хочешь — по рекомендациям, хочешь — по производителю. Плюс еще и фильтров дофига — жирность у молока, производитель у материнских плат, и т.д.
    Да что там — почти у любого каталога программ под винды практически тоже самое.
    Здесь же — ешьте, как дают.

  • Yellow

    Можно его просто удалить нафиг, оно еще и батарейку жрет.

  • Google Keep для iOS весит около 100 Мб.
    Как может приложение, создающее заметки в облаке, столько есть, для меня осталось загадкой.

  • Евгений Жо

    Интересно, какие бы файлы можно было спокойно удалить без вреда программе, просто зайдя в телефон с компьютера?

  • Файлы, которые находятся внутри пакета APK нельзя удалить «просто зайдя в телефон с компьютера».

  • К сожалению, я пока не настолько продвинут в iOS, чтобы заняться анализом там.

  • Вы не учитываете накладные расходы на json. Это существенно увеличивает объем данных относительно планарного текста.

  • Cayene

    Тоже очень интересно было бы почитать!👍

  • Макс Любин

    Просил. Помню)
    26-ого октября будет статья!))

  • Макс Любин

    Послезавтра будет)

  • Макс Любин

    Я без претензий)) Просто забавно, как мысли совпадают)

  • Kirill Volodin-Panchenko

    И Вы считаете все гонятся за «стандартами»?

  • gelioson

    Там примерно то же самое. Файл приложения .ipa — тот же зип, можно переименовать и распаковать. Сами ипашки раньше можно было выдрать из айтьюнса после синхронизации с ним. Как сейчас — хз, в новом айтьюнсе приложения убрали.
    А суть та же — больше всего жрут растровые картинки под разные DPI да видео

  • Sergey Filatov

    Тут смысл вот в чём: при разработке приложения для Android есть понятия Target SDK и Minimum SDK. Собственно, target SDK — это тот SDK, на который ты ориентируешься, чтобы получить те или иные API. Minimum SDK — это минимально поддерживаемый SDK.
    Проблема в том, что в старых версиях Android нет тех API, которые разработчик использует при написании приложения (самый очевидный пример — вы можете увидеть приложения в Material Design аж на Android 2.3, но в Android 2.3 нет поддержки таких элементов интерфейса). Поэтому при сборке APK в него автоматически включается недостающие в Minimum SDK, но необходимые для приложения стандартные библиотеки.

    Конечно, это не сотни мегабайт, но мы все видим, как простые приложения, написанные для 6.0, но с минимальным SDK для Android 4.1 занимают 15-20 мб.