Условная компиляция и ant могут сильно упростить жизнь при разработке проекта под несколько платформ, а именно:
- сборка под все платформы за один клик;
- отдельные swf для каждой платформы;
- независимость от операционной системы (windows или osx);
- независимость от IDE.
Рассмотрим простейший пример. Что для этого понадобится:
- Apache Ant;
- AIR SDK;
- FlashDevelop;
- Плагин AntPanel (Для удобства. Не обязательно).
Открываем FlashDevelop и создаём новый проект AIR Mobile AS3 App. Или скачиваем готовый проект(без сертификатов). Открываем Project/Properties/Compiler Options/Additional Compiler Options и вписываем три строки:
Необходима папка obj. Чтобы она появилась, достаточно один раз скомпилировать пустой проект, затем правой кнопкой по проекту/Show Hidden Items. Итоговый проект будет выглядеть так:
В коде есть 4 класса и один интерфейс. Классы из пакета generators реализуют интерфейс IGenerator и возвращают строки. Каждый класс для своей платформы:
В основном классе создаётся одна из реализаций интерфейса IGenerator в зависимости от конфига, из неё вытаскивается строка и отображается текстовое поле с этой строкой:
Тут всё очень просто. Переходим к ant конфигу(папка build). В файле build.config находится список внешних параметров:
- flex.home — путь к Flex SDK или AIR SDK;
- compile.config — конфиг компиляции из папки obj;
- release.folder — папка для релизных сборок;
- debug.build — флаг дебаг сборки;
- android.cert — путь к сертификату для Android;
- android.cert.pass — пароль от сертификата для Android;
- ios.provision — путь к провижену для ios;
- ios.cert — путь к сертификату для ios;
- ios.cert.pass — пароль от сертификата для ios;
- ios.build.type — тип сборки для ios (для релизной сборки поменять на ipa-app-store).
Теперь рассмотрим по частям файл build.xml. В начале инициализация внутренних параметров и список таргетов:
Самое главное — подключение внешних параметров(build.config), затем путь к компилятору, путь к adt, а также путь к AIR конфигу и путь к Flex конфигу. Эти конфиги нужны для сбоки swf. В конце таргеты для сборки под все платформы, для сборки под Android и для сборки под ios.
Переходим непосредственно к таргетам, которые делают всю работу. Начнём со сборки swf под Flash Player:
С помощью таска jar и компилятора ASC 2.0 собирается swf с заданными параметрами. Подгружается Flex конфиг и конфиг проекта, задётся флаг дебаг сбоки и версия swf (29 соответствует FP 18 и AIR 18) и объявляются дополнительные параметры для условной компиляции. flashplayer = true, остальные — false. С помощью таска move готовый swf перемещается в папку для релизных билдов. Можно не подгружать конфиг проекта, а забить все параметры компилятора вручную.
Сборка под Android состоит из двух частей: компиляция swf и сборка apk.
В таргете —compile.for.android всё аналогично compile.for.player, только вместо Flex конфига подгружается AIR конфиг, а скомпилированный swf перемещается в папку bin. В таргете -make.android.apk собираются два apk для разных типов процессоров(armv7 и x86) и помещаются в папку для релизных сборок.
И для ios всё аналогично:
В панели проекта жмём правой кнопкой по файлу build.xml и выбираем пункт Add as Ant Build File, чтобы он появился в панели Ant (плагин Ant Panel):
Нажимает Run и ждём пару минут. Появится папка release с четырьмя файлами:
Логи и ошибки можно отслеживать в панели Output. Можно собирать как под все платформы одновременно, так и для каждой по отдельности.
На каждой платформе отображается свой текст:
Теперь при работе во FlashDevelop над особенностями для каждой платформы можно менять в свойствах проекта параметры компилятора.
Системы автоматизации позволяют очень гибко настраивать параметры сборки. Для примера возможно:
- Использовать разные ane для ios и Android, а для версии под Flash Player не использовать;
- В AIR приложениях использовать сохранение в файл, а для Flash Player — SharedObject;
- Сделать для Android версии несколько swf, а для ios — один;
- Использовать разные ресурсы для разных платформ;
- Несколько вариантов сборки под одну платформу;
- и много чего ещё.
И всё это в одном проекте с одним кодом.