Как работает Codename One?

Я ищу альтернативы для разработки для нескольких мобильных платформ и нашел Codename One, который использует Java как lingua franca, а не HTML/CSS/JS или языки сценариев.

То, что я не мог найти, это как это работает. Связано ли это с JVM с приложением для iOS и Win7 и использует Dalvik в Android? Переводит ли исходный код в native, и есть ли у нас доступ к этому исходному коду? Есть ли другая магия, учитывая, что они обещают "без компромиссов"? Какие ограничения следует знать при кодировании агностической Java?

Упреждающий удар: это вопрос о Codename One, а не о том, какую кросс-платформу я должен выбрать, или если я должен пойти на родной язык, или если я должен пойти в Интернет.

Ответ 1

Codename One использует подход, основанный на SaaS, так что это может (и, вероятно, будет) изменяться в будущем для размещения улучшенных архитектур. Обратите внимание, что Codename One также предоставляет возможность строить в автономном режиме, что означает, что корпорации, которые имеют политики, запрещающие такие облачные архитектуры, все еще могут использовать Codename One с некоторыми дополнительными служебными/сложность.

В настоящее время на Android стандартный Java-код выполняется как есть. Синтаксис Java 8 транслируется с использованием retrolambda для всех платформ, когда он используется. Это позволяет ему быть совместимым со всеми версиями Android, а также с другими портами.

В iOS Codename Один встроенный и открытый источник ParparVM, который является очень консервативной виртуальной машиной. ParparVM содержит параллельный (неблокирующий) GC и полностью написан на Java/C. Это фактически означает, что проект xcode генерируется и компилируется на серверах сборки, поэтому он эффективно, как если бы вы вручную закодировали собственное приложение и, таким образом, "будущее доказательство" для изменений, внесенных Apple. Например. с недавними 64-битными и битовыми изменениями в iOS-сборках ParparVM не нуждался в каких-либо модификациях, чтобы соответствовать этим изменениям.

В прошлом Codename One использовал XMLVM для генерации собственного кода очень похожим образом, но решение XMLVM было слишком общим для нужд Codename One.

сборки iOS скомпилированы и подписаны на Mac в облаке, используя xcode (официальный инструмент сборки Apple). Это делает их совместимыми с текущими/будущими изменениями от Apple и позволяет разработчикам использовать Windows/Linux при ориентации на iOS. Подробнее о совместимости ParparVM с iOS здесь.

В прошлом Codename One поддерживал Windows Phone с использованием транслятора С#, который основывался на XMLVM, но это был не идеальный подход. Обратите внимание, что бэкэнд XMLVM, который переводится на С#, сильно отличается от того, который ранее использовался для перевода в iOS. Codename One выбрал отказаться от старого бэкэнда, поскольку он был не таким мощным, как новый UWP-сервер, и не соответствует целям Microsoft, продвигающимся вперед и фокусировке на UWP (универсальная платформа Windows).

Для Windows 10 для настольных компьютеров и мобильных устройств Codename One использует iKVM для целевой UWP (Universal Windows Platform) и имеет открытые исходные изменения в оригинале Код iKVM в Codename Один репозиторий github.

Обратите внимание, что сборки UWP выполняются на компьютерах под управлением Windows 10 в облаке, что позволяет разработчикам использовать Mac/Linux или более старые версии Windows при создании собственных оконных приложений...

Цели JavaScript-сборки, доступные на уровне предприятия, используют TeaVM, чтобы сделать перевод статически. TeaVM обеспечивает поддержку потоковой передачи с использованием JavaScript, довольно сложным образом разбивая приложение. Для поддержки сложного пользовательского интерфейса Codename One использует HTML5 Canvas API, который обеспечивает абсолютную гибкость при создании приложений.

Для настольных сборок Codename One использует javafxpackager, так как в среде Cloud и Mac доступны узлы, а специфический для платформы тип javafxpackager не является проблемой.

Что выделяет Codename One, так это подход, который он использует для пользовательского интерфейса, где он использует "легкую архитектуру", чтобы пользовательский интерфейс мог беспрепятственно работать на всех платформах и полностью развиваться на Java. Это дополняется возможностью встроить "тяжеловесные" виджеты на место среди "lightweights". Подробнее об этом можно узнать в этом сообщении . Обратите внимание, что в настоящее время peering претерпевает некоторые улучшения и теперь поддерживает более сложные способы использования, такие как слоизация.

Легкий компонент написан полностью на Java, это позволяет разработчикам точно просматривать приложение в тренажерах и графическом дизайнере.

Codename One обеспечивает быструю производительность путем рисования с использованием собственного игрового API большинства платформ, например. OpenGL ES на iOS.

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

FYI Shai Almog, автор этого ответа, является генеральным директором Codename One.

Ответ 2

Codename one принял очень сбалансированный подход к переносимости. Я хотел бы добавить прагматичный комментарий.

Со стороны пользовательского интерфейса CN1 рисует весь свой пользовательский интерфейс на платформе, предоставляемой холстом. Он пытается имитировать внешний вид и внешний вид платформы, если вы его выбираете, но имеет такой же успех, как и у Swing с его "внешним видом", потому что собственная платформа постоянно изменяется, а "native l & f" всегда не хватает и в большинстве случаев чувствует себя не совсем правильно.

Но, если вы выберете независимый от платформы внешний вид и внешний вид (который сегодня является своего рода трендом), вы не ограничены набором компонентов по умолчанию Codenameone по умолчанию: это похоже на Swing с кросс-платформенным видом и ( "Металл" и т.д.). Это хорошо.

С языковой стороны: на iOS он скомпилирован java на C, который затем привязан к рукописному Objective-C, и он не связывает VM, только уровень переносимости. Наиболее важным здесь является тот факт, что java скомпилирован в C, а не Objective-C, что делает его быстрее, чем идиоматический Objective-C код, потому что он делает виртуальные или, чаще всего, прямые вызовы методов вместо медленной отправки сообщения Objective C. Это хорошо.

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

Одной из самых сильных сторон подхода CN1 является его эмулятор (реализованный поверх рабочего стола JavaFX), который вы используете для разработки программного обеспечения. Эмулятор использует те же API интерфейса и интерфейсов переносимости, что и на мобильных платформах, и позволяет использовать IDE для выбора для отладки. Он перезапускается быстро, и цикл редактирования-компиляции очень устойчив по сравнению с Android. Это хорошо.

Вторая очень сильная точка (основная!) - это открытый характер их библиотеки пользовательского интерфейса, всего собственного кода и байт-кода-на-переводчика. Если вы потратите некоторое усилие, вы можете избежать создания портов Android/iOS на своих фермах и развязать себя от своей конкретной версии продукта (но не из множества дополнительных услуг с добавленной стоимостью, которые они предлагают, которые не являются открытым исходным кодом!). В зависимости от вашей ситуации это может (или не может!) Быть очень хорошим для вас!

Слабая точка Codenameone - это ее менее совершенная зрелость, что означает, что вы можете легко стрелять в ногу, используя базовые компоненты пользовательского интерфейса, если вы используете их так, как они не должны были использоваться. Кроме того, это означает, что его уровень переносимости java недостаточно велик (и в нем есть дыры), чтобы охватить всех людей, и вам, возможно, придется использовать native в некоторых местах и ​​также переносить другие чистые java-библиотеки.

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

В целом, Codenameone имеет хорошую нишу в качестве кросс-платформенной платформы для нескольких классов приложений; вы также можете найти ценность в своих сервисах.