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 раза.
Что дальше?
Я планирую сделать несколько выпусков в этой рубрике. И в каждом выпуске рассматривать несколько приложений (либо от одного производителя, либо одной тематики) и рассказывать, чем в каждом конкретном случае обусловлен большой объем приложений.
Очень интересно, наконец-то понятно, откуда из APK можно дергать красивые картинки для статьи или коллажа. Значит Analyze APK+WinRAR 🙂
TotalCommander
Он и извлекать apk из системы без рута умеет, и распаковывать
+1 За тотал коммандер!
А вот запаковывать (если, допустим, графику в приложении хочется поменять) надо WinRAR-ом. И потом ZipSigner-ом подписать в зверьке. А иначе на зверька приложение не встанет.
Если подправить пару изображений, то можно и тоталом, если сжатие 0 поставить, а для остального есть apktool, а на крайний — jadx и студия
Оказалось куча народа до сих пор сидит на WinRAR (видимо пиратском). Вот она сила бренда.
Самым большим пожирателем на андроид является What’sUp. Я когда увидел чуть не упал. Если даже без рутов зайдете в папку, где вотсапп хранит ваши медиа файлы, то там, помимо тех, что вы получили и хранятся у вас в галерее ( и вы можете их удалить) будут храниться копии всех ваших отправленных фото/видео/голосов сообщений, которые в галерее не видны. Так как папка находится во внутренней памяти, то у меня быстро пропали мои 16 Гб на Самсунг А7. 6 Гб из этого были отправленные видео и фото в вотсапп.
WhatsApp. Скорее всего зависит от того каким мессенжером вы больше пользуетесь. Там и идёт активная переписка, приём/отправление фото и видео. У меня он занимает 127 Мб.
А рекорд как всегда у Сервисов Гугл Плей — 485 Мб.
С мессенджерами еще бывает беда, что они хранят то, что фактически является кэшем, не как кэш, а просто выкидывая файлы наружу. Тогда эти данные в статистике не учитываются, но место отжирают. Я рассматривал это на примере Telegram в https://android.mobile-review.com/articles/51647/
Понял. Но пока у меня такого не было. Возможно из-за того, что каждые три месяца делал полный сброс для профилактики стабильной работы.
По тому же, почему веб такой тяжелый и тормозной
Ценится не качество приложений, а функции(но не качество их работы) и скорость разработки. Ну и дезигн иногда
И плевать, если для простого приложения, которое выгружает одну фотку на сервер и с него забирает другую тянется Xamarin с собственной средой исполнения всего лишь потому, что было лень писать по разу для iOS и Android
Классная статья и полезная! Тоже не мог понять после твита Сергей Потресова, почему у МТС такое большое приложение
теперь стало понятно, МТС позабоились чтоб сэкономить трафик и закачали рекламу сразу… хотя и пишут «внутри этого приложения трафик не тарифицируется». Наверное это чтоб просмотр рекламы никогда не тормозил 🙂
Тут есть два момента, конфликтующих с утверждением МТС.
1. Реклама онлайн в приложении загружается и в очень приличном объёме. Так как при подключении через EDGE/GPRS, приложение просто виснет. Тот объём информации, что отражает данные по тарифу, весит мизер. Приложение от мегафона в таком режиме прекрасно работает.
2. Изначально сложилось так, что на мегафоне у меня интернет, а на мтс голосовая связь. Таким образом, просмотр рекламы в приложении я оплачивают за свой счет.
Меня очень удивил объем офисных приложений от Microsoft, который, ко всему прочему, увеличивается еще на 100 мегабайт после первого запуска. При том, что функционал уступает таковому, скажем, у офиса 97, который летал на Windows 98 на компе с 500-мегабайтным винтом и 64 метрами оперативы.
офис 97?) он летал на моем 486 с 8 МБ памяти и весил ~15мб. Причем по возможностям он вполне пойдет и для современных задач тех же студентов или рядовых офисных работников
Функциональность
Предлагаю освежевать Фейсбук, потому что он непонятно почему много весит, так еще и каждую неделю новая версия.
Поддерживаю.
Почти полгигабайта…
очистите кэш
оно и без кэша монструозное. Так что полностью поддерживаю идею препарации пациента ФБ )
Можно его просто удалить нафиг, оно еще и батарейку жрет.
Прошло два года как я оставил отзыв на плеймаркете и мтс обещали уменьшить приложение. С тех пор оно стало только больше.
Ау, мтс, если у вас приложение занимает больше 2 мб то вы делаете что то не так..
Аналогично, блин. Только мне в комментарии к отзыву, что я оставлял где-то с пол года назад, ТП МТС ответила, мол перешлите ваш вопрос нам на почту, мы будем разбираться. Зачем писать на почту, когда это отзыв на приложение в магазине приложений?.. Смысл запрягать эту телегу? Тупка какая-то.
на 4pda есть урезанная версия на 14 мб, кто мешает скачать и пользоваться? всегда качаю оттуда репаки всего софта, даже Сбербанк усмирили, вырезали его проверялки на вирусы и рут
А есть ли какой-нибудь клиент к гугл-плею, чтобы можно было сортировать приложения по размеру? Ну или само официальное приложение как-то умеет, а я не знаю.
А то нужен какой-нибудь ежедневник, без всяких там прикреплений фоток и т.д., самый простой, пусть его и скачало всего 1000 человек, а не 10 млн. Так — фиг найдешь, а вот если бы по размеру отсортировать… Сразу понятно было бы — вот эти маленькие, значит без всяких ненужных свистоперделок, можно брать и пробовать.
Настройки, память ( или хранилище) называется по разному. Дальше приложения. Вверху выбираете сортировать по размеру. По умолчанию они по имени. Вот
Не, вы не поняли. Мне не в телефоне смотреть, сколько занимают, а в магазине гугла. По умолчанию он при поиске сортирует приложения в зависимости от соотношения оценки к количеству скачиваний. Мне же надо отсортировать по размеру.
Например, я некоторое время пользовался форком Гугл Плея, таким черным вариантом — но там тоже нельзя сортировать.
Да, конечно, можно заходить в описания программы и смотреть там, но это неудобно — держать в голове, переходя от одного приложения к другому.
Я бы сделал так : замерил с компа папки в телефоне, их размеры и тд потом посмотрел что на сколько изменилось. Если можно конечно скачать его не устанавливая.) (
Дмитрий, по-моему такого ещё не изобрели. Самого интересует подобный момент.
Если вы ищите простейшее и лёгкое приложение для записей, посмотрите ColorNote (с жёлтым листом на иконке) — весит 562 килобайта. Даже виджет есть )
Спасибо, попробую.
Вообще, конечно, интересно с этим магазином гугл плей. Они пользуются своим де-факто монопольным положением на рынке.
Вот в обычном интернет-магазине — как хочешь, так и сортируй товар: хочешь — по цене, хочешь — по оценкам, хочешь — по рекомендациям, хочешь — по производителю. Плюс еще и фильтров дофига — жирность у молока, производитель у материнских плат, и т.д.
Да что там — почти у любого каталога программ под винды практически тоже самое.
Здесь же — ешьте, как дают.
А еще мтс приложение требует кучу ненужных разрешений (звонки, смс итд). И без них не запускается.
ну… есть же кнопка «позвонить в службу поддержки», вот и разрешение просит 🙂
есть 4pda там делают моды APK и все лишнее вырезают
менее 15 мб стала занимать прога Мой МТС после редактирования разработчиком — https://4pda.ru/forum/index.php?showtopic=722747&st=60#entry49241307
у этого приложения функционала и на 1 мб не наберётся )
а так сам пользуюсь этими лайт-модами.
А какая практическая польза в ковырянии? Ну, узнал я почему и что с этим знанием делать? Вот, если бы дали совет как это «ненужное» безболезненно удалить, другое дело!
на 4pda уже все за вас удалено, там есть Light моды для многого софта популярного
>> А какая практическая польза в ковырянии?
Это информация для тех, кому интересно, как и что устроено. Если вам не интересно — просто проходите мимо этих статей.
Статья, безусловно, интересная, но она всё же не отвечает на основной вопрос- почему приложения стали так сильно раздуваться?
Понятное дело что могут включать много графики и рекламы, но ведь если для того же дроида 2.3 было типичным размер приложения 1-5мб, то сейчас это уже и 200-300 мб не предел.
Зачем столько библиотек включают в состав приложения?
Больше всего меня изумляют приложения от Facebook’а , в них, такое ощущение, что ещё и собственная операционная система включена.
>> она всё же не отвечает на основной вопрос- почему приложения стали так сильно раздуваться?
Так ведь есть же раздел «Пожиратели мегабайт» 🙂
Больше примеров будет в следующих статьях цикла.
>> Зачем столько библиотек включают в состав приложения?
Зачем — это уже отдельная тема. Обычно с библиотеками проще и быстрее выпустить приложение.
Не спец, но на вскидку- на Андроид 2.3 нужна была совместимость с 1.6-2.3, т.е. 5 АПИ, а сейчас большинство приложений делают минимум с 4.4 (а то и с 4.0) до 8.0 и это 6 АПИ, с учётом большего количества датчиков и возможностей интерфейса это делает количество библиотек больше. Я думаю, как-то так)
но приложения испоьзуют вызовы библиотек API, а не сами libs. Неужели вызовы столько места занимают?
>> Неужели вызовы столько места занимают?
Пустое приложение без поддержки совместимости с Android 4 и более ранними версиями — 150 kb
Пустое приложение с поддержкой совместимости — 1,5 Mb
Но на самом деле сторонние библиотеки, обычно больше добавляют, конечно.
Тут смысл вот в чём: при разработке приложения для 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 мб.
Андрей, а вот допустим если некий исследователь вытащит видеорекламу из приложения, обрежет все ролики до 1 секунды и засунет обратно, а потом отключит приложение от интернета, оно будет работать? Есть ли стандартный внутренний инструмент, который проверяет размер этих роликов?
Это зависит от приложения. Судя по тому, как «чистят» на 4пда, никаких особых проверок нет.
Андрей))) Я не помню точно, но вроде бы, можно как-то так обрезать любой медийный ролик, чтобы он сам закрывался. Какой-то «баг» был законный (еще во времена SE K750i попадалась инфа). Не помнишь случайно? Ну т.е. ролик запускается, а потом «э, не могу», закрывался, но ошибки при этом не возникало?
Саша, давай еще раз: по умолчанию, если ты (как разработчик приложения) включаешь ролик, он просто играется. Без проверок. Будет 1 секунда — ОК, значит, так и надо. Но если хочешь — можешь навставлять любые проверки, которые тебе нравятся.
Я не об этом. Вот например у Ubisoft после просмотра роликов надо нажимать на (х), сами они не закрываются. А вот если повредить видеофайл определенным образом, то он сам бы закрывался, сразу после попытки воспроизведения. В этом и вопрос, как именно можно повредить видеофайл, чтобы он сам закрывался, но ошибки при этом не возникало? :-))))
Программный признак закрытия находится не внутри ролика. Максимум — там будет картинка итоговая (сам крестик). Поэтому если проверки целостности роликов нет, то вырезай на здоровье все, что хочешь. Но если в последнем кадре нарисован крестик, не удаляй этот кадр.
Спасибо за инфу, я таким не занимаюсь, просто интересно)
Некоторые создатели приложений подходят к решению проблемы с чужеродным внедрением/изменением несколько иначе — они подписывают приложения и сверяют хэши. Соответственно, если эти условия не выполняются, то приложение просто отказывается работать.
Преуспели в этом вопросе разработчики приложения для Яндекс такси. Но оно и понятно, т.к. уже был печальный опыт в перехвате/воровстве клиентов такси.
Молодец!
Разберите, пожалуйста, приложение Яндекс.Такси и их неуёмную процессорную активность, судя по wakelock.
Приложение MyAndroidTools вам в помощь. В нём можно не только полностью разобрать по деталям (активностям) любое приложение, но ещё и перенастроить его (если имеются рут права)
Кошмар!))) Андрей, прям из под носа тему статьи увёл))) как раз планировал об этом написать)))))
А я тебя давно просил, напиши пожалуйста развернутую статью, как отличить отремонтированный телефон от нового. Ты же их все изнутри видел) И знаешь где снаружи могут быть микроцарапинки и капельки клея)
Тоже очень интересно было бы почитать!?
Послезавтра будет)
Просил. Помню)
26-ого октября будет статья!))
Ну, я с Евгением предварительно тему согласовывал заранее, если что 🙂
Я без претензий)) Просто забавно, как мысли совпадают)
спасибо большое, буду ждать следующие статьи цикла
Зачастую разработчики не заморачиваются над написанием кода, используют фреймворки, подключают готовые библиотеки. Функций из дополнительных библиотек им требуется не много, но сами библиотеки могут весить очень даже не мало, порой и десятки мегабайт.
Глобально пофиг. 3года назад стандарт был 32 гига. Теперь меньше 64 покупать смысла нет. Ещё через 3года. Будет 128. Памяти хватает в целом.
И Вы считаете все гонятся за «стандартами»?
Банеры в png это диагноз… Ну и «справочник тарифов занимает 4.6 Мб», чудесно, к слову «Большая Советская Энциклопедия в 30 томах» занимает ~70 Мб (тексты).
Вы не учитываете накладные расходы на json. Это существенно увеличивает объем данных относительно планарного текста.
Google Keep для iOS весит около 100 Мб.
Как может приложение, создающее заметки в облаке, столько есть, для меня осталось загадкой.
К сожалению, я пока не настолько продвинут в iOS, чтобы заняться анализом там.
Там примерно то же самое. Файл приложения .ipa — тот же зип, можно переименовать и распаковать. Сами ипашки раньше можно было выдрать из айтьюнса после синхронизации с ним. Как сейчас — хз, в новом айтьюнсе приложения убрали.
А суть та же — больше всего жрут растровые картинки под разные DPI да видео
Интересно, какие бы файлы можно было спокойно удалить без вреда программе, просто зайдя в телефон с компьютера?
Файлы, которые находятся внутри пакета APK нельзя удалить «просто зайдя в телефон с компьютера».