ITOA Project – инструмент портирования iOS приложений на Android
Итак у Вас есть iPhone приложение, и Вы хотите портировать его на Android. Какие есть варианты? Если только Вы не писали приложение изначально на чём-нибудь кросс-платформенном (PhoneGap, etc), то вариант у Вас только один — всё переписать. На другом языке программирования, в другой среде, и с использованием другого API.
Или… использовать ITOA Project! Это плагин для XCode (плюс компилятор и набор библиотек), который позволит Вам перекомпилировать существующее iOS приложение под Android. Или разработать новое, но с использованием знакомой среды, языка и API.
Посмотрите на скриншот. Это простейший “Hello world”, без изменений компилирующийся и работающий на обеих платформах (код).
В этом заключается самое интересное — мы не реализовываем iOS фреймворки (UIKit, CoreGraphics, etc) с нуля, мы максимально используем API, предоставляемое Android. По сути, фреймворки являются лишь врапперами (пусть и довольно сложными) над Android API. Например, в примере выше UILabel — это враппер над android.widget.TextView, а UIButton — это android.widget.Button. Беглого взгляда на API обеих систем достаточно, чтобы увидеть, что UIFont — это Typeface, CGContext — это Canvas (+Paint, +Path), и т.д.
Конечно, у такого подхода есть и недостатки. Во-первых, это необходимость обращаться к java коду через JNI, что не добавляет приложению скорости. Во-вторых, и это важнее — несмотря на параллели между двумя системами, в них есть и неприятные отличия. Например CALayer получился однопоточным, так как android.view.View, на основе которого он сделан, работает только в главном потоке.
Однако несмотря на ограничения в реализации iOS фреймворков, мы ожидаем, что большинство приложений не потребуют никакой существенной работы для портирования. В первой версии мы сосредоточимся на играх, где дела обстоят лучше, так как OpenGL стандартен и поддерживается Android NDK.
Проект длится с января. Первые несколько месяцев мы пробовали различные варианты компиляторов / рантаймов, пока не остановились на gcc 4.2.1 из Android NDK с objc2 патчами и поддержкой исключений / рантайме от эппла (objc4). Мы также допилили OpenCFLite для работы под Android. Foundation фреймворк сделан на основе кокотрона. Всё остальное (CoreGraphics, UIKit, QuartzCore) — собственной разработки.
Несмотря на то, что в последнее время дело пошло быстрее, скорость разработки оставляет желать лучшего, и альфа версия нам только снится. Сейчас нас только двое, и нам нужен ещё один полноправный участник. Заинтересовавшихся прошу сюда.
На этом пожалуй пора закончить этот первый, ознакомительный пост. За бортом остались разные технические детали, баги и особенности обеих платформ, а также планы на (далёкое) будущее. Обо всём этом я расскажу в другой раз.
PS. Мы собираемся представить проект на Google Developer Day. До встречи!
Или… использовать ITOA Project! Это плагин для XCode (плюс компилятор и набор библиотек), который позволит Вам перекомпилировать существующее iOS приложение под Android. Или разработать новое, но с использованием знакомой среды, языка и API.
Посмотрите на скриншот. Это простейший “Hello world”, без изменений компилирующийся и работающий на обеих платформах (код).
Как это работает
Всё просто — Android NDK с поддержкой objc2 компилирует приложение в библиотеку. Затем библиотека, вместе со всеми используемыми фреймворками, упаковывается в apk. Получается обычное Android приложение. Которое, как Вы можете видеть на скриншоте, ещё и выглядит как обычное Android приложение!В этом заключается самое интересное — мы не реализовываем iOS фреймворки (UIKit, CoreGraphics, etc) с нуля, мы максимально используем API, предоставляемое Android. По сути, фреймворки являются лишь врапперами (пусть и довольно сложными) над Android API. Например, в примере выше UILabel — это враппер над android.widget.TextView, а UIButton — это android.widget.Button. Беглого взгляда на API обеих систем достаточно, чтобы увидеть, что UIFont — это Typeface, CGContext — это Canvas (+Paint, +Path), и т.д.
Конечно, у такого подхода есть и недостатки. Во-первых, это необходимость обращаться к java коду через JNI, что не добавляет приложению скорости. Во-вторых, и это важнее — несмотря на параллели между двумя системами, в них есть и неприятные отличия. Например CALayer получился однопоточным, так как android.view.View, на основе которого он сделан, работает только в главном потоке.
Однако несмотря на ограничения в реализации iOS фреймворков, мы ожидаем, что большинство приложений не потребуют никакой существенной работы для портирования. В первой версии мы сосредоточимся на играх, где дела обстоят лучше, так как OpenGL стандартен и поддерживается Android NDK.
О проекте
Увы, проект не open source. Мы так или иначе будем продавать готовый продукт, однако конкретные детали (как, сколько, будут ли бесплатные версии, etc) ещё не ясны. В проекте активно используются open source библиотеки, все модификации которых, согласно лицензиям, мы сделаем доступными после релиза.Проект длится с января. Первые несколько месяцев мы пробовали различные варианты компиляторов / рантаймов, пока не остановились на gcc 4.2.1 из Android NDK с objc2 патчами и поддержкой исключений / рантайме от эппла (objc4). Мы также допилили OpenCFLite для работы под Android. Foundation фреймворк сделан на основе кокотрона. Всё остальное (CoreGraphics, UIKit, QuartzCore) — собственной разработки.
Несмотря на то, что в последнее время дело пошло быстрее, скорость разработки оставляет желать лучшего, и альфа версия нам только снится. Сейчас нас только двое, и нам нужен ещё один полноправный участник. Заинтересовавшихся прошу сюда.
На этом пожалуй пора закончить этот первый, ознакомительный пост. За бортом остались разные технические детали, баги и особенности обеих платформ, а также планы на (далёкое) будущее. Обо всём этом я расскажу в другой раз.
PS. Мы собираемся представить проект на Google Developer Day. До встречи!
0 комментариев