Как уменьшить размер apk файла в unity

Обновлено: 07.07.2024

Оптимизация размера APK (с инструкциями по эксплуатации Android Studio)

содержание

  • С непрерывной итерацией проекта, все больше и больше функций, размер встроенного файла apk также будет становиться все больше и больше, что приведет к увеличению сетевого трафика, используемого при загрузке в мобильной сети, а apk слишком велик, Это приводит к увеличению времени загрузки. Хотя в настоящее время мобильный телефон каждого пользователя имеет большой трафик и мало влияет на трафик пользователей, согласно статистике некоторых веб-сайтов, чем больше размер установочного пакета, тем ниже коэффициент конверсии пользователя, поэтому уменьшите apk. объем может побудить большее количество пользователей загрузить и испытать продукт; [1]
  • Сжатие размера APK также имеет очень важное значение для экономии места в памяти и памяти телефона. После сжатия размера APK при запуске приложения загружается меньше ресурсов, и память телефона будет меньше занято, и в целом работа более плавная;
  • Для некоторого программного обеспечения с богатым набором функций внутри может быть принята архитектура с несколькими подключаемыми модулями, и эти подключаемые модули также могут состоять из независимых APK-файлов. Затем, когда пользователь впервые использует соответствующую функцию подключаемого модуля после загрузки программное обеспечение, это во время холодного запуска., Если APK слишком большой, это вызовет проблему медленной загрузки, что серьезно повлияет на работу пользователя.

Вот пример релизной версии APK, созданной одной из моих собственных демо-компиляций, чтобы увидеть, что установлено в APK:


Вот подробное введение в состав APK: [2]

Вот дополнение к процессу, в котором ресурсы приложения упаковываются в APK. Цепочка инструментов сборки Android использует инструмент AAPT для обработки ресурсов. Посмотрите на следующий рисунок:


3.1 Удаление ресурсов, на которые нет ссылок

В проекте Android есть более или менее несвязанные файлы ресурсов. Android Studio имеет встроенный инструмент Lint для поиска недопустимых ресурсов. Давайте возьмем Демо в качестве примера, чтобы представить конкретные шаги операции:

шаг первый:Нажмите Analyze -> Run Inspection by Name . в верхней строке меню.


Шаг второй:Поиск неиспользуемых ресурсов


Шаг третий:Настройте и начните проверку ресурсов


После запуска инструмента Lint он отобразит список файлов ресурсов, на которые нет ссылок в проекте, а затем вы можете начать удаление этих файлов:


3.2 Использование WebP для сжатия изображений

WebP - это формат файлов изображений, который обеспечивает сжатие с потерями и сжатие без потерь (обратимое сжатие). Он является производным от формата кодирования видео VP8 и считается родственным проектом мультимедийного формата WebM. WebP был впервые выпущен Google в 2010 году. Целью было уменьшить размер файла, но достичь того же качества изображения, что и формат JPEG, в надежде сократить время, необходимое для отправки файлов изображений в Интернет. [3]

Согласно предыдущему тесту Google, сжатие без потерь WebP на 45% меньше размера файла, чем файлы PNG, найденные в Интернете. Даже если эти файлы PNG обрабатываются с помощью pngcrush и PNGOUT, WebP все равно может уменьшить размер файла на 28%. [4]

Android:Android 4.0 (уровень API 14) и более поздние версии поддерживают изображения WebP с потерями, а Android 4.3 (уровень API 18) и более поздние версии поддерживают прозрачные изображения WebP без потерь.

IOS:Текущая iOS не поддерживает webp, и я не знаю, будет ли она поддерживать его в будущем, поэтому после получения изображения в формате webp из Интернета его нельзя отобразить напрямую. Данные данных необходимо преобразовать в jpg или png для отображения.

Давайте поговорим о встроенном инструменте конвертации webp и этапах работы Android Studio:

шаг первый:Щелкните правой кнопкой мыши изображение, которое вы хотите преобразовать, и выберите преобразовать в webp .


Шаг второй:Настроить и начать конвертацию


3.3 Используйте TinyPNG для сжатия изображений

TinyPNG - это бесплатный онлайн-инструмент для сжатия изображений без потерь, эффект сжатия хороший, рекомендую всем:


4.1 Обфускация кода

Обфускация кода заключается не в том, чтобы код не мог быть декомпилирован, а в том, чтобы переименовать классы, методы, переменные и другую информацию в коде, чтобы изменить их на какие-то бессмысленные имена. В то же время он также может удалить неиспользуемые классы, методы , переменные и т. д. Таким образом, интуитивно обфускация может повысить безопасность программы, повысить сложность обратного проектирования и эффективно уменьшить размер apk. Основные функции следующие: [5]

  • Переименуйте классы, методы, переменные и другую информацию в проекте в бессмысленные короткие имена;
  • Удалите неиспользуемые классы, методы, переменные и т.д .;

Сделайте следующую конфигурацию в файле gradle в главном модуле приложения: [1]

Используйте shrinkResources для удаления, но чтобы использовать shrinkResources, вы должны сначала включить обфускацию кода minifyEnabled.

В дополнение к свойству minifyEnabled существует также свойство proguardFiles, используемое для определения правил ProGuard:

  • getDefaultProguardFile(‘proguard-android.txt') Из Android SDK tools/proguard/ Папка получает настройки ProGuard по умолчанию.
  • proguard-rules.pro Файл используется для добавления пользовательских правил ProGuard. По умолчанию этот файл находится в корневом каталоге модуля (рядом с файлом build.gradle).

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

4.2 Используйте Lint, чтобы найти бесполезный код

Как и в предыдущем случае, используя Lint для поиска ресурсов, на которые нет ссылок, нажмите Analyze -> Analyze -> Run Inspection by Name . в строке меню.

Найдите неиспользованное объявление следующим образом:



В результатах поиска будут перечислены классы / методы / переменные, на которые не было ссылок, а затем вы можете рассмотреть возможность удаления этих бесполезных кодов:


Через aapt l -v xxx.apk или unzip -l xxx.apk вы можете просмотреть детали APK:



Из рисунка выше видно, что многие ресурсы в APK Stored Для хранения эти файлы не сжимаются. Найдите следующее описание в исходном коде AAPT:

Видно, что AAPT не сжимает эти ресурсы файловых суффиксов во время обработки ресурсов.Можно ли изменить их метод сжатия для достижения эффекта похудания? Подробный метод сжатия может относиться к:Техническая команда Meituan - практика оптимизации похудения пакета приложений для Android

Как оптимизировать размер classes.dex обычно есть два направления: [2]

  • Всегда придерживайтесь хороших навыков программирования и четко понимайте размер пакета, удаляйте повторяющийся или неиспользуемый код, с осторожностью используйте сторонние библиотеки, выбирайте небольшие сторонние SDK и т. Д .;
  • Включите ProGuard для сжатия кода и используйте ProGuard для обфускации, оптимизации и сжатия кода.

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

нота:Progard может удалить какой-то бесполезный код в импортированной библиотеке, но не может удалить большие внутренние зависимости в библиотеке.

Введение в upx (степень сжатия 50%

[1] Узнайте, как оптимизировать объем APK для Android почти столбцов

[2] Техническая команда Meituan - практика оптимизации похудения пакета приложений для Android

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

Даже пустой проект в Unity весит очень много. Пустой проект под Android с настройками по умолчанию в Unity 2017.1 весит 21637 КБ. Однако его можно очень легко уменьшить до 11952\12412 КБ, указав платформу для компиляции (ARMv7 и x86 соответственно).

По аналогии с этим, можно еще попробовать еще немного уменьшить вес, выбрав Graphic API. Если выбрать OpenGLES2 вместо Auto Graphics API, можно сэкономить еще 236 КБ (11716 вместо 11952). Выгода незначительна и возможна потеря в производительности, так что этого делать я не рекомендую.

Теперь поговорим о содержимом проекта. Рассмотрим 2D игру с большим количеством спрайтов.
Есть вероятность, что многие спрайты будут симметричными по одной или нескольким осям.

Давайте проверим, есть ли автоматическое сжатие на этот случай: скомпилируем сцену с выставленным Sprite Renderer с одной текстурой, например, этой.


ARMv7 билд увеличился с 11952 КБ 12046 КБ, прибавка от пустого билда составляет 94 КБ.

Теперь подготовим половину текстуры:


Поставим два Sprite Renderer с одинаковой позицией, у правого выставим Flip X для отзеркаливания, в настройках Sprite Import Settings укажем Pivot Right для совмещения зеркальных половин. Должен получиться такой же круг как и был раньше. Скомпилируем, посмотрим размер: 12000 КБ, то есть прибавка почти в два раза меньше (48 КБ против 94). Если и есть какое то специальное сжатие, то по умолчанию оно неэффективно.

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

Найдем стандартный шейдер Unity для Sprite Renderer.

Начнем с того, что убедимся, что все работает. Создаем шейдер, копируем в него код, меняем название в коде на Sprites/HorizontalSymmetry. Теперь нужно создать материал и выбрать наш шейдер. Попробуем назначить на Sprite Renderer наш материал. Должен выглядеть как раньше.

Теперь разберем шейдер. Вся магия происходит тут:


Это функция, которая должна вернуть цвет пикселя в указанной точке. Нам даны позиция, текстура, цвет для смешения. Не стоит бояться fixed4: это просто тип данных с 4 float: r,g,b,a.

В первой строчке мы получаем цвет текстуры и после этого умножаем на некий цвет IN.color. Этот цвет — это параметр шейдера, его можно изменить в Sprite Renderer/Color.

Дальше идет домножение цвета на альфу. Связано это с тем, что прозрачность зависит не только от альфы, но и от значения rgb. Для лучшего понимания цветового пространства можно поэкспементировать:


Получаем прозрачную серую текстуру. При rgb = 1 и a = 0 будет непрозрачная белая, при rgb = 0 и a = 0 полностью прозрачная, rgb = 0 и a = 1 будет черным непрозрачным.

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

Эту задачу можно решить в лоб:


Если немного подумать, то можно сделать решение короче, красивей, быстрей:


В качестве упражнения предлагаю читателю решить эту задачу для вертикальной и двойной симметрии.

Иногда могут быть артефакты прозрачности, связанные с тем, что спрайт рисуется по умолчанию по определенному контуру (мешу). Лечится так: Sprite/Import Settings/Mesh type = Full Rect.

Этот способ уже теоретически способен сократить размер используемых текстур в 4 раза. Проверим, как поведет себя билд при четверти спрайта (используя шейдер двойной симметрии). Размер билда — 11978 КБ против 12000 (половина спрайта). Напомню, что пустой проект весил 11952 КБ. То есть, опять получилось уменьшение прибавки почти в два раза (в 3.6 от изначального круга без оптимизации).

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



Теперь дело за шейдером. Наша задача — сделать из линии круг.

Можно поступить так: найти удаленность текущей точки от центра и использовать координату текстуры с позицией (1-distance*2, 0). Умножение на два происходит потому что максимальное расстояние от центра будет 0.5, не 1. Вычитаем из единицы потому что текстура подготовлена слева (край круга) направо (центр круга).


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

Создаем материал, поставим его в Sprite Renderer, поставим Sprite = line, смотрим. Изображение будет очень узким, так что нужно растянуть спрайт (выставить большое значение Trasnform.Scale.y). Должен получиться исходный круг\овал.

Проверим размер билда с новым шейдером и кругом из полоски: получилось 11957 КБ. То есть прибавка от пустого проекта составляет всего лишь 5 КБ, и это включая размер шейдера.

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

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

Лог редактора сразу после сборки

Лог редактора сразу после сборки

Лог предоставляет сводку по ассетам, разбитым по типам и затем список отдельных ассетов, отсортированных по размеру. Как правило, текстуры, музыка и видео занимают больше всего места, в то время как скриптами, уровнями и шейдерами часто можно пренебречь. Учтите, что File Headers (заголовки файлов) в сводке - это не ассеты как таковые. Заголовки обычно добавляются к “сырым” файлам ассетов для сохранения настроек и ссылок. Обычно заголовки не значительно влияют на размер файлов ассетов, но значение может оказаться и большим, если у вас много больших ассетов в папке Resources.

Лог помогает выявить ассеты, которые вы, возможно, пожелаете удалить или оптимизировать, но вам стоит учитывать следующее перед тем как начать работу:

Unity перекодирует импортированные ассеты в собственные внутренние форматы, поэтому выбор исходного формата ассета не имеет значения. Например, если у вас в проекте есть Photoshop текстура с множеством слоёв, они будут объединены, а сама текстура будет сжата перед сборкой проекта. Экспорт текстуры в виде PNG никак не повлияет на размер сборки, так что вам следует придерживаться форматов, наиболее удобных для вас при разработке.

Unity отсеивает большинство неиспользуемых ассетов во время сборки, так что вы ничего не выиграете, вручную удаляя ассеты из проекта. Ассеты, которые не подвергаются отсеиванию - скрипты (они в любом случае занимают очень мало места) и всё, что находится в папке Resources (т.к. Unity не может определить какие из них будут использоваться, а какие - нет). Помня об этом, вам следует убедиться, что в папке Resources находятся только те ассеты, которые действительно нужны во время игры. Кроме того, вместо хранения ассетов в папке Resources, вы можете выбрать AssetBundles для их динамической загрузки, чтобы ещё больше снизить размер сборки.

Советы по уменьшению размера сборки

Текстуры

Зачастую, больше всего места в сборке занимают текстуры. Первое, что следует сделать - использовать сжатые форматы текстур (DXT (для настольных платформ ) или PVRTC) там, где это возможно.

Если это не приведёт к уменьшению размера, попробуйте снизить качество текстур. Хитрость тут в том, что вам не нужно менять исходный контент. Просто выберите текстуру в окне Project и измените значение свойства Max Size (максимальный размер) в настройках импорта. Можно приблизить объект, на котором используется выбранная текстура, и подобрать значение Max Size так, чтобы вы не замечали ухудшения качества текстуры в окне Scene ( Scene View ).

Изменение максимального размера текстуры повлияет лишь на разрешение текстуры в игре, и не изменит ваш ассет текстуры

Изменение максимального размера текстуры повлияет лишь на разрешение текстуры в игре, и не изменит ваш ассет текстуры

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

Сжатие Потребление памяти (байты/пиксель)
Standalone & WebGL
RGB Crunched DXT1 variable
RGBA Crunched DXT5 variable
RGB Compressed DXT1 0.5 bpp
RGBA Compressed DXT5 1 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp
iOS
RGB Compressed PVRTC 2 bits 0.25 bpp (байты/пиксель)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp
Android
RGB Compressed DXT1 0.5 bpp (байты/пиксель)
RGBA Compressed DXT5 1 bpp
RGB Compressed ETC1 0.5 bpp
RGB Compressed PVRTC 2 bits 0.25 bpp (байты/пиксель)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

Формула занимаемого на диске места такова: ширина * высота * bpp. Если вы используете мипмапы, тогда размер на диске будет примерно на треть больше, чем при обычном единичном изображении.

По умолчанию, Unity сжимает все текстуры при импорте. Для ускорения рабочего процесса в редакторе, вы можете отключить сжатие в настройках редактора (флажок Compress Assets on Import), но при этом текстуры всё равно будут сжиматься при сборке, независимо от этой настройки.

Меши и анимации

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

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

Учтите, что сжатие меша снижает только физических размер файлов, но не объём используемой памяти при выполнении программы. А вот снижение количества ключевых кадров в анимации (значение Keyframe reduction у свойства Anim. Compression в настройках импорта) уменьшает и физический размер файлов, и потребление памяти во время выполнения программы, потому рекомендуется всегда оставлять эту настройку включенной.

DLL файлы

По умолчанию, Unity включает в сборку только эти DLL файлы:

  • mscorlib.dll
  • Boo.Lang.dll
  • UnityScript.Lang.dll
  • UnityEngine.dll

При работе над игрой рекомендуется избегать использования зависимостей из System.dll или System.Xml.dll. По умолчанию, Unity не включает эти библиотеки в к сборку проигрывателя, но если в своём коде вы используете их классы, библиотеки будут включены в сборку. Эти DLL файлы добавят к размеру сборки проигрывателя около одного мегабайта. Если в вашей игре требуется работа с XML, вы можете использовать библиотеки вида Mono.Xml.zip в качестве небольшой по размерам альтернативы системным библиотекам. Хоть большинство дженерик контейнеров содержится в mscorlib, но Stack<> и некоторые другие находятся в System.dll, так что постарайтесь избегать их использования по возможности.

Как вы можете видеть, Unity включает System.Xml.dll и System.dll, при сборке проигрывателя

Как вы можете видеть, Unity включает System.Xml.dll и System.dll, при сборке проигрывателя

Является ли минимальный размер APK приложения Android, созданного Unity, 8 МБ? Я строю пустой проект, но все равно получаю 8 МБ. Есть ли способ уменьшить размер APK?

3 ответа

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

В моем приложении android я использую более 20 файлов .mp3 , которые хранятся в папке raw. Таким образом, проблема заключается в том, что он вызывает огромный размер файла apk. Есть ли какой - нибудь способ уменьшить размер файла .apk, уменьшив размер файла .mp3? OR может потребоваться.

В Unity 5.6.0f3 я создал простую программу "Hello world" и создал файл APK, сначала он потребляет 21.2 MB, но чтобы уменьшить размер, вы должны выполнить следующие действия:

Unity 5.6.0f3: Настройки плеера > другие настройки > оптимизация > Совместимость API уровень

Unity 2018.3.6f1: Настройки плеера > Другие настройки > Конфигурация > Уровень совместимости API

Unity 5.6.0f3: Настройки плеера > другие настройки > фильтр устройств > ARMv7

Unity 2018.3.6f1: Настройки плеера > Другие настройки > Конфигурация > Целевые архитектуры

ARM и x86-это архитектуры процессоров. x86 принадлежит Intel, в то время как ARM используется различными компаниями и широко используется, поэтому нет необходимости выбирать обе архитектуры.

Unity 5.6.0f3: Настройки плеера > другие настройки > путь рендеринга > Устаревшая вершина

Unity 5.6.0f3: Настройки плеера > другие настройки > Оптимизация > Уровень зачистки > Использование micro mscorlib

Облегченная версия mscorlib будет использоваться за счет ограниченной совместимости.

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

После применения всех этих изменений он становится 10.4 MB.

Для уменьшения размера IPA:

В Xcode есть несколько флагов, которые вам нужно установить,

Настройки сборки-> Включить исключение Objective-C-Да

Настройки сборки-> Включить BitCode-Нет

Настройки сборки-> Сжатие PNG файлов -Нет

В настройках плеера, Фильтр устройств, выберите только
ARMv7 (В последней версии unity (2018.1) это можно найти в качестве других настроек, Целевой архитектуры)

Также прокрутите вниз, установите уровень зачистки, чтобы использовать Micro mscorlib

Они должны еще больше уменьшить размер

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

Я разработал простое приложение Android. Его размер APK составляет 8 МБ. Кто-нибудь может сказать мне, как уменьшить размер APK?

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

Похожие вопросы:

Я работаю над игровым проектом android с движком unity Engine (версия 5.2.0f3). Мой вопрос таков: пустой скомпилированный проект имеет размер файла 18 Мб APK. Почему и как я могу уменьшить размер ?

Когда я создаю новое приложение android с помощью Android Studio и экспортирую файл APK, размер полученного файла составляет 914 КБ. Я не добавлял никакого кода или ресурсов. Как я могу довести.

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

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

В моем приложении android я использую более 20 файлов .mp3 , которые хранятся в папке raw. Таким образом, проблема заключается в том, что он вызывает огромный размер файла apk. Есть ли какой -.

Я разработал простое приложение Android. Его размер APK составляет 8 МБ. Кто-нибудь может сказать мне, как уменьшить размер APK?

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

В настоящее время я использую Unity 2013 p3. Проблема в том, что когда я строю свой проект в android, размер приложения apk составляет около 29 мб. А размер установленного приложения в android.

[Введите описание изображения здесь] [1] я создал новый проект Unity и импортировал плагин Vuforia из unity 2018.1, а когда BUILD APK, размер файла составляет 36 МБ без каких-либо активов. Когда я.

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


А теперь давайте поговорим об оптимизации текстур и других вещах, помогающих сделать наш билд меньше (вернее упихать в заветные 20 метров). На официальной страничке unity3d описано несколько приемов как сэкономить размер приложения этими способами. Итак, предлагается следующее.
Оптимизация используемых текстур включает в себя в первую очередь использование сжатых форматов текстур там где только возможно. Если сжатие не уменьшит занимаемый размер, то можно попробовать уменьшить размер текстуры. Что в принципе логично: зачем вам текстура размеров 2048, если у вас экран 1024х768 и она занимает места не больше, чем экран?


В новом unity3d (3.4) настройка текстуры выглядит как изображено выше. Итак, Aniso Level, Filter Mode, Wrap Mode оставляем без изменений. Начнем с Texture Type. Выставляем Advanced и радуемся: здесь можно полностью настроить текстуру как нашей душе угодно (и как позволяет редактор unity3d). Non power of 2 выставляем в ToSmaller или ToLarger. Generate Cubemap в моей 2d-игре не нужна, отключил, впрочем как и Alpha from grayscale тоже не пользуюсь за ненадобностью. Отключите Generate Mip Maps - это также позволит сэкономить на размере текстуры. Normal Map и Light Map отключаем, если не надо. Максимальный размер текстуры выставляем как можно более меньший. Что по поводу сжатия, то тут надо экспериментировать. Обычно наилучшим эффектом обладает сжатие DXT5.

Далее приведу таблицу соотношения размеров изображения в зависимости от типа сжатия (взято из того же источника):

СжатиеЗанимаемая память
RGB Compressed DXT1 0.5 bpp (bytes/pixel)
RGBA Compressed DXT5 1 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

iOS
RGB Compressed PVRTC 2 bits 0.25 bpp (bytes/pixel)
RGBA Compressed PVRTC 2 bits 0.25 bpp
RGB Compressed PVRTC 4 bits 0.5 bpp
RGBA Compressed PVRTC 4 bits 0.5 bpp
RGB 16bit 2 bpp
RGB 24bit 3 bpp
Alpha 8bit 1 bpp
RGBA 16bit 2 bpp
RGBA 32bit 4 bpp

Для iOS, как мы видим, выгоднее использовать PVRTC 2 bits с альфа-каналом или без (все зависит от типа вашей текстуры). Однако, искажения, которые могут присутствовать в данном типе сжатия могут кого-то не устроить, тогда следует перейти на другой тип сжатия. Выбор за вами, экспериментируйте.

Также можно оптимизировать меши и анимации. Сжатие может быть включено в настройках импорта меша (Mesh import settings).

Еще возможно уменьшить количество dll, включенных в ваш проект. Это я рассматривал в прошлой статье по оптимизации (см. оптимизация, часть 1).

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

Спасибо за внимание, если что-то непонятно или недосказано с вопросами и предложениями прошу в комментарии.

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