Каталог расширений

Популярные теги

3gp       avi       fb2       jpg       mp3       pdf      

Как сжать файл apk


Сжимаем APK, стараясь сохранить его работоспособность / Хабр


/ PxHere / PD

Оптимизация веса APK — это нетривиальная, но очень актуальная во времена Instant App, задача. Включение proguard избавит вас от ненужного кода, если ваши зависимости можно определить на этапе компиляции, но в APK есть ещё несколько видов файлов, которые можно исключить из сборки.

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



  • Прежде, чем применять советы из статьи, оптимизируйте APK по гайду от Google. Эта статья для тех, кому недостаточно стандартных оптимизаций.
  • Под словом "proguard" я подразумеваю оптимизирующий компилятор с минификацией.
  • Под компонентом я имею в виду некую фичу продукта с точки зрения бизнеса. В нашем случае, это просто набор файлов в неком пакете. Gradle-модуль у нас один на всё приложение.

Вес нашего APK, оптимизированного по гайду от Google составлял 4.4 мб.


Начнём с простого. Если вы не используете kotlin-reflect, то можете исключить из сборки мета-информацию о kotlin-классах. Сделать это можно следующим образом:
В build.gradle (Module: app)

android { packagingOptions { exclude("META-INF/*.kotlin_module") exclude("**.kotlin_builtins") exclude("**.kotlin_metadata") } }

Для Java-рефлексии не нужны файлы *.kotlin_module, *.kotlin_builtins и *.kotlin_metadata. Определить, какую рефлексию вы используете, очень просто. Если вы пишите obj::class.<method>, то вы используете kotlin-рефлекцию, если же obj::class.java.<method>, то java-рефлексию.

Итог оптимизации для нас: -602.1 кб


Иногда библиотеки тянут за собой зависимости для случаев, которые никогда не произойдут в вашем приложении. Например, ktor-client тянет вместе с собой kotlin-reflect (0.5 мб!).
Я боролся с такими случаями следующим образом: собирал APK с minifyEnabled = true, закидывал его в анализатор Android Studio, загружал mapping.txt и искал пакеты, которые, по идее, не должны присутствовать в сборке. Например, kotlin.reflect. После запускал ./gradlew app:dependencies в папке проекта для поиска зависимостей (не забудьте увеличить длину истории в терминале. Дерево зависимостей может быть большим!). По этому дереву легко понять, что ссылается на лишние зависимости и исключить их. В build.gradle вашего модуля:

dependencies { implementation("io.ktor:ktor-client-core:$ktorVersion") { exclude(group: "org.jetbrains.kotlin", module: "kotlin-reflect") } implementation("io.ktor:ktor-client-okhttp:$ktorVersion") { exclude(group: "org.jetbrains.kotlin", module: "kotlin-reflect") } }

Этот код убирает зависимость библиотеки ktor-client на kotlin-reflect. Если хотите исключить что-то другое — подставьте свои значения.

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

Итог оптимизации для нас: -500.3 кб


К сожалению, proguard не удаляет лишние файлы разметки на языке XML из папки layout. Неиспользуемые XML могут использовать "тяжёлые" виджеты и proguard не сможет исключить из сборки их тоже! Чтобы избежать такого, удалите неиспользуемые ресурсы с помощью Refactor -> Remove unused resources...


Если вы, как и мы, используете runtime DI, то проверьте, нет ли у вас provider'ов для тех зависимостей, которые вы не используете. Proguard не может исключить их из сборки потому что они не являются неиспользуемыми с точки зрения компилятора. Вы используете их при построении графа зависимостей.


Инструменты отладки могут занимать неожиданно много места. Например, stetho весит около 0.2 мб после сжатия! В любом случае, лучше исключить из релизной сборки всю отладочную инфраструктуру, чтобы никто не смог узнать о вашем приложении слишком много, просто скачав его из Google Play.

Вы можете сделать так, чтобы для дебага и для релиза использовались разные версии одних и тех же файлов. Для этого в папке src, рядом с main, создайте папки debug и release. Теперь вы можете написать функцию initStetho, которая инициализирует Stetho в файле src/debug/java/your/pkg/Stetho.kt и функцию initStetho, которая не делает ничего, в файле src/release/java/your/pkg/Stetho.kt.

На всякий случай, сделайте так, чтобы эта зависимость включалась только в дебаговые сборки. Сделать это можно, заменив implementation на debugImplementation в build.gradle. Чаще всего, proguard исключает ненужные файлы даже без этого шага, но не всегда. Ответ на вопрос "почему?" ниже в тексте статьи.


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


/ PxHere / PD


Мы разрабатываем конструктор мобильных приложений E-SHOP. У нас несколько десятков клиентов и у каждого свой индивидуальный набор компонентов. Некоторые компоненты используются всеми клиентами, некоторые — только частью. Наша задача — включить в сборку клиента только те компоненты, которые ему нужны.


Для каждого клиента мы создаём отдельный productFlavor. Это удобно, потому что легко сделать разные ресурсы для разных клиентов, IDE предоставляет графический интерфейс для переключения между flavor'ами, и хорошо работают кэши. А ещё можно генерировать для каждого клиента свой BuildConfig.java. Значения полей этого класса известны на этапе компиляции. Это то, что нам нужно! Создаём поле типа boolean для каждого компонента.

android { productFlavors { client1 { buildConfigField("boolean", "IS_CATALOG_ENABLED", "true") } client2 { buildConfigField("boolean", "IS_CATALOG_ENABLED", "false") } } }

Это — упрощённая версия конфигурации. Настоящая сложна из-за интеграции с нашим CI.

Теперь известно, активен ли компонент, на этапе компиляции, и proguard может исключить его из сборки!


Теперь проблема с неиспользуемыми XML-layouts приобретает новый масштаб! Нельзя просто взять и удалить разметку какого-нибудь компонента просто потому, что некоторым клиентам он не нужен.

В нашем приложении в XML одного из редкоиспользуемых компонентов, использовался виджет, который ссылался на библиотеку распознавания изображений firebase.ml.vision. Она весит около 0.2 мб, что немало. Было принято решение добавлять этот виджет кодом вместо того, чтобы объявлять его в разметке. После этого proguard смог исключить vision из сборки для клиентов, которым он не нужен.

Итог оптимизации для нас: -222.3 кб для среднего APK


Есть 2 способа сказать proguard, что ваш класс нельзя минифицировать: написать правило в файле proguard-rules.pro или поставить аннотацию @Keep. В библиотеке play-services-vision на корневом классе стоит именно эта аннотация. Поэтому 0.2 мб висело мёртвым грузом даже в тех приложениях клиентов, которым не нужно распознавание изображений.

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

К счастью, библиотека firebase.ml.vision, которая является более новой версией play-services-vision, не использует эту аннотацию и мы решили проблему, перейдя на неё.


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

Итог оптимизации для нас: -20.1 кб для среднего APK



  • Вес среднего APK уменьшился с 4.4 мб до 3.1 мб, а минимального — до 2.5 мб!
  • Код приложения не пострадал, а улучшился. Теперь с DI проще работать

Все оптимизации, представленные в статье — это "низковисящие фрукты". Их довольно легко внедрить и быстро получить результат. До -43% для уже оптимизированного APK в нашем случае. Надеюсь, я сэкономил ваше время тем, что перечислил всё в одном месте.


Всем спасибо!

Как уменьшить размер приложения (.apk) Oh! Android

Когда я устанавливаю свое приложение на телефоне для тестирования, он показывает, что это ОГРОМНЫЙ размер, 11,35 МБ . Это очень простое приложение, которое позволяет пользователю просматривать интересные факты. Единственная причина, по которой я могу думать, состоит в том, что в чертежах есть 14 файлов JPEG, которые служат в качестве фоновых изображений забавных фактов. Средний размер их составляет около 500 КБ.

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

EDIT: фотографии – это фотографии, сделанные мной с помощью телефона Android.

Я бы рекомендовал вам сжать файлы .jpg как можно больше, это должно значительно уменьшить размер вашего файла .apk . Инструмент, такой как Paint.NET, который является бесплатным, должен помочь вам в этом. Он имеет большие варианты изменения размера.

Другие ответы говорят о сокращении изображений. Вы также можете попробовать попробовать ProGuard уменьшить ваш байт-код. Вот статья о применении ProGuard к Android-приложению.

Убедитесь, что ваши jpg не сохранены в любом более высоком разрешении, чем необходимо. Хороший Android-телефон имеет разрешение 1920×1200 или 2560×1440 (около 2015) 800 x 480 , поэтому ваши фоны не должны содержать больше пикселей, чем это (если ваше приложение не поддерживает какое-то масштабирование). Кроме того, фотографии фона? Если нет, вы можете обнаружить, что использование векторного формата изображения, такого как svg, или одного с динамической палитрой, например gif, еще больше уменьшит размер файла.

ОБНОВИТЬ

С введением библиотеки поддержки 23.2 теперь вы можете заменить многие из ваших объектов изображения на SVG (без анимации), чтобы уменьшить размер apk.

ОРИГИНАЛ

Это может быть поздний ответ, но может быть полезен для будущих пользователей.

См. Эту ссылку . Чтобы суммировать страницу, в ней упоминаются ниже ключевые моменты, которые помогут уменьшить размер apk в совокупности:

  • Использовать ProGaurd
  • Удалите любую информацию об отладке, которую вы имеете в приложении (такие заявления, как Log.i ()). Они могут быть завернуты в состояние, которое разрешено только при тестировании приложения.
  • Использовать рекомендуемые форматы носителей
    • Изображение: PNG orJPG
    • Аудио: AAC
    • Видео: h364 AVC
  • Сжатие изображений с использованием OptiPNG или PNGCrush
  • Используйте 9patch для масштабирования изображений
  • Найдите неиспользуемые ресурсы с помощью этого инструмента и удалите их .
  • Избегайте использования нескольких ресурсов для достижения той же функциональности. Ресурсы не только ограничивают изображения, но распространяются на API. Иногда сингулярный API может предоставлять несколько результатов вместо использования двух или трех разных API. Дублированные строки и активы также являются пустой тратой пространства.

Помимо оптимизации изображений, я также счел полезным проверить библиотеки поддержки, которые вы используете. У меня есть относительно простые платформы таргетинга приложений с API> = 10, но мой APK оказался 2.2M или после использования ProGuard, 1.4M. Когда я заглянул в APK, код был 1.5M, и было много дополнительных ресурсов (abc_ *), о которых я ничего не знал.

Затем я нашел это: https://developer.android.com/tools/support-library/features.html

Оказывается, мне не нужен appcompat-v7, только поддержка-v4, и внесение этого изменения в мои зависимости уменьшило размер APK до 1.7M (0.9M с ProGuard). Понятно, что в библиотеках поддержки есть много дополнительных (код и ресурс), поэтому убедитесь, что вы используете только те, которые вам нужны, могут помочь.

(Несмотря на то, что -0.5M не является существенным для приложения 11M, я публикую это здесь, потому что я продолжал заканчиваться на этой странице, ища решение …)

  • Используйте tinypng, сжимайте файлы изображений вашего проекта png или jpg, он может значительно уменьшить размер изображения без потери качества изображения;
  • Некоторые изображения используют tinypng compress могут искажать, вы можете конвертировать
    Эти изображения в формате webP, используйте 智 图 или iSparta, чтобы преобразовать другой формат в webP;
  • Используйте Lint, чтобы проверить использование ресурсов и удалить их;

Еще одна вещь, чтобы добавить размер файла изображения – разные алгоритмы могут существенно повлиять на конечный размер. Я обнаружил, что http://www.smushit.com Yahoo намного эффективнее (по крайней мере, для .png), чем компрессоры и кодеки, которые у меня есть на моем компьютере прямо сейчас.

Есть две вещи, которые я могу указать из опыта.

  1. Если вы используете eclipse для создания файла apk, ресурсы дублируются (по крайней мере, это произошло в моем случае), вы можете попробовать использовать ant и build.xml для создания apk и сравнить размер.
  2. Также посмотрите на сглаживание ресурсов. Ссылка на него здесь .

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

1). Используйте изображения WebP вместо изображений Jpeg, это окажет огромное влияние на размер apk, если вы используете несколько изображений.

2) -Используйте VectorDrawables, если вы используете простые маленькие значки в своем приложении.

3). Использовать свойство tint View в xml, чтобы избежать нескольких одинаковых значков, но различаться по цвету.

Искать DrawableTint и TintableImageview

4) – Используйте 9-патч-изображения и избегайте дублирования изображения или чего-либо в коде приложения.

Ниже приведены ссылки для сокращения размера APK.

https://developer.android.com/topic/performance/reduce-apk-size.html

https://developer.android.com/studio/build/configure-apk-splits.html#configure-split

https://developer.android.com/training/multiple-apks/index.html

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

Я дам вам отрывок из этого же.

  1. Используйте только необходимые библиотеки из Служб Google Play.
  2. Примените ProGuard к своему приложению.
  3. Минимизировать и сжать.
  4. Принять векторные образы.
  5. Используйте андроид-линт.
  6. Разделите apk на основе архитектур
  7. Добавление resConfigs в файлы gradle для указания языков локализации.

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

Вот что вы можете сделать для уменьшения размера сборки с помощью изображений (также может работать для iOS). Здесь я использую отличный инструмент под названием «OPTIPNG» (вы можете скачать отсюда ), что поможет нам свести сборку с помощью изображений, Это уменьшит размер изображения для PNG, которые мы используем, без ухудшения качества (Разрешение и цвет) изображения.

Пример. Если размер вашего изображения не соответствует 698 КБ, тогда он будет простым уменьшенным размером до 564 КБ

Вот шаги выполнения для OPTIPNG 0.7.5

1) Терминал -> CD / YourLocal путь OPTIPNG

2) введите «./configure»

3) введите «sudo make install»

Интелляция должна быть сделана сейчас

4) введите «optipng / your image path

Вы получите результат в байте и можете также проверить свой размер

Вы также можете попробовать http://www.webresizer.com/resizer/ Его онлайн-инструмент, сделал для меня довольно хорошую работу.

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

Ниже приведены способы уменьшить размер приложения. Подробно объясняется в следующей ссылке.

https://medium.com/@fahimsakri/put-your-apks-on-diet-cc3f40843c84#.m860q8s1u

Proguard

Векторные чертежи

Apk расщепляется

Оптимизация изображений png

Удалить неиспользуемые ресурсы

9-патч-изображения

Сжатие изображений Jpeg

Удалить отладочную информацию

Избегайте дублирования

Широко использовать lint

Использовать ресурс по возможности

Рекомендуемые форматы носителей

Вы можете уменьшить размер apk по del R.class и заменить ссылку на константу.

Смотрите это: https://github.com/mogujie/ThinRPlugin

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

Один из простых способов уменьшить ваш APK – уменьшить количество и размер ресурсов, которые он содержит. В частности, вы можете удалить ресурсы, которые ваше приложение больше не использует, и вместо файлов изображений можно использовать масштабируемые объекты Drawable.

Формат изображения WebP: обеспечивает сжатие с потерями (например, JPEG), а также прозрачность (например, PNG), но может обеспечить лучшее сжатие, чем JPEG или PNG

Преобразование изображений в WebP

Используйте SVG-изображения вместо jpg, чтобы уменьшить размер apk. Поместите свои файлы изображений в базу данных .. чтобы пользователи вашего приложения могли загрузить его из базы данных, и это значительно уменьшит размер приложения.

Как уменьшить и сжать файл apk в android Oh! Android

Вы можете сжать файл APK (rar, zip), но его нужно распаковать, чтобы работать.

Если файл apk, который можно распространять, вы можете:

  1. Используйте файлы расширения: http://developer.android.com/google/play/expansion-files.html.
  2. Создайте несколько версий apk: http://developer.android.com/google/play/publishing/multiple-apks.html (например, файлы hdpi для устройств ldpi)
  3. Использовать ProGuard

    ProGuard – это бесплатный инструмент для сжатия файлов Java, оптимизатор, обфускатор и преверизатор. Он обнаруживает и удаляет неиспользуемые классы, поля, методы и атрибуты. Он оптимизирует байт-код и удаляет неиспользуемые инструкции. Он переименовывает остальные классы, поля и методы, используя короткие бессмысленные имена. Наконец, он предопределяет обработанный код для Java 6 или более поздней версии или для Java Micro Edition.

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

  4. Удалить неиспользуемые ресурсы: https://code.google.com/p/android-unused-resources/

  5. Оптимизируйте свои изображения с помощью таких инструментов, как оптимизаторы 9patch и png
  6. Удалите все, что используется только для целей отладки (классы отладки или даже методы Log ()). Также попробуйте удалить ненужные файлы .so

Вы можете ZipAlign подписанный apk сжать его.

Применение:

 zipalign [-f] [-v] <alignment> infile.apk outfile.apk 

Пример:

 D:\android-sdk\android-sdk\tools>zipalign -f -v 4 "C:\Users\Joisar\Desktop\project_name\appname_signed.apk" "C:\Users\Joisar\Desktop\project_name\appname__zipaligned.apk" 

Заметка:

Просьба проверить apk, является ли оно zipaligned или нет, следуя команде, если это не zipaligned, а затем сделайте это.

 zipalign -c -v 4 "C:\Users\Joisar\Desktop\project_name\appname_signed.apk" 

Найти проблему

Вы можете анализировать APK из Android Studio. Это показывает вам различные файлы в своих каталогах и их размеры, как абсолютные, так и относительно всего APK:

Проверка неиспользуемых ресурсов

Это самое простое: Покажет вам, помимо прочего, неиспользуемые ресурсы:

Просто удалите их из своего проекта.

Использование векторных изображений

Vector Drawables обеспечивают одно четкое изображение для всех разрешений, что значительно уменьшает размер вашей графики. Как обычно, вы можете использовать их для значков и т. Д., Но не для фотографий. Не-векторизованные изображения могут быть уменьшены с помощью тримажа .

Proguard minify

Добавьте в app/build.gradle чтобы включить proguard для удаления неиспользуемых классов из вашего проекта:

 buildTypes { release { minifyEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } 

Как уменьшить приложение (.apk) размер

помогите!

когда я устанавливаю свое приложение на телефон для тестирования,он показывает, что это огромный размер, 11.35 MB. Это очень простое приложение, которое позволяет пользователю просматривать забавные факты. Единственная причина, по которой я могу думать о том, что в drawables есть 14 JPEG-файлов, которые служат фоновыми изображениями забавных фактов. Средний размер составляет около 500 КБ.

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

EDIT: фотографии-это фотографии, сделанные мной с помощью самого телефона Android.

22 ответов


Я бы рекомендовал вам обжать .jpg файлы как можно больше, это должно значительно уменьшить размер вашего . Такой инструмент, какPaint.NET что бесплатно должно помочь вам сделать это. Он имеет большие изменения.



другие ответы упоминают сжатие изображений. Вы также можете попробовать ProGuard сжать свой байткод. вот статья при применении ProGuard к Android-приложению.