Совсем недавно в интернете появилось несколько интересных инфографик, о том, что популярные приложения для телефонов за пару лет выросли в размере в 12 раз. В этой заметке делается попытка разъяснить некоторые неочевидные причины роста размера мобильных приложений.


Инфографика 1
Инфографика 2


Авторы инфографик в оригинальных статьях выделяют две причины такого роста:


  • повышение максимального допустимого размера приложений AppStore
  • оснащение телефонов все большим объемом памяти

На мой взгляд, указанные тезисы являются только предпосылками и до конца не отвечают на вопрос "почему приложения становятся больше?".
Конечно, в первую очередь дело в добавлении новых функций. Развитие функциональности приложений требует большего размера.


Инфографика 3


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


Лишние копии ресурсов в приложении


Как ни банально звучит, но в приложениях часто сохраняются одни и те же внутренние ресурсы (картинки, библиотеки, и так далее) по нескольку копий. Это происходит из-за того, что крупные приложения разрабатываются несколькими командами разработчиками, отвечающими за свой конкретный функционал программы. Бывает так, что команда тащит для своего модуля те же ресурсы, что и другая, вызывая задвоение.


В одной из статей автор решил детально разобрать внутреннее строение приложения Facebook для iOS после того, как оно увеличилось за полгода с 165 до 253 мегабайт. Он обнаружил, что в приложении содержалось свыше 40 мегабайт избыточных дублирующих данных. В основном это были картинки, но также были и абсолютно идентичные внутренние программные файлы. Таким образом, просто удалив дубликаты, можно было бы уменьшить размер приложения на 15% процентов. Что, кстати, Facebook впоследствии и сделал.


А/Б тестирование и внедрение новых функций


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


Переход на более комфортные языки программирования


В случае с приложениями под iOS переход с Objective-C на Swift может дать увеличение размера скомпилированного кода приложения в 3-4 раза. Это происходит из-за того, что ради удобства и скорости разработки новые языки могут:


  • использовать большие типы данных по умолчанию, которые занимают больше места
  • вводить дополнительные тесты и проверки в код при компиляции
  • использовать большую стандартную библиотеку функций

Сюда же можно отнести переход приложений на новые фреймворки, которые тащат с собой много необходимых им файлов.


Включение в программы собственных функций, заменяющих стандартные операционной системы


Одним из трендов мобильной разработки под несколько платформ является стремление минимизировать зависимость от конкретной операционной системы. У этого подхода есть свои плюсы. Во-первых, это позволяет не переписывать много кода при изменении внешних системных библиотек. Во-вторых, это позволяет удержать пользователя в своем приложении и обеспечить более консистентный пользовательский опыт (хотя часто бывает так, что своя реализация визуально не отличима от стандартной).


Среди наиболее популярных "велосипедов", заменяющих стандартные средства ОС, можно выделить:


  • Браузеры
  • Работа с камерой
  • Ввод текста и обработка жестов
  • Проверка орфографии

Рост требований к приложениям


По мере развития телефонов владельцы экосистем (Apple, Google) начинают предъявлять к программам новые требования по поддержке системных появляющихся возможностей телефонов, которые требуют больше места:


  • После появления Retina разработчиков обязали добавлять картинки с большей детализацией и соответственно размеров.
  • Переход iOS с 32 на 64 бита впоследствии заставил всех разработчиков выпускать именно 64-битные приложения.

К слову в AppStore для борьбы с ростом размера приложений по таким требованиям потом была представлена технологий App thinning, по которой на конкретный телефон скачивается адаптированная версия приложения без избыточных ресурсов для других версий телефонов.

Поделиться с друзьями
-->

Комментарии (28)


  1. dmitry_dvm
    07.07.2017 11:54
    +3

    Пишем одно приложеньице под все платформы. Под айос оно весит 70Мб, а UWP — 3Мб. Мне кажется большая часть веса — это неоптимизированные пнг всевозможнных кнопок. В UWP такого нет потому что все иконки шрифтовые. По-моему вес любого айос приложения можно сократить в разы просто прогнав все картинки через какой-нибудь tinypng.


    1. kekekeks
      08.07.2017 10:22
      +1

      Под айос оно весит 70Мб, а UWP — 3Мб.

      Так вы поди на Xamarin его пишете. И в случае с iOS оно внутри себя содержит цельнотянутый Mono-рантайм.


      1. dmitry_dvm
        08.07.2017 17:59

        Никаких замаринов, нативненько пишем.


  1. SLASH_CyberPunk
    07.07.2017 11:56

    Все бы хорошо, но большинство приложений из списка выше строятся на веб-технологиях, которые тянутся при необходимости из интернета…
    Ожидал прочитать, как добавляют тонны различных метрик для сбора данных…


    1. bopoh13
      07.07.2017 12:18

      … у меня в теле почти все. Причем пользователь не нуждается в постоянном обновлении данных.
      Нужно будет удалить половину.


  1. alexeykuzmin0
    07.07.2017 11:57
    -1

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


    1. dmitrykazakov
      07.07.2017 18:18

      а ларчик просто открывался


  1. svistkovr
    07.07.2017 11:58

    Еще можно добавить средства кросс-платформенной разработки например: unity, xamarin, robovm и т.д.
    Каждый кросс-платформенный инструмент тянет в приложение кучу своих собственных либ и биндингов.


  1. dom1n1k
    07.07.2017 12:16
    +6

    Ладно еще сами приложения. Шестой Андроид отказывается скачивать и обновлять приложение весом 5 мб при свободном месте в телефоне >300 мб — потому что ему, видите ли, места нет для этой операции!


    1. den_golub
      07.07.2017 13:06

      Это нормальная практика, потому как возможно два варианта:

      1. Приложение при установке распаковывается из 5 Mb в больший объем и как следствие ограничение в 300 Mb, уж не знаю каким путем выяснили они эту цифру
      2. Многие приложения с таким весом, как правило помимо приведенного выше после установки скачивают доп. файлы весом от 20 Mb до 2Gb


      1. schetilin
        07.07.2017 13:34

        Нет. Именно до скачивания обновления говорит о нехватке места. Как я понимаю, Android резервирует какой то процент от памяти под свои нужды, но при этом показывает его как свободный.


      1. dom1n1k
        07.07.2017 14:25
        +1

        Опытным путем я выяснил, что лимит около 400 мб. С учетом того, что всего в телефоне 8 гб — возможно, они резервируют 5%.
        Но работает этот лимит очень тупо. Если места хоть насколько-то больше лимита — оно даст обновить и большое приложение (по личному опыту, порядка 50-70 мб). Но если места хоть чуть-чуть меньше лимита — оно не даст обновить даже самую крошечную апликуху.



    1. tmpuser
      07.07.2017 14:49

      Android считает что памяти мало если её остается меньше некоего процента от общего объема, вроде 5%.
      Поэтому если раздел /data, скажем, на 12 Гб (вполне реально), то обновления будут невозможны уже при 500 Мб, что абсурдно.
      При наличии рута должно помочь указание порога в 0%:
      http://4pda.ru/forum/index.php?showtopic=468961&view=findpost&p=37448420


      1. khim
        08.07.2017 00:10

        Поэтому если раздел /data, скажем, на 12 Гб (вполне реально), то обновления будут невозможны уже при 500 Мб, что абсурдно.
        Это не абсурдно, а правильно и логично. Если забить файловую систему «под завязку», то она будет работать в 10 раз медленнее. Таким простым и нехитрым способом Android этого не допускает и всё работает достаточно быстро.

        Объяснять что-либо пользователям при этом бесполезно, увы.


        1. myazinn
          08.07.2017 15:52

          Тогда почему бы просто не зарезервировать место, чтобы оно не отображалось как свободное? Раз уж им всё равно пользоваться нельзя.
          А объяснять пользователям надо, в конце концов, телефоны покупают они, а не разработчики


          1. khim
            08.07.2017 19:24

            Тогда почему бы просто не зарезервировать место, чтобы оно не отображалось как свободное? Раз уж им всё равно пользоваться нельзя.
            Маркетинг? Или, может, какие-то специфические особенности системы. В «обычном» GNU/Linux зарезервированное место не отображается как свободное и использовать его может только root. Скорее всего с последним возникли проблемы…

            <blockquote.>А объяснять пользователям надо, в конце концов, телефоны покупают они, а не разработчикиДа — но зачем оно им? Все системы пытавшиеся что-там пользователям обьяснять — вымерли, однако…


    1. mishast
      10.07.2017 17:57

      У меня как-то закончилось место на телефоне, я стал его пытаться освободить,
      стал смотреть, может данные приложений много место занимают, вроде все данные поудалял, но все равно места нет, а приложения, казалось бы, весят 5-60Мб, места — 6 гб было на чистой системе. Куда делось все место?
      После рутования выяснилось вот что:
      Очень много места съедается на dalvik кэш (сейчас уже art), т.е ставишь приложение в 20Мб, а съедается 200Мб. И главное нигде это в файловом менеджере не увидишь, если у вас нет рута, да и если есть надо еще догадаться, куда заглянуть…
      apk — это архив, при установке он распаковывается, а потом еще и компилируется.


  1. mickvav
    07.07.2017 12:42

    Хочется наложить этот график на закон Мура…


  1. serg_p
    07.07.2017 14:26

    Тенденция — Нужен анализ по пунктам, и не только в мобиле. А есть просто фиксация факта = пичаль.


  1. goodhoopoe
    07.07.2017 14:49

    Тут ещё фактор самих ресурсов, которые используются в приложении. Можно нарисовать визуальную часть контрола программно, а можно загрузить картинку, разница может доходить до порядков. Я всегда привожу 2 примера, которому я не перестаю удивляться и в какой-то мере даже восхищаться, потому что я считаю к такому нужно стремиться. Фейсбук больше 100мб, вконтакте 21.4мб(айфон, для айпэда 15.4(!!)). Фейсбук мессенджер 139мб, телеграм 47мб.


    1. YouHim
      07.07.2017 15:04

      Встречал шедевры весом пару мегабайт с горой функционала.


    1. man55
      07.07.2017 18:18
      +2

      Я вам больше скажу, ВКонтакт 3.12 под Андроид весит 9.7М (версия июнь 2015) и имеет всю основную функциональность. И сдается мне, что в текущих версиях новой функциональности и нету.
      Когда исчерпан функционал, начинаются свистелки и перделки


  1. grokinn
    07.07.2017 15:27

    Тоже не понимаю почему приложение facebook весит 300 мегабайт, если ему нужно лишь показывать мобильную версию сайта, а сафари в ios рендерит сайты для любого приложения.


    1. YouHim
      07.07.2017 15:46

      Собственно, это и не секрет. image


      1. YouHim
        07.07.2017 15:51

        Тут подробнее


  1. pawellrus
    08.07.2017 16:12

    Запланированное устаревание же. Дополнительная причина пойти и купить новый смартфон, где встроенной памяти наконец-то хватит под все приложения и игры с кэшем. А через пару лет снова и снова.


  1. Movimento5Litri
    11.07.2017 10:35

    Берримор,

    Почему мобильные приложения занимают все больше места?


    — Говнокодеры, сер