Уменьшение веса APK

Перед началом

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

Рекомендую сначала прочитать статью Playing APK Golf (или её перевод). Это крайне интересно, как исследовательская работа, но абсолютно неприменимо в реальной разработке.

Читать далее «Уменьшение веса APK»

androidx

Разработчики из Google провели глобальный рефакторинг всех своих библиотек для Android. Теперь есть два корневых пакета:

  • android.* — классы из Android SDK;
  • androidx.* — классы дополнительных библиотек от Google.

В androidx переехали все библиотеки поддержки, архитектурные компоненты, библиотека multidex, библиотеки для тестирования. В общем, (почти) всё, что не входит в Android SDK. Вместе с именами пакетов поменялись и id библиотек. Все библиотеки теперь входят в общий набор под названием Jetpack.

com.android.support → androidx:

Support библиотеки существуют давно и накопилось много версий: v4, v7, v13 и т.д. Уже мало кто помнит, в какой версии что находится. Новая схема именования призвана привнести немного порядка в этот хаос.

Для примера:

com.android.support:appcompat-v7 -> androidx.appcompat:appcompat
com.android.support:recyclerview-v7 -> androidx.recyclerview:recyclerview
com.android.support:recyclerview-selection -> androidx.recyclerview:recyclerview-selection

С полным списком библиотек и классов можно ознакомиться по ссылке.

Версию support library сбросили до 1.0.0 и, теперь версии отдельных библиотек не привязаны друг к другу и могут быть обновлены отдельно. Также версия support библиотек больше не привязана к версии Android API. Последней версией со старой схемой именования станет 28.

Как обновиться:

Поддержка androidx появилась в Android Studio 3.2. Для миграции проектов на androidx в меню Refactoring появился пункт «Migrate to AndroidX»:

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

В файле gradle.properties добавятся две строки:

  • android.useAndroidX=true — включает поддержку androidx;
  • android.enableJetifier=true — включает jetifier — специальный инструмент, который подменяет зависимости в подключенных библиотеках на androidx.

Не всегда рефакторинг срабатывает корректно, иногда нужно немного поправить руками.

Переходить ли сейчас?

Спешить с миграцией на androidx не стоит, так как могут возникнуть проблемы со сторонними библиотеками, но со временем это наверняка будет исправлено. Jetifier тоже может работать некорректно, особенно в многомодульных проектах и в проектах с несколькими флейворами. Пока осуществляется поддержка support lib 28, а это примерно до выхода Android 10, можно сильно об androidx не задумываться, но посмотреть и испробовать на небольших проектах определённо стоит.

Gradle Kotlin DSL

Как понятно из названия, Gradle Kotlin DSL — это возможность писать Gradle скрипты на Kotlin. Давайте без лишних слов попробуем. Возьмём базовый проект для Android и переведём его на Kotlin DSL. Сначала нужно обновить версию Gradle до последней. На данный момент последняя версия — 4.10.2 с поддержкой Kotlin DSL 1.0RC6. Для обновления в файле gradle-wrapper.properties нужно изменить версию:и синхронизировать проект.

Теперь нужно перевести режим отображение структуры файлов на Project, так как в режиме Android файлы будут пропадать после переименования:

Изменить нужно три файла — settings.gradle и build.gradle уровня проекта и build.gradle уровня модуля app. К именам этих файлов нужно дописать .kts, чтобы получилось settings.gradle.kts/build.gradle.kts.

Читать далее «Gradle Kotlin DSL»

Простое клиент-серверное приложение для Android с нуля

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

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

 

Урок состоит из трёх частей:

  • Данные: сбор коллекции изображений и вспомогательная программа на Java;
  • Сервер: хостинг и серверный код на PHP;
  • Клиент: приложения для Android на Kotlin;
  • Дополнительно: Задания для самостоятельной работы.

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

Цель урока — объяснить в общих чертах принципы работы клиент-серверных приложений. Если вы можете установить и настроить IDE, немного знаете Java и\или Kotlin и можете самостоятельно написать простое приложение, этот урок для вас. Если же нет, боюсь, будет сложно. Объяснять постараюсь максимально подробно и понятно, но без фанатизма. Все исходники доступны на github.

Ретроспектива

Я перечитал данную статью через 10 месяцев после её публикации. За это время я многому научился и сейчас сделал бы всё по-другому. Но, пусть всё остаётся так, как написано изначально.

Читать далее «Простое клиент-серверное приложение для Android с нуля»

Конвертируем графику в ATF правильно

При конвертации png в atf на краях текстур появляются артефакты. Выглядят они так или так. Будут ли они видны, зависит от изображения и от фона, на котором оно отображается. Часто они вообще незаметны, но проблема есть и лучше её исключить изначально. Есть три варианта:

1) Экспорт сразу в atf:

TexturePacker умеет экспортировать атласы в atf, но версии 2. Если нужно использовать atf версии 3, переходим ко второму пункту.

2) Экспорт в pvr и конвертация его в atf:

Также TexturePacker умеет экспортировать атласы в pvr, который с помощью утилиты pvr2atf из AIR SDK можно конвертировать в atf. В настройках TexturePacker  — Texture/Texture Format нужно выбрать PVR(.pvr, Ver. 3) со стандартными настройками. Конвертация производится следующей командой:

pvr2atf.exe -r input.pvr -o output.atf

3) Экспорт в png, конвертация png в pvr, конвертация pvr в atf:

Не всегда есть возможность экспорта атласов в atf или в pvr, например при использовании ShoeBox или GAF. В этом случае нужно произвести две конвертации. Для начала нужно скачать PVRTexTool и установить, выбрав в списке компонентов только PVRTexTool(всё остальное очень много весит и в нашем случае вообще не нужно). После установки нужно открыть %путь_установки%/PowerVR_Tools/PVRTexTool/CLI, открыть папку вашей платформы(win или osx) и достать файл PVRTexToolCLI. С помощью этой утилиты можно конвертировать png в pvr. Этот файл можно сохранить отдельно, а саму установленную программу удалить, так как, кроме файла PVRTexToolCLI, нам от неё ничего не нужно. Конвертируем png в pvr командой:

PVRTexToolCLI -i input.png -o output.pvr -l -f r8g8b8a8 -q pvrtcbest

И возвращаемся ко второму пункту.

Конечно же, можно эти процессы автоматизировать. Делюсь своим ant конфигом для конвертации атласов и gaf.

Автоматизация сборки проекта под несколько платформ с помощью ant

Условная компиляция и ant могут сильно упростить жизнь при разработке проекта под несколько платформ, а именно:

  • сборка под все платформы за один клик;
  • отдельные swf для каждой платформы;
  • независимость от операционной системы (windows или osx);
  • независимость от IDE.

Рассмотрим простейший пример. Что для этого понадобится:

Читать далее «Автоматизация сборки проекта под несколько платформ с помощью ant»

Оптимизация графики для Starling

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

Текстурные атласы:

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

1) Обрезка прозрачных пикселей. Включается в разделе Layout — настройка Trim mode. Если у вас есть изображения с большим количеством прозрачных пикселей по краям, вы сможете сэкономить часть места в атласе. Прозрачные пиксели просто обрезаются, а при использовании текстуры из атласа — автоматически добавляются.

trim1

2) Поворот текстур в атласе. Включается флагом Allow Rotation в разделе Layout. Позволяет поворачивать элементы на 90 градусов, тем самым делает атлас максимально компактным. В атлас умещается больше элементов, а иногда уменьшается размер атласа. А чем меньше размер атласа, тем меньше он потребляет памяти. При этом от программиста не требуется ничего — текстуры при использовании отображаются без поворота. Поддерживается в Starling Framework с версии 1.5.

rotation

3) Добавление текстур шрифтов в общий атлас. Если вы используете растровые шрифты, можно добавить их png в атласы, а конфиги(fnt файлы) можно загрузить отдельно. Это позволит уменьшить количество DrawCall`ов на один (Конечно же, тут есть оговорки, но они вне темы статьи).

 

ATF

Формат текстур ATF разработан Adobe специально для использования в Stage3D. Специальные инструменты позволяют конвертировать png в .atf файлы, которые могут занимать в 3-4 раза меньше места на диске, что уменьшает итоговый вес приложения, причём без видимой для глаза потери качества. Также atf текстуры загружаются в видеопамять быстрей, чем png/jpeg и значительно быстрей рендерятся.

Для создания atf текстур есть два пути. Первый — консольная утилита png2atf, которая входит в состав Adobe Gaming SDK. Второй — TexturePacker умеет экспортировать атласы сразу в atf формат, для этого нужно в разделе Output — Texture Format выбрать .atf. Возможно, также существуют какие-то сторонние конвертеры, но я их не встречал.

Делюсь ant конфигом для автоматической конвертации png атласов в atf. Единственное, что нужно сделать — поменять пути.

 

Сжатие PNG

PNG файлы можно сжимать. Для этого существует множество инструментов, но мне больше всего нравится программа PNGGauntlet, она использует несколько разных утилит для сжатия, что позволяет добиться максимального результата. Степень сжатия зависит от конкретного изображения. Сэкономить можно от пары процентов до половины размера или даже больше. В любом случае, стоит попробовать. PNG формат устроен так, что в нём не может быть потерь качества. То есть, сжатое и не сжатое изображение будут выглядеть абсолютно одинаково и занимать одинаковое количество оперативной памяти или памяти gpu, но при этом размер сжатого файла на диске будет меньше, что уменьшит вес билда. Конечно же, лучше использовать atf формат везде, где это возможно, но некоторые изображения всегда будут в png, например иконки для ios/android и сплешскрины для ios — их стоит сжимать.

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

 

Инструменты анимации

Для Starling самым удобным и актуальным из таких инструментов является gaf. Вместо огромных покадровых анимаций он позволяет делать небольшой текстурный атлас из элементов анимации + конфиг для программной анимации. На выходе получается zip архив, который содержит по одному .png и .gaf файлу. Конечно, не для всех случаев он подходит, но при возможности стоит воспользоваться этим инструментом. Для примера — есть swf анимация:

При конвертации этой анимации в атлас для использования в Starling MovieClip получим покадровую разбивку и довольно большое изображение:

bee_atlas1

 

Если конвертировать анимацию в gaf формат, получается очень компактный атлас всего из трёх элементов:

bee_atlas2

Эти элементы автоматически собираются в анимацию.

С gaf немного сложней работать, чем со Starling MovieClip, но оно того стоит. Также есть возможность под названием GAF bundles. Это упаковка нескольких анимаций в один атлас. То есть, получается .zip файл с одним .png, но с несколькими .gaf файлами. Преимущества очевидны.

 

Gaf + ATF

Как я уже говорил, конвертер gaf выдаёт обычный zip архив с .png файлом и конфигом внутри. Можно распаковать архив, сжать png и запаковать обратно. Но лучше пойти дальше. Движок gaf для Starling поддерживает atf текстуры. Для использования этой возможности нужно распаковать архив, конвертировать png в atf и запаковать снова.

 

 Система частиц

Для Starling существует система частиц, которая позволяет вместо покадровых анимаций эффектов делать одно небольшое изображение(которое можно добавить в основной атлас) + конфиг. То есть, вместо такого атласа:

particles

будет изображение одной частицы:

particle

 

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

 

При комбинации всех перечисленных приёмов можно существенно уменьшить итоговый вес билда.

Как всегда, исправления и дополнения приветствуются.

Полезные инструменты для as3 разработчика 2

Ещё немного инструментов, которые могут быть полезны для as3 разработчика. Все для работы с графикой.

GAF (Generic Animation Format)

Сайт — http://gafmedia.com/

Инструмент для конвертации swf анимаций в растровые карты спрайтов для последующего использования с популярными движками (Starling, Sparrow, Unity и другие). Для работы со сгенерированными картами спрайтов используется библиотека для соответствующего движка. Есть веб конвертер и десктопный клиент.

gaf

DragonBones

Сайт — http://dragonbones.effecthub.com/

Инструмент для работы с 2D скелетной анимацией. Как и GAF создаёт карту спрайтов для Starling, но позволяет работать с состояниями(бег, ходьба, прыжок) и поддерживает скинирование. Состоит из двух частей: плагин для Flash Professional и библиотека для программирования. Полностью бесплатен.

Spine

Сайт — http://esotericsoftware.com/

Более продвинутый аналог DragonBones с собственным редактором.

ShoeBox

Сайт — http://renderhjs.net/shoebox/

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

BMFont

Сайт — http://www.angelcode.com/products/bmfont/

Редактор растровых шрифтов под Windows.

 

Glyph Designer

Сайт — https://71squared.com/glyphdesigner

Редактор растровых шрифтов под OS X.

 

Littera

Сайт — http://kvazars.com/littera/

Онлайновый редактор растровых шрифтов.

Rotator. Класс индикатора загрузки

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

325

Предлагаю простой и универсальный способ решения этой проблемы — класс Rotator.

Первое, что нужно сделать — зайти на сайт preloaders.net, выбрать и настроить любой индикатор. Image type обязательно APNG. После нажатия на Generate под сгенерированной анимацией появятся дополнительные параметры, нужно выбрать Download as sprites и скачать png. Preloaders.net выдаёт странные png файлы огромного веса, которые PNGGauntlet отказывается сжимать. Нужно пересохранить png через фотошоп или любой другой графический редактор, а затем сжать через PNGGauntlet. Таким образом вес png файла уменьшится в несколько раз.

Далее нужно подключить png через embed или загрузить через Loader, создать экземпляр класса Rotator и добавить его в дисплей лист:

Первый параметр конструктора — битмапдата png, о котором говорилось выше, второй — прямоугольник с размерами, указанными при создании индикатора на preloaders.net (Preloader size), x и y прямоугольника нулевые. Также у конструктора есть два необязательных параметра: autoplay:Boolean — стартовать анимацию сразу,  interval:uint — это интервал обновления анимации в миллисекундах, он определяет скорость анимации.

Методы play и pause позволяют запускать и останавливать анимацию соответственно. Когда экземпляр больше не нужен, его нужно очистить через метод dispose.

Судя по тексту, всё это довольно заморочено, но на деле на все эти действия уходит пара минут, если не слишком увлекаться настройкой ротатора на сайте.

ImageAtlas. Класс для работы с картами спрайтов

Суть:

Класс для удобной работы с множеством изображений. Вместо прикрепления большого количества изображений через embed или сборки swc/swf с графикой, используется карта спрайтов(png+xml). Аналог класса TextureAtlas из Starling Framework. Доступ к изображением происходит по имени файла нужного изображения.

Как использовать:

  • Создаём атлас для Startling/Sparrow через TexturePacker. Формат графики — png, Size: Any size(не обязательно), параметры Rotation и Trim mode нужно отключить.
  • Подключаем полученные файлы png и xml через embed или загружем через Loader/URLLoader.
  • Создаём экземпляр класса, в конструктор передаёт битмапдату и xml:

var atlas:ImageAtlas = new ImageAtlas(atlasBitmapData, atlasXML);

  •  Далее можно получать нужный тип данных через соответствующие методы: getBitmapDatagetBitmapgetSpritegetShape. Думаю, имена методов говорят сами за себя. В параметры передаётся имя нужного файла изображения (можно подсмотреть в xml). При вызове любого из этих методов создаётся BitmapData нужного изображения, а затем, в зависимости от вызванного метода возвращается  либо сама битмапдата, либо битмап с этой битмапдатой, либо спрайт с битмапом, либо Shape, в который отрисована битмапдата. В любом случае все битмапдаты кэшируются, то есть при повторном обращении к битмапдате она не создаётся заново, а используется уже созданная, не важно, через какой из перечисленных методов.
  • Когда атлас больше не нужен, его нужно очистить через метод dispose.

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

Для уменьшения веса swf можно пережать png, например через PNGGauntlet.

Возможности AS3 API, о которых не все знают

После прочтения поста от TheRabbit  я решил развить тему.

AS3 API не стоит на месте, постоянно появляются новые возможности. Но, почему-то, не все разработчики о них знают. Здесь я перечислю самые, на мой взгляд, важные из этих возможностей:

  • Уже упомянутый Native Cursor. Flash Player и десктопный AIR могут управлять курсором операционной системы. Причём очень давно. Периодически я встречаю проекты, в которых невооружённым взглядом видно, что курсор представляет собой DisplayObject. Используйте нативный курсор и почувствуете разницу. Материал на тему:  Working with native mouse cursors;
  • Обработка правой кнопки мыши доступна с версии плеера 11.2. События MouseEvent.RIGHT_CLICKMouseEvent.RIGHT_MOUSE_DOWNMouseEvent.RIGHT_MOUSE_UP;
  • Alchemy/FlasCC  — средство для компиляции C/C++ кода в .swc библиотеки, которые можно подключать к Flash/AIR проектам. Даже если вы далеки и C/C++, эта возможность может вам пригодиться, так как часто такие библиотеки будут работать значительно быстрей, чем AS3 код;
  • Нативные кодировщики JPEG и PNG. Несмотря на их существование многие разработчики продолжают использовать давно устаревшую библиотеку as3corelib. Те, кто знает о предыдущем пункте, используют библиотеки Alchemy/FlasCC. Но нативные кодировщики быстрей и того и другого. Как использовать: метод encode() класса BitmapData, классы JPEGEncoderOptions и PNGEncoderOptions;
  • Встроенная поддержка JSON. Так же, как и кодировщик изображений, нативный JSON работает быстрей любых библиотек. Класс: JSON;
  • Workers. Пусть костыльная и довольно неудобная, но многопоточность всё же есть, и в некоторых случаях её использование очень даже оправдано. Моя статья на эту тему;
  • Поддержка игровых устройств. В свои игры можно добавить поддержку игровых контроллеров, это не сложно. Класс: GameInput;
  • StageVideo. Использует аппартное ускорение для вывода видео, поддерживается как во FlashPlayer, так и в AIR(в том числе и в мобильном). Класс: StageVideo;
  • StageText. Использует нативные текстовые поля в AIR для мобильных устройств. Позволяет полноценно работать с возможностями системной клавиатуры, в отличии от обычного TextField. Класс: StageText;
  • Fullscreen с поддержкой клавиатурного ввода. С версии плеера 11.3  появился StageDisplayState.FULL_SCREEN_INTERACTIVE;
  • ATF текстуры. Adobe Texture Format — специально разработанный формат текстур для Stage3D. Быстрей других типов текстур загружается в память GPU и занимают меньше памяти. Большинство современных движков поддерживают ATF. Конвертер png2atf есть в Adobe Gaming SDK, документация по нему там же.

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

Сборка ane с помошью ant

В своём уроке по созданию Native Extension я давал довольно замороченный способ сборки ane файла,  который состоял из следующих шагов:

  • компиляция swc через Flash Pro;
  • распаковка swc через 7-zip и перетаскивание файлов по нужным папкам;
  • сборка java классов в jar библиотеку через Eclipse;
  • сборка ane через командную строку.

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

Относительно недавно я открыл для себя инструмент под названием Apache Ant и жалею, что не обратил на него внимания раньше. Он позволяет проделать все эти шаги в один клик. Если кратко, то ant — это утилита для автоматизации компиляции и сопутствующих процессов(работа с файлами, изменения кода и т.д.). Сборочный конфиг представляет собой обычный xml. Для его запуска нужно выполнить команду ant -f build.xml. Сам по себе ant довольно прост и при желании его можно освоить за один вечер, хотя и придётся подглядывать в документацию.

На примере расширения Android-Notification-Extension-ANE я кратко расскажу, как это работает.

Читать далее «Сборка ane с помошью ant»

Leap Motion

Leap MotionПару месяцев назад ко мне приехала заветная коробочка. Ещё до её приезда у меня была масса идей, что с ней делать, но после просмотра демок и попыток что-то написать самому, почти все пришлось отбросить. Работало оно ужасно. По началу я думал, что софт ещё очень сырой и нужно ждать, когда допилят, но с каждым обновлением прошивки девайс тупил всё больше. Я даже написал в техподдержку, где мне сказали, что это аппаратный баг и выслали новый leap. К его приезду вышла версия софта под номером 0.7.9. При запуске программа стала ругаться на то, что девайсу мешает слишком яркий свет, хотя на самом деле, свет у меня довольно тусклый, но практически над столом висит люстра. После выключения света всё заработало отлично — и новый девайс, и тот, который приехал раньше. Сомнительное удовольствие: выключать свет и программировать в темноте. Собственно в темноте я написал несколько демок,  некоторые из них заснял (видео под катом).

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

Есть несколько критичных минусов:

  • Девайс смотрит снизу вверх, следовательно, если один палец находится над другим, он теряется;
  • Девайс должен лежать перед клавиатурой или на клавиатуре, что само по себе довольно неудобно;
  • Боится яркого света;
  • При работе ощутимо нагружается cpu;
  • Через несколько минут активного использования руки начинают уставать.

Читать далее «Leap Motion»

Livecoding with COLT

Совсем недавно команда под предводительством Евгения Потапенко показала миру инструмент для лайвкодинга под названием Code Orchestra Livecoding Tool (COLT).  Штука получилась просто волшебная, лично я от неё в восторге. Почитать можно на официальном сайте. Пока что, есть некоторые баги, но они очень оперативно исправляются. Ещё не все возможности, которые были заявлены, реализованы. Они появятся чуть позже.

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

Моя скромная работа.