Как уменьшить вес приложения на андроид
Перейти к содержимому

Как уменьшить вес приложения на андроид

  • автор:

Как уменьшить размер приложений для Android во время разработки

Как уменьшить размер приложений для Android во время разработки

С ростом цифровизации к мобильным устройствам и мобильным приложениям, которые мы используем в повседневной жизни, предъявляются все более высокие требования. Объем мобильного хранилища увеличился до 256 ГБ, и он обязательно увеличится, поскольку мы удовлетворяем потребности клиентов, добавляем новые функции и поддерживаем приложения на экранах разных размеров.

Согласно отчету, 74% людей в мире используют Android, и около 70% пользователей смотрят размер приложения перед его установкой.

И, к нашему удивлению, 70 % людей на развивающихся рынках обращают внимание на размер приложения, потому что их беспокоит стоимость данных. и место для хранения телефона?

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

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

Размер Android-приложения имеет значение

В этом мире, управляемом мобильными устройствами, популярность мобильных приложений растет день ото дня. И по этой причине это также увеличивает спрос разработчиков приложений, которые разрабатывают приложения на базе Android и iOS для обеих платформ. Но, имея хороший опыт разработки приложений для Android и iPhone, мы увидели, что не каждое приложение для Android или iOS соответствует требованиям и становится успешным. Другими словами, можно сказать, что не каждый пользователь смартфона предпочитает каждое приложение.

Но знаете почему? Каковы реальные причины этого? Что ж, мы выяснили, что согласно отчету Google, если размер приложения превышает 150 МБ, , который ранее составлял 100 МБ, шансы на его установку снизятся на 30%. Кроме того, при увеличении размера на каждые 6 МБ установка коэффициент конверсии может снизиться на 1 %. Согласно исследованию, 65% людей не будут устанавливать приложение, если узнают, что оно слишком большое. Они будут избегать таких приложений из-за большого потребления интернет-данных, а также занимают больше места.

Теперь Google придумал лучшее решение. Он придумал Android App Bundle, и это позволяет вам устанавливать приложения, даже не загружая основные элементы, которые в любом случае присутствуют в других приложениях в Play Store, что помогает уменьшить размер почти на 35%, по мнению Google.

Итак, теперь вопрос в том, что если вашему приложению для Android требуется больше места? И знаете, если ваше приложение занимает больше места, то люди вообще не предпочтут его скачивать. Вы можете понять тот факт, что ни один пользователь не хочет сталкиваться с проблемами, потратив много данных только на одно приложение.

Итак, теперь давайте посмотрим, как уменьшить размер приложения для Android или размер APK во время разработки приложения для Android.

1. Используйте Android App Bundle, чтобы уменьшить размер приложения

Когда вы разработали приложение для Android и готовы выпустить его, вам нужно выбрать между APK и Android App Bundle. Android App Bundle заставит Google Play создать APK только для тех конкретных пользователей, которым требуются функции.

Набор приложений для Android

  • Для формата публикации, состоящего из скомпилированного кода и ресурсов вашего приложения, используется Android App Bundle, который задерживает создание APK и подписание в Google Play.
  • Для Android App Bundle ограничение на размер сжатой загрузки – 150 МБ. Комплект приложений нельзя использовать с файлами расширения APK.

2. Используйте Proguard

Чтобы уменьшить размер APK вашего приложения, Proguard, вероятно, является одним из самых полезных инструментов. Это напрямую уменьшит файлы исходного кода до минимума и может уменьшить размер файла APK до 90%.

  • Всякий раз, когда вы используете «Proguard, попробуйте использовать все варианты».
  • Proguard помогает избежать разногласий по поводу сгенерированного APK или пакета, если он используется во всех вариантах при разработке.
  • ProGuard не может переименовывать или удалять любые поля в этих классах данных, поскольку они должны соответствовать сериализованному формату.

3. Используйте плагин Android Size Analyzer

Чтобы значительно уменьшить размер вашего приложения для Android, вы можете использовать плагин Android Studio. С APK Analyzer разработчики Android могут выполнять следующие действия:

  • Просмотрите полный и сравнительный размер APK.
  • Знайте состав файлов DEX.
  • Быстрый просмотр окончательных версий файлов в APK, таких как файл AndroidManifest.xml.
  • Проведите параллельное сравнение двух APK.

4. Оптимизация изображения

Изображения с более высоким разрешением всегда являются лучшим и первым выбором для привлечения пользователей на сайт. Поскольку новейшее мобильное устройство поставляется с камерой с хорошим разрешением, размер изображения также можно было бы уменьшить, разбавив разрешение. В случае, если вы не хотите терять качество изображения, вам необходимо преобразовать изображения .jpg или .png в .webp.

Использование изображений без уменьшения размера может повлиять на качество приложения. Вместо того, чтобы загружать или использовать исходное изображение в своем приложении, преобразуйте изображения .jpg и .png в веб-формат. Для файлов png вы также можете использовать такие инструменты, как pngcrush или Zopflipng. Для файлов jpg вы можете использовать такие инструменты, как packJPG и Guetzli. Вы также можете использовать векторную графику, поскольку она делает изображение простым и использует пространство.

Это факт, что изображения могут творить чудеса без статических ресурсов. Во время выполнения фреймворка достаточно для динамического рисования таких изображений. Кроме того, использование объектов Vector Drawables — отличная идея при создании небольших приложений.

Поскольку эти приложения могут занимать минимальное место в файле APK и создавать изображения, соответствующие правилам дизайна материалов, использование Vector Drawables является ценным. Следует также позаботиться о спорах, которые могут возникнуть в связи с использованием ЦП и ОЗУ в качестве сложных объектов.

5. Поддержка определенных плотностей экрана

Чтобы уменьшить размер приложения для Android, правильное использование определенной плотности экрана — еще один отличный вариант. Существует миллион устройств на базе Android с различной плотностью экрана. Тем не менее, мы не используем всю плотность экрана и можем исключить то, что не требуется.

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

6. Удаление мертвого кода

Размер APK-файла напрямую связан со скоростью загрузки вашего приложения, занимаемой им памятью и потребляемой мощностью. Таким образом, любой неиспользуемый или неподходящий код, оставленный ради сохранения, только добавит мусора. Вот почему удаление неработающего кода или удаление кода необходимо для того, чтобы ваше приложение оставалось активным и активным все время, весь день.

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

7. Повторно используйте свой ресурс

Повторное использование действительно лучше и проще, чем удаление. Это удивительный способ использовать свои ресурсы по-разному. Это обеспечивает плавную прокрутку. Это может помочь вам уменьшить окончательный размер вашего Android APK. Вы можете исключить те ресурсы, которые представляют собой только вращающийся эквивалент другого ресурса.

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

8. Поддержка нескольких файлов APK

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

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

Но чтобы оно работало ближе к этим решениям, вы можете загрузить приложение через магазин Google Play через Android App Bundle, который позволяет Google включать оптимизированные APK на основе конфигурации устройства. Для этого вы можете разделить одно приложение на несколько APK. После этого пользователи могут получать только те APK, которые им выгодны в соответствии с конфигурацией их устройства.

9. Избегайте перечислений

Перечисления сомнительны. Один можно легко добавить в любом месте в диапазоне от 1,0 до 1,4 КБ в файл class.dex приложения. Они могут потреблять много высокой скорости, если есть сложные фреймворки или общие библиотеки.

Итак, как вы можете преодолеть эту проблему? Что ж, с помощью ProGuard вы можете преобразовать перечисления в целые числа, и конечным результатом будет приложение уменьшенного размера.

Последние мысли

Ну, это всего лишь простые методы, которые вы можете реализовать в своем приложении для Android на этапе разработки приложения для Android. Это, несомненно, поможет вам понять, как можно уменьшить размер приложения или APK-файла и повысить эффективность.

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

  • Впервые опубликовано [здесь] (https://theonetechnologies.com/blog/post/5-ways-to-reduce-android-app-size)*

Уменьшаем размер приложения: проверенные способы

Одним из немаловажных аспектов разработки мобильных приложений является оптимизация размера. Мы все по личному опыту знаем, что чем меньше весит приложение, тем охотнее его скачивают, особенно если под рукой нет точки доступа Wi-Fi, а скорость и/или трафик мобильного интернета оставляют желать лучшего. К тому же, нельзя забывать и о том, что некоторые маркеты ставят ограничение на размер выпускаемого приложения. Например, в App Store продукты размером до 100 МБ доступны для скачивания по мобильному интернету, если же вес приложения превышает этот порог, то скачать его можно только через Wi-Fi. На Play Market же приложение, которое вытягивает больше 100 МБ, нельзя загрузить в принципе. В данной статье мы опишем, к каким методам и хитростям прибегали наши разработчики нативных приложений на iOS для того, чтобы уменьшить вес продукта, и добавим к этому несколько дельных советов, найденных в сети.

Основные способы уменьшения размера приложения

Графический контент

Сейчас дизайн играет ключевую роль в любом хорошем приложении. Если интерфейс минималистичен или продукт имеет небольшой набор функций, то этот этап можно пропустить. Если же проект отличается богатым функционалом или поддерживает некоторое количество цветовых схем, то здесь уже не обойтись без большого количества изображений со всеми вытекающими последствиями для веса. Кроме того, зачастую в проекты по умолчанию добавляются наборы изображений под различные форм-факторы мобильных устройств, как например @1x, @2x, @3x для iOS приложений. Ниже мы приведем методы, которые использовали в своих приложениях, чтобы разрешить проблему с обилием графического контента. Возможно, какие-то из них вы применяете и сами.

Один из простейших путей — использовать вместо трех масштабов только 3x изображение. Этот способ не назовешь оптимальным, так как на устройствах, ориентированных под 1x и 2x масштабы, такие изображения не всегда будут смотреться приемлемо. Однако за неимением лучшего этим приемом можно неплохо уменьшить размер проекта при огромном количестве графики.

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

Теперь рассмотрим пример с приложением, имеющим несколько цветовых схем (в простонародье «скин»). Чем больше цветовых схем в приложении, тем сильнее возрастает количество необходимых изображений. Если в изображении используется более одного цвета, то приходится хранить несколько вариантов на каждый скин. Однако, в случае когда изображение однотонное, его можно сделать шаблонным и уже в самом коде менять цвет оттенка (tint color). На iOS создать подобный шаблон можно двумя способами:

  1. выставить Template Image в самом XCode (см. Рис.1);
  2. задать шаблонный режим программно

Рис.1. Выставление шаблонного режима изображения в XCode.

UIImage *templateImage = [[UIImage imageNamed:@«Back Chevron»] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; [backButton setTintColor:[UIColor blueColor]];

— где UIImageRenderingModeAlwaysTemplate и является шаблонным режимом изображения.

Замена анимационных изображений

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

NSArray *gif=@[@"frame1",@"frame2",@"frame3",@"frame4",@"frame5", @"frame6",@"frame7",@"frame8",@"frame9",@"frame10"]; NSMutableArray *images = [[NSMutableArray alloc] init]; for (int i = 0; i < gif.count; i++) < UIImage *image=[UIImage imageNamed:[gif objectAtIndex:i]]; [images addObject:image]; >imageView.animationImages = images; imageView.animationDuration = 0.3; imageView.animationRepeatCount=1; [imageView startAnimating];

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

+ (UIImage * _Nullable)animatedImageWithAnimatedGIFData:(NSData * _Nonnull)theData; + (UIImage * _Nullable)animatedImageWithAnimatedGIFURL:(NSURL * _Nonnull)theURL;

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

Однако gif-файл тоже занимает пространство, поэтому мы старались выполнить все анимации программно. В Audio Editor Tool на стартовом экране у нас проигрывается анимация появления логотипа AUDIO EDITOR побуквенно. Раньше данная анимация была реализована с помощью гифки, но из-за большого разрешения изображения весила она многовато. Поэтому мы решили реализовать ее с помощью CABasicAnimation.

CAGradientLayer *gradient=[CAGradientLayer layer]; gradient.frame=animationLabel.bounds; gradient.colors = @[(id)[UIColor colorWithWhite:1 alpha:1.0].CGColor, (id)[UIColor clearColor].CGColor]; gradient.startPoint = CGPointMake(0.0, 0.5); gradient.endPoint = CGPointMake(0.1, 0.5); animationLabel.layer.mask=gradient; dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.99 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^< gradient.colors = @[(id)[UIColor colorWithWhite:1 alpha:1.0].CGColor, (id)[UIColor colorWithWhite:1 alpha:1.0].CGColor]; >); CABasicAnimation *startPoint=[CABasicAnimation animationWithKeyPath:@"startPoint"]; startPoint.fromValue= [NSValue valueWithCGPoint:CGPointMake(0.0, 0.5)]; startPoint.toValue= [NSValue valueWithCGPoint:CGPointMake(1.0, 0.5)]; startPoint.duration = 0.9; [startPoint setBeginTime:0.1]; startPoint.removedOnCompletion=NO; CABasicAnimation *endPoint=[CABasicAnimation animationWithKeyPath:@"endPoint"]; endPoint.fromValue= [NSValue valueWithCGPoint:CGPointMake(0.1, 0.5)]; endPoint.toValue= [NSValue valueWithCGPoint:CGPointMake(1.0, 0.5)]; endPoint.duration = 1.0; [endPoint setBeginTime:0.0]; endPoint.removedOnCompletion=NO; CAAnimationGroup *group = [CAAnimationGroup animation]; [group setDuration:1.2]; [group setAnimations:[NSArray arrayWithObjects:startPoint, endPoint, nil]]; [ gradient addAnimation:group forKey:nil];

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

Конвертирование аудио

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

+(void)convertAudio:(NSURL *)url toUrl:(NSURL *)convertedUrl< AVAudioFile *audioFile = [[AVAudioFile alloc] initForReading:url error:nil]; AVAudioPCMBuffer *buffer = [[AVAudioPCMBuffer alloc] initWithPCMFormat:audioFile.processingFormat frameCapacity:(uint32_t)audioFile.length]; [audioFile readIntoBuffer:buffer error:nil]; NSDictionary *recordSettings = @< AVFormatIDKey : @(kAudioFormatLinearPCM), AVSampleRateKey : @(audioFile.processingFormat.sampleRate), AVNumberOfChannelsKey : @(audioFile.processingFormat.channelCount), AVEncoderBitDepthHintKey : @16, AVEncoderAudioQualityKey : @(AVAudioQualityMedium), AVLinearPCMIsBigEndianKey: @0, AVLinearPCMIsFloatKey: @0, >; AVAudioFile *writeAudioFile = [[AVAudioFile alloc] initForWriting:convertedUrl settings:recordSettings error:nil]; [writeAudioFile writeFromBuffer:buffer error:nil]; > 

В данном методе берется файл из бандла по url и сохраняется в директорию по convertedUrl. Считываемый файл загружается в буфер и уже оттуда записывается в новый с требуемыми настройками записи. Таким образом, мы используем более стабильный и тяжеловесный WAV после первого запуска, но при этом размер приложения существенно уменьшается на этапе загрузки и установки.

Подгрузка файлов с сервера

Подгрузка файлов с сервера — это то что нужно для приложений со значительным объемом контента. Большое количество пресетов музыки, наборы изображений и многое другое, что сильно увеличивает размер приложения, можно загрузить и позднее. Конечно, загрузка каждого отдельного файла потребовала бы много времени и трафика, поэтому с сервера подгружаются архивы со всем необходимым, а уже в самом приложении они распаковываются и сохраняются в директории приложения. Для разархивирования используется библиотека SSZipArchive (репозиторий библиотеки вы найдете по ссылке). Эта библиотека способна как упаковывать файлы в архив, так и распаковывать архивы. Но нас интересует только один метод из основного класса библиотеки:

+ (BOOL)unzipFileAtPath:(NSString *)path toDestination:(NSString *)destination progressHandler:(void (^)(NSString *entry, unz_file_info zipInfo, long entryNumber, long total))progressHandler completionHandler:(void (^)(NSString *path, BOOL succeeded, NSError *error))completionHandler;

Данный метод распаковывает файл из пути path в путь destination, а пока он распаковывается в progressHandler можно совершать какие-либо действия (например, отображение прогресса распаковки), после чего в completionHandler показать, что распаковка благополучно завершилась, либо вывести ошибку при неудаче.

Заключение

В конечном счете, если судить по приложению Mix Wave, которое до установки весит ~41 МБ, а после загрузки всех пресетов — 281 МБ, то описанные методы смогли уменьшить размер приложения примерно в семь раз. Результат неплохой, хотя, возможно, существуют и более актуальные способы. Если вы знаете о таких, предлагаем поделиться в комментариях.

UPD: Спасибо Dim0v за дельные замечания о графическом контенте. Приводим их ниже:

Читать

«Во-первых, для устройств с iOS 9 и выше работает App slicing. iTunes Connect пересобирает загруженный архив в несколько вариантов для разных устройств. Таким образом, например, iPhone 6 при установке из апп стора будет тянуть только @2x ресурсы, а iPad mini 1 — только @1x. Поэтому если продукт поддерживает iOS 9+, то прислушивание к совету об оставлении только 3x ресурсов будет иметь строго обратный эффект — для айфонов+ ничего не изменится, а вот устройства с меньшим разрешением будут вынуждены тянуть себе 3x ресурсы, тогда как могли обойтись 2x или 1x.

Во-вторых — совет о переводе растровых изображений в вектор также не имеет смысла. Единственное, что вы таким образом можете сэкономить — это место на компьютере разработчиков. Xcode растеризирует векторные изображения при сборке билда, в чем несложно убедиться, к примеру, отмасштабировав «векторную» картинку на устройстве и увидев дико пикселизированное растровое изображение. Я не спорю, векторные ресурсы — это удобно: проще экспортировать дизайнерам, не нужно следить чтобы при изменении ресурса остались «синхронизированными» все его версии разных разрешений и т.п. Но перевод существующих растровых картинок в вектор именно с целью уменьшения размера билда не имеет никакого смысла».

  • размер проектов
  • оптимизация размера
  • ios
  • мобильные приложения
  • objective-c
  • Блог компании Productivity Inside
  • Разработка под iOS
  • Разработка мобильных приложений
  • Objective C

Как уменьшить размер APK?

Как уменьшить размер APK

Можно ли как-то уменьшить размер APK файла?

Все знают, что Google Play накладывает ограничение на размер публикуемых приложений. Сегодня авторы могут разместить программы, размер которых не превышает 50мб. Но что делать в ситуации если вы превысили данное ограничение?

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

Вас также может заинтересовать статья «Декомпиляция APK онлайн».

Как уменьшить размер APK

Вот список способов с помощью которых можно значительно сократить размер APK приложения. В целом советы очень простые:

  • Используйте Proguard, он безжалостно избавляется от неиспользуемого кода и сокращает имена классов, методов и полей.
  • Настройте разделение APK для разных версий Android.
  • Прогоняйте приложение через redex.
  • Используйте утилиту lint чтобы избавиться от ненужных ресурсов.
  • Используйте gradle-директиву shrinkResources для удаления неиспользуемых ресурсов.
  • Переходите на векторные иконки.
  • Удалите любые библиотеки для отладки из финального приложения.
  • Замените изображения в форматах PNG и JPG на WebP.
  • Используйте оптимизатор TinyPNG или Optipng для сокращения размера PNG.

Как уменьшить размер APK на 99,99%

Playing APK Golf — весьма любопытная статья о том, до какой степени можно сократить размер APK-файла, если очень сильно захотеть. Интересные факты:

  • Даже «пустое» приложение для Android 8 весит 1,5 Мбайт, пятую часть из которых занимают стандартные иконки и ресурсы, а почти мегабайт — код (classes.dex).
  • Classes.dex включает в себя более 13 тысяч методов из support-библиотек, в том числе AppCompatActivity и ConstraintLayout. Все эти support-библиотеки нужны, чтобы приложение корректно работало не только в новых версиях Android, но и во всех поддерживаемых.
  • Android абсолютно безразлично, умеет ли приложение что-либо делать и есть ли в нем какой-то код вообще.
  • Минимально возможный размер APK, который удалось получить, — 1757 байт. Это пустое приложение без кода, которое не умеет ничего делать и которое нельзя запустить.

При участии сообщества размер APK удалось уменьшить до 678 байт. Репозиторий на GitHub.

На этом все. Надеюсь данные советы помогли вам уменьшить размер APK приложения.

Android App Bundles. Как уменьшить размер вашего приложения?

Привет, Хабр! Сегодня расскажу, что такое Android App Bundles, как их использовать в реальном проекте и на сколько нам удалось уменьшить размер приложения, не прикладывая очень больших усилий.

Вступление. Что такое Android App Bundles?

Начиная с августа 2021 года Google ввел правило — новые приложения должны публиковаться с Android App Bundles. По своей сути, Android App Bundle — это формат публикации, который включает в себя весь скомпилированный код и ресурсы вашего приложения, а также откладывает создание APK и подписание его в Google Play.

Google Play использует ваш app bundle для создания и обслуживания оптимизированных APK-файлов для каждой конфигурации устройства, поэтому для запуска вашего приложения загружаются только код и ресурсы, необходимые для конкретного устройства. Вам больше не нужно создавать, подписывать и управлять несколькими APK-файлами, чтобы оптимизировать поддержку различных устройств, а пользователи получают более оптимизированные загрузки.

Ограничения Android App Bundles

Публикация с помощью наборов Android App Bundle помогает пользователям устанавливать ваше приложение с минимально возможным количеством загрузок и увеличивает предельный размер сжатой загрузки до 150 МБ . То есть, когда пользователь загружает ваше приложение, общий размер сжатых APK-файлов, необходимых для установки вашего приложения (например, базовый APK + APK-файлы конфигурации), не должен превышать 150 МБ. Любые последующие загрузки, такие как загрузка on demand feature module(и его конфигурационных APK-файлов), также должны соответствовать этому ограничению размера загрузки. Assets-пакеты не влияют на это ограничение по размеру, но имеют другие ограничения по размеру.

Если при загрузке пакета приложений Play Console обнаружит, что размер любой из возможных загрузок вашего приложения или его on demand feature превышает 150 МБ, вы получите сообщение об ошибке.

Подготовка проекта к миграции

Прежде чем переходить к имплементации в проекте, пройдемся по основным этапам подготовки.

  1. Используйте shrinking, обфускацию и оптимизацию вашего проекта, это позволит сократить размер приложения путем удаления неиспользуемого кода и ресурсов. Детальнее можно почитать в официальных гайдах.
  2. Следуйте лучшим практикам, чтобы еще больше уменьшить размер приложения(использование drawable objects, использование WebP вместо jpg и png, и т.д.). Больше тут.
  3. Рассмотрите возможность преобразования некоторого функционала, который используется только некоторыми из ваших пользователей, в dynamic feature modules, которые ваше приложение может загрузить позже по запросу. Имейте в виду, что для этого может потребоваться некоторый рефакторинг вашего приложения, поэтому сначала попробуйте другие предложения, описанные выше.
  4. Используйте разделение ресурсов по папкам(drawables):
    • для векторной графики(svg) используйте папку drawable-nodpi, Система не масштабирует эти ресурсы независимо от плотности текущего экрана;
    • растровую графику распределяйте по папкам drawable-*dpi, для App Bundles не будет загружаться графика, не соответствующая размеру экрана.

Настройка базового модуля

App Bundle отличается от APK тем, что вы не можете развернуть его на устройстве. Это формат для публикации, который включает весь скомпилированный код и ресурсы вашего приложения в один артефакт сборки. После того, как вы загрузите App Bundle, подписанный релизным ключем, Google Play будет иметь все необходимое для создания и подписания APK-файлов вашего приложения и предоставления их пользователям.

Большинство проектов приложений не потребуют больших усилий для поддержки пакетов Android App Bundle. Это потому, что модуль, который включает код и ресурсы для базового APK вашего приложения, является стандартным модулем приложения, который вы получаете по умолчанию при создании нового проекта приложения в Android Studio. Модуль, к которому применяется application plugin ниже к своему build.gradle файлу, предоставляет код и ресурсы для основных функций вашего приложения.

plugins < // The standard application plugin creates your app's base module. id("com.android.application") >

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

Для большинства существующих проектов приложений вам не нужно ничего менять в конфигурации сборки вашего базового модуля. Однако, если вы планируете добавить feature modules в свой проект приложения или если вы ранее выпустили свое приложение с использованием нескольких APK, вам следует помнить о некоторых аспектах конфигурации сборки базового модуля. Вот так выглядит схема модулей при использовании App Bundles:

Код версии и обновления приложений

С пакетами Android App Bundle вам больше не нужно управлять кодами версий для нескольких APK, которые вы загружаете в Google Play. Вместо этого вы управляете только одним кодом версии в базовом модуле вашего приложения, как показано ниже:

// In your base module build.gradle file android < defaultConfig < … // You specify your app’s version code only in the base module. versionCode 5 versionName "1.0" >>

После загрузки пакета приложений Google Play использует код версии в вашем базовом модуле, чтобы назначить один и тот же код версии всем APK, которые он генерирует из этого пакета. То есть, когда устройство загружает и устанавливает ваше приложение, все разделенные APK для этого приложения имеют один и тот же код версии.

Если вы хотите обновить свое приложение новым кодом или ресурсами, вы должны обновить код версии в базовом модуле вашего приложения и создать новый полный комплект приложения. Когда вы загружаете этот набор приложений в Google Play, он создает новый набор APK на основе кода версии, указанного в базовом модуле. Впоследствии, когда пользователи обновят ваше приложение, Google Play предоставит им обновленные версии всех APK, установленных в настоящее время на устройстве. То есть все установленные APK обновляются до кода новой версии.

Также стоит обратить внимание на следующие нюансы:

  1. Релизная подпись приложения. Если вы включаете информацию о подписи в свои файлы сборки, вы должны включать ее только в файл конфигурации сборки базового модуля. Дополнительные сведения см. в разделе Настройка Gradle для подписи приложения.
  2. Code shrinking. Если вы хотите включить сжатие кода для всего проекта приложения (включая его функциональные модули), вы должны сделать это из файла build.gradle базового модуля. То есть вы можете включить пользовательские правила ProGuard в feature module, но minifyEnabled свойство в конфигурациях сборки feature module игнорируется.
  3. Блок splits игнорируется. При компиляции App Bundle, Gradle игнорирует свойства в android.splits блоке. Если вы хотите контролировать, какие типы APK-файлов конфигурации поддерживает ваш app bundle, вместо этого используйте android.bundle.
  4. Управление версиями приложения. Базовый модуль определяет version code и version name для всего проекта приложения. Для получения дополнительной информации перейдите в раздел о том, как управлять обновлениями приложений .

Итак, перейдем собственно к настройке gradle-файла вашего базового модуля:

android < // When building Android App Bundles, the splits block is ignored. // You can remove it, unless you're going to continue to build multiple // APKs in parallel with the app bundle splits // Instead, use the bundle block to control which types of configuration APKs // you want your app bundle to support. bundle < language < // This property is set to true by default. // You can specify `false` to turn off // generating configuration APKs for language resources. // These resources are instead packaged with each base and // feature APK. // Continue reading below to learn about situations when an app // might change setting to `false`, otherwise consider leaving // the default on for more optimized downloads. enableSplit = false >density < // This property is set to true by default. enableSplit = true >abi < // This property is set to true by default. enableSplit = true >> >

Основное внимание стоит обратить на блок bundle — это и есть настройка наших Android App Bundles.

Блок language.

Google Play определяет, какие языковые ресурсы устанавливать вместе с приложением, на основе выбора языка в настройках устройства пользователя. Представьте пользователя, который меняет свой системный язык по умолчанию после того, как уже загрузил ваше приложение. Если ваше приложение поддерживает этот язык, устройство запрашивает и загружает дополнительные APK-файлы конфигурации для этих языковых ресурсов из Google Play.

Для приложений, которые предлагают средство выбора языка внутри приложения и динамически изменяют язык приложения, независимо от языковых настроек системного уровня, необходимо внести некоторые изменения, чтобы предотвратить сбои из-за отсутствия ресурсов. Задайте для android.bundle.language.enableSplit свойства значение false или рассмотрите возможность реализации языковой загрузки по запросу с использованием библиотеки Play Core.

Другими словами, если у вас поддержка нескольких языков и есть возможность менять язык внутри приложения, вам необходимо для блока language задать enableSplit = false и реализовать подгрузку нужных языков, как описано в разделе Download additional language resources.

Блок destiny.

Этот блок отвечает за подгрузку графики только для нужной плотности экрана(то что мы делали на этапе подготовки к миграции, раскладывали ресурсы по попкам drawable-*dpi).

Параметр enableSplit отвечает за загрузку графики. Если выставить enableSplit = true, будет загружена графика только для текущей плотности экрана.

Блок abi.

В разных устройствах Android используются разные процессоры, которые, в свою очередь, поддерживают разные наборы инструкций. Каждая комбинация ЦП и набора команд имеет собственный Application Binary Interface(ABI).

Параметр enableSplit отвечает за загрузку ABI. Если выставить enableSplit = true, будет загружен набор инструкций только для текущего процессора.

Итог

В качестве итога скажу, что более 1 миллиона приложений и игр используют пакеты приложений для публикации своих производственных выпусков в Google Play, включая большинство популярных приложений, что составляет миллиарды активных установок. Если вы используете Google Play для установки приложений, многие приложения на вашем устройстве были опубликованы в виде App Bundles.

В нашем же случае, мы значительно смогли уменьшить размер нашего приложения. Размер при скачивании уменьшился с 44.22МБ до 27.61МБ(может варьироваться в зависимости от модели устройства, данные для Samsung S21):

Download APK-versionDownload AAB-version

Размер чистой только что установленной версии уменьшился с 117МБ до 72.52МБ (может варьироваться в зависимости от модели устройства, данные для Samsung S21):

Installed APK-versionInstalled AAB-version

Спасибо за внимание! Делитесь в комментариях, на сколько вам удалось уменьшить размер приложения =)

  • android
  • android development

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

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