Jump to content

Yaroslav Brovin

Administrators
  • Posts

    2,565
  • Joined

  • Last visited

  • Days Won

    647

Everything posted by Yaroslav Brovin

  1. Для разных версий делфи используются разные сборки Android и iOS. Если вы не используете 11 Delphi, то можете полностью снять галку c 11 версии
  2. Нет. Мы поддерживаем только 10.4.2 и 11.+ на текущий момент. Мы используем сборку iOS приложений в IDE, старые версии Delphi просто не поддерживают сборку с новыми версиями iOS/XCode.
  3. Лучше использовать физическое устройство. Потому что отладка, запуск и работа приложения будет быстрее, чем при использовании эмуляторов. Так же для эмуляторов не работает отладка из Delphi, это не связано с FGX Native. В интернете есть решения, как ее добавить поддержку отладки, но это лишние танцы с бубнами. Проще купить недорогой Андроид телефон и работать с ним.
  4. Добрый день, Нужно настроить профиль Android SDK в самой среде: Tools -> Options -> Deployment -> SDK Manager. Можно: Либо доверить установку профиля самой IDE. В этом случае, должны скачаться требуемые Android SDK/NDK. Либо установить все в ручную
  5. Download: The distributive is available by request only. Release date: 23 October 2022 Improvements 🙌 TfgLottieImage Added start TfgLottieImage.OnAnimationStarted and stop TfgLottieImage.OnAnimationStopped animation playback events. The reason for the occurrence of the event is passed in the event arguments. Bug Fixes 🐛 The Gradle work was fixed on 10.4. FGX-235 TfgCollectionView - scroll by inertia (Android). FGX-236 TfgTimer raises exception after stopping (Android). FGX-238 TfgMemo.HitTest doesn't work (Android). FGX-240 TfgGoogleSignInAuthentication sample is broken (Android). FGX-243 Faulty version of SoLoader (Android). Sometimes the TfgLottieImage.IsAnimationLoaded property may return an incorrect value. Animation auto-play did not work in TfgLottieImage (Android). Animation automatically played ignoring the TfgLottieImage.AutoPlay property (iOS). Settings (speed, loop, etc.) were lost when changing animation in TfgLottieImage (iOS).
  6. Скачать: Релиз доступен только по запросу. Дата релиза: 23 октября 2022 Улучшения 🙌 TfgLottieImage Добавлены события запуска TfgLottieImage.OnAnimationStarted и остановки TfgLottieImage.OnAnimationStopped проигрывания анимации. В аргументах событий передается причина наступления события. Исправление ошибок 🐛 Исправлена работа Gradle на 10.4. FGX-235 TfgCollectionView - скролл по инерции (Android). FGX-236 TfgTimer - ошибка после остановки (Android). FGX-238 Не работает TfgMemo.HitTest (Android). FGX-240 Поломался TfgGoogleSignInAuthentication (Android). FGX-243 Неисправная версия SoLoader (Android). Иногда свойство TfgLottieImage.IsAnimationLoaded могло возвращать некорректное значение. Не срабатывало автоматическое проигрывание анимации TfgLottieImage (Android). Анимация автоматически проигрывалась игнорируя свойство TfgLottieImage.AutoPlay (iOS). При смене анимации терялись настройки у TfgLottieImage (скорость, зацикливание и тд) (iOS).
  7. Это не связано с версией библиотеки:
  8. Добрый день, Нижняя версия так и осталась - 5.0. Есть какие-то проблемы с запуском? Если есть, прикрепите пожалуйста stacktrace и лог с устройства.
  9. Could you show me PATH enviroument value?
  10. Hello, Do you use Virtual Machine?
  11. Доброго дня, уважаемые пользователи FGX Native. Наши клиенты делают интересные проекты на базе нашего продукта, однако, к сожалению, об этом знаю только я в результате получения обратной связи по FGX Native. Мне кажется, что всем было бы интересно узнать о таких приложениях, о применяемых возможностях FGX Native и об использованных технических решениях. Сегодня я начну с обзора приложения, которое первоначально задумывалось, как приложения для каршеринга. Однако, в ходе разработки, области применения гораздо расширились за счет универсальности разработанного решения. Но обо всем по порядку. Далее приведен текст автора @r3h0soft. Перед нами стояла задача реализовать программный комплекс мониторинга за ГЛОНАСС устройствами, который бы включал возможности: Отслеживание местоположения устройств Мониторинг телеметрии Формирование различных отчётов за выбранный период времени И т.д. В комплекс входило так же и мобильная разработка, при которой стоило преимущественно выбрать среду разработки с лаконичными и понятным кодом имеющим в комплекте кроссплатформенной реализации. Выбор остался за Delphi. Мобильное приложение должно было отвечать всем требованиям на текущий момент что касаемо UI, отзывчивый интерфейс, анимации, поддержкой API и т.д. Но если с реализацией бэкенд всё было прозрачно, то неотъемлемой частью разработки UI было не всё гладко с использованием FireMonkey. Выбор пал на FGX Native, который предлагает все инструменты для простой и лёгкой разработки и решению поставленных задач. В FGX Native реализовано собственное уникальное решение реализации UI, за основу взята система позиционирования FlexBox. С его помощью можно на лету, только через свойства компонента, реализовать UI любой сложности, которое будет одинаково выглядеть при любом разрешении устройств без единой строчки кода. Этот подход значительно ускорил процесс разработки и позволил сосредоточится на построении логики приложения, не загромождая код, вычислениями позиционирования элементов интерфейса. Карты Данный проект сложно представить без отражения мониторинга в режиме реального времени. За основу мы взяли компонент карт TfgMap с возможностью отображать маркеры, полигоны, географические зоны, строить маршруты, используя линии с большим количеством объектов. Удивила скорость работы компонента и его плавность. Одной из приятных функций для нашего проекта оказалась стилизация карт. Это позволило нам настроить внешний вид карты, чтобы он не выбивался из общего дизайна интерфейса. Одной из задач при использовании карт было построение маршрута, реализовав парсер точек по заданному диапазону времени с необходимой информацией о состоянии объекта и его положении GPS, используя фильтр настойки для разграничения маршрута использовали состояния "простоя" объекта, и иные события при которых объект не выполнял движения. Так мы получили точный список точек перемещения и реализовали отображение через поли линии. Через свойства реализации в FGX Native, мы смогли стилизовать под свои нужды, зная определенные участки состояния объекта смогли через маркеры объектов вывести определенные состояния (к примеру, участки превышения скорости). Хорошим моментом послужило что точками можно взаимодействовать присвоив им ID, так можно получить дополнительную информацию в любом участке трекера просто выбрав точку на карте. Конечно, в будущем очень хотелось бы использовать некую сущность для маркера имеющую стиль, для наполнения его своими объектами как в TfgCollectionView и отображения определенных маркеров при определенных состояниях. Сами маркеры добавляются легко через менеджер объектов. Списки Не обошлось и без списков, следовало подгружать объекты в стилизованные карточки одного списка, не нагружая при этом систему, с плавность отрисовки и высокой скоростью. Для решения данной задачи взят TfgCollectionView. Этот компонент отвечает всем требованиям и прост как и все другие решения библиотеки в освоении. Мы использовали списки, как для формирования меню навигации, так и для отображения маршрутов, истории поездок и т.д. Чтобы не нагружать приложение разными формами, мы использовали выдвигаемые панели сбоку TfgDrawerLayout и снизу TfgBottomSheetLayout. С помощью этих компонентов решена задача быстрого доступа к данным истории телеметрии при этом не нагружая интерфейс и проект дополнительными формами. Не обошлось и без списков, следовало подгружать объекты в стилизованные карточки одного списка, не нагружая при этом систему, с плавность отрисовки и высокой скоростью. Для решения данной задачи взят TfgCollectionView. В списках мы добавили нужные нам стили объектов списка, что позволило генерировать нужный по событию изменяя только имя стиля, это удобно. Единственное чего не хватило, так это свайпа по элементам списка (лево/право). В общем и целом, этот компонент отвечает всем требованиям и прост как и все другие решения библиотеки в освоении. Мы использовали списки, как для формирования меню навигации, так и для отображения маршрутов, истории поездок и т.д. Чтобы не нагружать приложение формами, мы использовали выдвигаемые панели сбоку TfgDrawerLayout и снизу TfgBottomSheetLayout. С помощью этих компонентов решена задача быстрого доступа к данным истории телеметрии при этом не нагружая интерфейс и проект дополнительными формами. Анимация Чтобы оживить интерфейс и порадовать пользователя внешним видом было принято решение встроить готовые сценарии анимации. В одном из обновлений FGX Native появилась поддержка продвинутых анимаций Lottie. Мы нашли готовые примеры анимации и просто встроили их в пару кликов. Таким образом получился такой вот симпатичный экран: AddingDriver.mp4 Так же имеется и конструктор анимации для самих компонентов, мы использовали анимацию тряски для неправильного ввода пароля и анимацию появления для уведомлений. Сканер штрих кодов В ходе работы с приложением, пользователю необходимо выполнить регистрацию ГЛОНАСС устройства. Можно было бы ограничится вводом в ручную серийного номера, указанного на устройстве. Однако, мы воспользовались готовым сканером штрих кодов TfgBarcodeScanner и камерой TfgCamera и сделали эту процедуру автоматической. Уведомления и монетизация Любое приложение каршеринга - это контроль за местоположением транспортного средства. И в нашем случае это не исключение. Нам нужно было уведомлять пользователя при определенных событиях телеметрии устройства (вход/выход из геозоны, состояния устройства, ДТП, включения зажигания). Для этого мы использовали локальные уведомления. А вот для системных уведомлений, таких как "обновление приложения" или "необходимости оплаты" легко реализованы с помощью Push уведомлений на базе FGX и Firebase. Кстати, среди поставляемых примеров, вы найдете много готовых решений и примеров возможностей библиотеки. Хотите иметь возможность монетизации в приложении будь то подписка или продажа, для этого есть готовые компоненты оплаты, как для Android так и iOS. Реализация авторизации Как и любое приложение, работающее с пользователя, нам необходимо было организовать процесс авторизации. Мы использовали Firebase, реализация выполнена с помощью FB4D библиотеки, в FGX имеется возможность легко реализовать авторизацию и с помощью Google Sign, Facebook, VK, AppleID, что не может не радовать. Основная база крутится на PostgreSQL, используя штатные компоненты FireDAC. Общение построено с использованием REST API, чьим ответственным выступил DelphiMVCFramework фреймворк. Как видно, FGX Native не конфликтует с различными сторонними решениями, что позволяет расширять возможности разработки приложений любой сложности и поставленных задач. Bluetooth Не обошлось и без штатных задач управления устройством с помощью Bluetooth , мы использовали стандартные средства Delphi RTL для синхронизации и управления модулем через Bluetooth. Итог Это лишь малая часть которой хотел поделиться, возможности FGX Native для нас очень обширны, мы реализовали разные сложные проекты с его помощью, о которых я расскажу напишу в следующих статьях. Среди таких: Мониторинг за сотрудниками (курьерами, работниками, водителям где устройством мониторинга выступает мобильное приложение на FGX с использованием сервисов фоновой локации и состоянием устройства, мониторинга задач и управления через Bitrix), личный кабинета клиента микрофинансовой компании, личный кабинет клиентов интернет провайдера, управление модулем автопилота для лодок fishboat по Bluetooth и многое другое. FGX Native - это лучшее решение для нас!
  12. Download: The distributive is available by request only. Release date: 9 November 2022 Warning 🚨 This is an experimental build with a lot of changes. Despite the fact that we have successfully tested it on large projects of some of our clients, we want to be sure of its stability. Therefore, these releases can be used to check your projects on this version. If you find any problems, be sure to let us know. Within a few iterations of fixing your feedback, we will release a stable version. Be sure to make a backup of your projects. In this release, the migration to AndroidX and Android 13 is underway. In this regard, all header files of the Android API have been updated. Some modules have been removed, some types have been moved to new header modules. For details, see the corresponding section below. Starting with this release, all FGX Native applications are targeted at targetSdkVersion = 33. This value cannot be decreased. If you are using Firebase Push-notifications on 10.4, you need to update the Firebase settings. For details, see the corresponding section below. New ✨ The new build system of Android applications An alternative build system has been integrated, which is now used by FGX Native to build Android applications. This innovation speeds up the assembly of applications several times. Internet access is required for use. It may be necessary to update the JDK version (if the build does not work for you). However, Oracle JDK 19 is not yet compatible with the build system. Details. AndroidX FGX Native was migrated from Android Support Library to the latest version of AndroidX. Details. AdMob The new demo samples were added: "Components" -> "TfgBannerAd" -> "Sample of showing advertising banner" "Components" -> "TfgInterstitialAd" -> "Interstitial advertising" Improvements 🙌 Accelerating the launch of Android applications In this release, we have accelerated the launch of Android applications. Details. Project migration The process of updating old FGX Native projects to current versions has been improved. Now, if the migration process involves updating the project template files, then the IDE will display an update window with an editor to the user, where you can migrate your changes. If you want to do this later, click the ignore button, in which case the IDE will save the new template in the root of the project with the "new" postfix. Supporting Android Libraries Now you can use AAR files in the wizard for managing third-party Android libraries. The wizard is accessible via the IDE's main menu "Project" -> "Android FGX Libraries". Updating Android API All Android API header files: Android.Api.*.pas have been updated to "Android 12L" (Api Level = 32). Deleted: Android.Api.ListView Android.Api.Supports Android.Api.Supports.Utils Android.Api.Supports.CoordinatorLayout Android.Api.Supports.TabLayout Android.Api.Supports.Widgets Added: Android.Api.AndroidX AdMob The AdMob library has been updated to 21.2.0. In addition, the header file Android.Api.PlayServices has been updated. Firebase Updated Android version Firebase to 23.0.8 . The header file Android.Api.Firebase.Messaging has been completely updated to the latest version. Now you can send a link to the image in a push notification. In this case, the notification will be displayed on the device with an image. The new version of Firebase requires additional project settings. These settings are in "Project Options" -> "Services" in Delphi 11.0. However, these settings are not in Delphi 10.4. If you are using 10.4, then you need to manually add the missing keys to the dproj file. In the future, we will have our own project setup wizard. But for now it is necessary to perform: Download new "google-services.json" file from Firebase console. Open it in text editor and remember followed values: "client" -> "client_info" -> "mobilesdk_app_id" "project_info" -> "project_id" Open "dproj" project file in text editor and find "PropertyGroup" XML node, which contains node Android_ApiKey. Add followed new nodes to this node with the valuesfrom "google-services.json" <Android_ProjectId>project_id</Android_ProjectId> <Android_AppId>mobilesdk_app_id</Android_AppId> Save dproj file and reopen project in IDE. TfgBarcodeScanner Now we are using MLKit version 18.1.0. Java2Delphi In the new version "Java2Delphi 2.4" it is now possible to use AAR libraries. To do this, you need to specify them in the configuration file in the "aars" branch. "aars": [ "$(FGX)\\Libs\\Android\\fgx.admob.aar" ] In addition, the generator is now able to mark obsolete members of the Android API class and make a comment about which version of Android the member was first introduced or outdated. function isConvex: Boolean; deprecated 'Deprecated in 30'; function addWhitelistedRestrictedPermission(const AArg0: JString; const AArg1: JString; const AArg2: Integer): Boolean; // Introduced in 29'; { constants } property colorMode: Integer read _GetColorMode write _SetColorMode; // Introduced in 26'; In this release, we have accelerated the launch of Android applications, the acceleration is partly due to the generated header files. This means that if you generated your header files using our tool and continue to use them, the optimization will not apply to the old header files. If you want to apply optimization to them, then you need to regenerate them again. Together with the new version, we deliver an updated file containing a description of the entire Android API 32 version, and a config template. If you have used the utility before, we recommend updating your "config.json". The new version of the utility also now intelligently handles cyclic dependencies between Java classes. Read the details at the link below. Details of Java2Delphi update Usage details of Java2Delphi Delivering AAR instead of JAR for FGX Native Now we are delivering full-fledged FGX Native AAR libraries in the installer instead of JAR.
  13. Скачать: Релиз доступен только по запросу. Дата релиза: 9 ноября 2022 Внимание 🚨 Это экспериментальная сборка с большим количеством изменений. Не смотря на то, что мы успешно протестировали ее на крупных проектах некоторых наших клиентов, мы хотим быть уверены в ее стабильности. Поэтому данные релиз можно использовать для проверки работоспособности ваших проектов. Если вы найдете какие-либо проблемы, обязательно дайте нам знать. В течении нескольких итераций исправлений ваших замечаний, мы выпустим стабильную версию. Обязательно сделайте бекап ваших проектов. В этом релизе осуществляется переход на AndroidX и Android 13. В связи с этим были обновлены все заголовочные файлы Android API. Часть модулей была удалена, часть типов была перенесена в новые заголовочные модули. Подробности смотрите ниже в соответствующем разделе. Начиная с этого релиза все FGX Native приложения нацелены на TargetSDKVersion = 33. Понизить это значение нельзя. Если вы используете Firebase Push нотификации на 10.4 вам необходимо выполнить обновление настроек Firebase. Подробности смотрите ниже в соответствующем разделе. Новое ✨ Новая система сборки Android приложений Интегрирована альтернативная система сборки, которая теперь используется FGX Native для сборки Андроид приложений. Данное нововведение ускоряет сборку приложений в несколько раз. Для использования требуется наличие доступа к интернету. Возможно, может потребоваться обновление версии JDK (если у вас не заработает сборка). Однако, Oracle JDK 19 пока еще не совместима с системой сборки. Подробности. AndroidX FGX Native переведена с Android Support Library на последнюю версию AndroidX. Подробности. AdMob Добавлены новые демо-проекты: "Компоненты" -> "TfgBannerAd" -> "Пример отображения рекламного баннера" "Компоненты" -> "TfgInterstitialAd" -> "Межстраничная реклама" Улучшения 🙌 Ускорение старта Android приложений В этом релизе мы ускорили запуск Android приложений. Подробности. Обновление проектов Улучшен процесс обновления старых FGX Native проектов до актуальных версий. Теперь, если процесс миграции затрагивает обновление файлов шаблонов проекта, то среда отобразит пользователю окно обновления с редактором, где вы можете выполнить перенос ваших изменений. Если вы хотите сделать это позднее, нажмите кнопку "игнорировать", в этом случае среда сохранит новый шаблон в корне проекта с постфиксом "new". Поддержка Android-библиотеки Теперь в мастере управления используемыми сторонними Android-библиотеками можно использовать AAR файлы. Мастер доступен через главное меню IDE "Project" -> "FGX Android Libraries". Обновление Android API Все заголовочные файлы Android API: Android.Api.*.pas были обновлены до "Android 12L" (ApiLevel = 32). Удалены: Android.Api.ListView Android.Api.Supports Android.Api.Supports.Utils Android.Api.Supports.CoordinatorLayout Android.Api.Supports.TabLayout Android.Api.Supports.Widgets Добавлены: Android.Api.AndroidX AdMob Используемая Android библиотека AdMob обновлена до 21.2.0. Помимо этого обновлен заголовочный файл Android.Api.PlayServices.AdMob. Firebase Обновлена Android версия Firebase до 23.0.8. Заголовочный файл Android.Api.Firebase.Messaging полностью обновлен до последней версии. Теперь можно передавать в push-уведомлении ссылку на изображение. В этом случае, на устройстве в уведомление будет отображено с изображением. Новая версия Firebase требует дополнительные настройки проекта. Эти настройки есть в "Project Options" -> "Services" в Delphi 11.0. Однако, этих настроек нет в Delphi 10.4. Если вы используете 10.4, то вам необходимо вручную внести недостающие ключи в dproj файл. В будущем у нас появится свой мастер настройки проектов. Но пока необходимо выполнить: Скачать с Firebase консоли новый "google-services.json" файл. Открыть его в текстовом редакторе и запомнить следующие значение в JSON файле по путям: "client" -> "client_info" -> "mobilesdk_app_id" "project_info" -> "project_id" Открыть в текстовом проектный файл "dproj" и найти узел XML "PropertyGroup", который содержит узел Android_ApiKey. Добавить в этот узел два новых узла со значениями из "google-services.json" файла: <Android_ProjectId>project_id</Android_ProjectId> <Android_AppId>mobilesdk_app_id</Android_AppId> Сохранить проект и переоткрыть его в IDE. TfgBarcodeScanner Теперь мы используем MLKit версии **18.1.0** Java2Delphi В новой версии "Java2Delphi 2.4" теперь можно использовать AAR библиотеки. Для этого их нужно указать в конфигурационном файле в ветке "aars". "aars": [ "$(FGX)\\Libs\\Android\\fgx.admob.aar" ] Помимо этого теперь генератор умеет помечать устаревшие члены класса Android API и вносить комментарий о том, в какой версии Android член был впервые введен или устарел. function isConvex: Boolean; deprecated 'Deprecated in 30'; function addWhitelistedRestrictedPermission(const AArg0: JString; const AArg1: JString; const AArg2: Integer): Boolean; // Introduced in 29'; { constants } property colorMode: Integer read _GetColorMode write _SetColorMode; // Introduced in 26'; В этом релизе мы ускорили запуск Android приложений, ускорение связано частично с генерируемыми заголовочными файлами. Это означает, что если вы генерировали свои заголовочные файлы при помощи нашего инструмента и продолжаете их использовать, то оптимизация не будет применять к старым заголовочным файлам. Если вы хотите применения оптимизации к ним, то вам нужно перегенерировать их заново. Вместе с новой версией мы поставляем обновленный файл, содержащий описание всего Android API 32 версии, и шаблон конфига. Если вы использовали ранее утилиту, рекомендуем обновить ваш "config.json". Новая версия утилиты так же теперь по умному обрабатывает циклические зависимости между Java классами. Подробности читайте по ссылке ниже. Подробности обновления Java2Delphi Описание использования Java2Delphi Поставка AAR вместо JAR для FGX Native Теперь мы поставляем в инсталяторе полноценные AAR библиотеки FGX Native вместо JAR.
  14. Не совсем. API - это просто набор публичных интерфейсов для использования на любой операционной системы. Реализация API может быть разной. В Android есть как минимуму две: Реализация через Байт код. Этот набор API находится в Android SDK. Реализация через нативный код (инструкции процессора). Этот набор объявлен в Android NDK. В реализации FGX Native под Андроид мы используем и NDK и SDK (по большей части). Если с работой с NDK все довольно просто. Нужно написать заголовочные файлы для С-headers. То с использованием байт кода из делфи не все так просто. Для этих целей используется JNI. Нет. JVM выполняет байт код в виртуальной машине. Но по скольку байт код и Java существует не первый десяток. То за это время уже давно существуют всякого рода оптимизации. Одна из них - это JIT-компиляция. Это компиляция байткода в машинный код во время выполнения байт-кода. А JNI - это API для работы с JVM из нативного кода. А именно JNI позволяет осуществлять использование Java объектов из нативного кода (где нет сборщика мусора и тд).
  15. Не совсем так. Выбор решения зависит от целесообразности, обычно выраженная в требуемых финансовых средств. Если у компании есть большой штат сотрудников, которые могут заниматься системой сборкой, развивать и поддерживать, то почему бы и не делать свою. Но когда есть проверенное, рабочее решение. То зачем нам заниматься созданием своего велосипеда, когда есть Google с тысячами сотрудников, которые этим занимаются и поддерживают актуальность. Можно потратить это время на что-то более ценное для пользователей. В данном случае, Embarcadero судя по релизам не хватает средств для расширенной поддержки билд системы. Поэтому мы выбираем Gradle, как гарантированно рабочее, стабильное решение, не зависимое от версии Delphi. Со временем мы превращаемся из Delphi разработчиков в java-программистов на языке Opjeсt Pascal. Сложно представить любой язык без использования стороннего API. Вас же не удивляет, что на VCL вы используете WinAPI на Delphi, а не на С++ или C? Использование WinAPI в Delphi не делает из вас C++ разработчика 🙂 Обратите внимание, что на FGX Native вы пишите кроссплатформенный код на Delphi и вы можете ограничиться только этим. И мы занимаемся постепенным расширением его, чтобы гарантировать работу на iOS и Android. С другой стороны у вас есть возможность использовать все возможности операционной системы по полной, как с WinAPI. В итоге вам выбирать, что использовать. Если вам надо решить задачу, то какая разница какого типа код вы вызываете? Так что больше возможностей, больше возможности продукта. Так и в Android почти так. Есть Байт-код, а есть ваш натив - машинный код в командах архитектуры ARM, который так же выполняется напрямую. Обертки - это внутренний механизм для возможности взаимодействия нативного кода с JVM. Которая в конечном итоге так же выражается в виде байткода, который в конечном счете через JIT компиляцию выражается в нативных инструкциях процессора. Я думаю, вы это понимаете. А так есть архитектура Андроид приложения, разработанная Google, и поэтому хочешь не хочешь, а ее надо придерживаться или приложения не будет. Все верно. У слова "натив" есть несколько смыслов: Натив - как последовательность инструкций, выполняемых напрямую на процессоре. Натив - как использующее родное API для операционной системы/приложения. Даже если это и байт код. С этой точки зрения. FGX Native является и тем и другим. FGX Native использует напрямую Android API (представляющее собой байт код) и взаимодействует с JMV, но с другой стороны код вашего приложения является по большей части инструкциями к процессору. Так же верно. Андроид приложение - это стартовый байт код, которые загружает нативный код и передает ему управление (если мы говорим про FGX Native или FMX).
  16. Добрый день, уважаемые пользователи FGX Native! Вот мы и подошли к главной ключевой новинке версии FGX Native 1.15.0.0, а именно речь пойдет о новой системе сборки для Android приложений 🔥. Долгое время мы шли к этому решению и уверены, что данная система сборки является ключевым нововведением для всех будущих релизов FGX Native. Это огромный шаг и потенциал для мобильной разработки на Delphi. Перед тем, как окунуться в детали новинки, настоятельно рекомендуем ознакомиться с нашей статьей о миграции на AndroidX, в которой мы частично описали текущие проблемы, которые стоят за штатной системой сборки Delphi. Что не так со стандартной системой сборки Delphi для Android приложений? Для начала нужно понять, почему в чём проблемы стандартной системы сборки. 1. Поддержка сторонних Android-библиотек Это самая важная часть для FGX Native. Мы используем различные сторонние Android библиотеки - Firebase, AdMob, Visio и прочие. Все эти библиотеки в свою очередь используют другие библиотеки, и тд т тп. Каждая библиотека - это не только код, но и ресурсы, изменения необходимые для Android манифеста и тд. Соотвественно, для полноценной поддержки сторонних Android-библиотек требуется не только внедрить исполняемый код, но и так же поставить все ресурсы и слить правки в Android манифесте. Стандартная система сборки Delphi ограничена только внедрением кода. А это значит, что выдрав из Андроид-библиотеки только код и проигнорировав ресурсы, манифесты и нативный код, мы получаем нестабильное решение, которое может не работать, падать и тд. Поэтому в Delphi сообществе очень много проблем с использованием сторонних Android решений. И все они зачастую упираются в ограничение стандартной системы сборки. Более подробно проблема поддержки Android-библиотек описана в статье про миграцию на AndroidX. 2. Скорость Не секрет, что скорость сборки Android приложений из Delphi, по сравнению с нативными средствами разработки, оставляет желать лучшего. И если во время сборки простого приложения проблема не так заметна, то ситуация кардинально менятся, когда мы имеем дело с приложениями готовыми для продакшена и содержащими большое количество кода, ресурсов и тд. Повторный запуск приложения (после сборки без изменений) может занимать минуты(!) (в зависимости от используемых ресурсов). А после внесения любых, даже самых незначительных изменений в проект, требуется потратить почти столько же времени, как на сборку проекта с нуля. Мы собрали немного статистики от наших клиентов по сборке существующих продакшен-приложений с большим количеством экранов и ресурсов. Данные показатели зависят от многих факторов: сложность проекта, характеристики компьютера, на котором осуществляется сборка и тд. Но для нас важно относительные значения времени в рамках одного проекта и одного компьютера. Поэтому следует иметь ввиду, что в каждом конкретном случае числа будут другими. Первый столбец содержит время старта (без отладки) проекта с нуля. До этого проект не собирался и нет никаких промежуточных результатов сборки. Второй столбец указывает время старта (без отладки) проекта после внесения изменения в проект: изменили исходный код и тд. Третий столбец отвечает за повторный старт (без отладки) приложения без внесения изменений . Из этой таблицы хорошо видно, что в среднем на сборку с запуском уходит ~1 минута. Обычный сценарий использования: внес изменений в коде, собрал, запустил, поймал ошибку, опять внес изменений и тд. Грубо говоря, в среднем 60 запусков в день приложения (без отладки) может занимать 1 час рабочего времени! С отладкой цифры становятся еще более угрожающими. Тратится драгоценное время на ожидание, вместо того, чтобы потратить его с пользой. 3. Технологическое отставание от требований Google Стоит отметить, что Google активно развивает сборку Android приложений, каждый раз выдвигая всё новые и новые требования к полученному приложению: Был APK, на его смену пришел более умный AAB. Новые требования к версии используемых библиотек. Если используемая библиотека старая, то приложение не может быть загружено в маркет или же просто не работать на свежих версиях Android. Поскольку Delphi самостоятельно реализует систему сборки, то получается состояние вечной гонки, в которой Delphi, к сожалению, всегда в роли догоняющего. Поэтому, как только Google/Apple меняют структуру пакета приложения, вам приходится ждать обновлений Delphi, которые изменят встроенную систему сборки в соответствии с новыми требованиями. С учётом частоты выхода новых версий Delphi это может вылиться в длительное ожидание, а иногда и финансовые затраты, необходимые для приобретения новой версии. Что нам дает новая система сборки Учитывая все перечисленные выше минусы встроенной сборки Android приложений, мы пошли по единственному верному на наш взгляд пути, а именно, мы внедрили родную систему сборки, которая используется в Android Studio и которую рекомендует сам Google. 1. Поддержка Android-библиотек Полноценная поддержка всех Android-библиотек. Теперь перед Delphi разработчиком не будет практических никаких ограничений для использования сторонних библиотек. Мы предлагаем полный цикл интеграции любого стороннего решения в FGX Native приложения под Android: Вы находите интересуемое решение на Java для Android Вы добавляете Java библиотеку в FGX Native проект Вы генерируете заголовочные файлы для Java библиотеки на языке Delphi при помощи нашей утилиты Java2Delphi. В будущем появится автоматическое скачивания всех зависимостей. Так что вам даже не придется искать файл библиотеки, достаточно будет указать имя библиотеки и её версию. Остальное на себя возьмет FGX Native. 2. Скорость После внедрения новой системы сборки, мы попросили наших клиентов, повторно протестировать сборку их проектов. Все результаты сведены в таблицу ниже. Из нее наглядно видно, что в целом сборка и запуск проектов стал быстрее от 2 до 5 раз 🔥(кроме старта с нуля, что обуславливается долгой сборкой главной so-библиотеки приложения, которая целиком и полностью зависит от компилятора и линкера). Давайте разберем результаты подробнее. Старт после изменений Данный замер является самым часто используемым. Вы вносите изменения в проект и запускаете приложение для тестирования и отладки. Практически - это основной сценарий работы разработчика. В целом прирост скорости составляет от 2 до 5 раз на тестируемой выборке проектов 🚀. Важно отметить, что при этом новая система сборки проделывает гораздо большую работу по сравнению со стандартной, даже если брать в расчёт только внедрение дополнительных ресурсов от используемых библиотеки. Количество ресурсов может исчисляться сотнями, и, если добавлять их все через Deployment Manager, то разница в результатах будет еще больше (не в пользу стандартной системы сборки). Повторный старт Данный вариант используется реже, когда вы пытаетесь воспроизвести какую-то ситуацию без изменений кода и у вас не получается ее поймать с первого раза. В этом случае вы просто запускаете приложение из IDE повторно. В этом случае показатели скорости просто ошеломительные. Прирост составляет в ~5 раз на текущей выборке и практически он является постоянной. Если в стандартной системе сборке повторный запуск зависит от количества ресурсов и размера приложения, то для FGX Native это постоянная величина. Старт с нуля Данный тест "Старт с нуля" актуален только для первичной сборки, когда вы скачали проект и выполняете первую сборку. Это самый редкий сценарий запуска, т.к., как правило, при последующих запусках используется "кэш", полученный на предыдущих итерациях. В дальнейшем используется вариант внесения изменений и повторного старта. Сюда не относится вариант с полной пересборкой проекта. 3. Технологическое отставание от требований Google Мы не "изобретаем велосипед" в сборке Android приложений, а берем проверенное официальное решение от Google, которое поддерживается Google. А это значит: Соответствование всем новым требованиям со стороны Google Легкое/моментальное обновление системы сборки до последней версии, без необходимости обновления Delphi Использование Первая сборка При первом открытии FGX Native проекта, начиная с 1.15.0.0 автоматически будет выполнена миграция настроек проекта, в рамках которой будет предложено обновить шаблон манифеста Android приложения и файл стилей styles.xml. Если вы не вносили никаких правок, просто подтвердите замену. Если же вы вносили правки, то необходимо перенести их вручную в правую часть редактора. При обновлении в корень проекта автоматически сохраняется старый файл шаблона. Данное поведение можно отключить при помощи чекбокса, расположенного в левом нижнем углу. При первой сборке FGX Native проекта начиная с 1.15.0.0 в корне проекта автоматически будет создана директория ".android-build". Этот каталог содержит всё необходимое для сборки вашего проекта. Его не нужно добавлять в систему контроля версии, он может быть большого размера, так как там сохраняются промежуточные результаты сборки, при необходимости его можно удалять. Все файлы внутри данной директории являются автогенерируемыми, поэтому не пытайтесь вносить ручные правки, они будут проигнорированы. Первая сборка может занять длительное время, так как при ней загружаются с интернета (требуется наличие активного интернет соединения!) все необходимые компоненты сборки. Однако последующие сборки будут проходить намного быстрее. Во время первой сборки среда может визуально "подвисать", это связано с тем, что интеграция с msbuild в IDE не умеет выполняться полностью параллельно. Ошибки сборки Если в результате сборки появляется ошибка, то подробную информацию можно найти на нижней вкладке "Output", а не в "Build", как раньше. Например, все ошибки упаковки на панели "Build" будут сводиться к такой. Подробности можно найти на вкладке "Output". По тексту ошибки становится ясно, что в проекте используется TargetApiVersion ниже 33. Требования Для успешной сборки требуется свежая версия Java JDK (не ниже 18). Можно использовать ту, что идет в поставке с Delphi. Требуется наличие интернета для первой сборки приложения, так как при ней скачиваются необходимые компоненты сборки. Теперь все FGX Native под Android используют TargetAPILevel = 33. Мы полностью перешли на использование последней версии Android. Поэтому понижать версию теперь нельзя. Когда планируется релиз? Поскольку релиз 1.15.0.0 является очень крупным и затрагивает критические важные моменты, мы хотим быть уверены, что он не испортит ваши проекты. Поэтому внедрение будет происходить постепенно. На первом этапе мы отдали некоторым нашим клиентам сборку на предварительное тестирования на больших проектах, получили обратную связь и устраняем найденные недочеты. Далее на этой неделе мы планируем выпустить экспериментальную версию 1.15.0.0 для широкого круга пользователей. По сути - это полноценная версия и вы сможете опробовать её для перехода на Android 13, сравнить скорость сборки и тд. Однако, если вы столкнетесь с какими-то серьезными проблемами для вашего проекта, вы всегда сможете откатиться на стабильную версию 1.14.6.0. На текущий момент, практически все большие собранные проекты на 1.15.0.0 успешно запускаются и работают. Если при тестировании вы столкнетесь с проблемами, просьба сообщить нам о них, и мы постараемся их оперативно поправить. Всем спасибо за внимание и хорошей продуктивной недели!
  17. С точки зрения вызова ничего не поменялось. TfgAssetBitmapSet по сути является контейнером изображений, предназначенных для разных коэффициентов масштабирования. Информация о каждом изображении представляется в виде структуры FGX.Assets.BitmapSet.TfgBitmapInfo. Так вот раньше могла быть ситуация, когда изображения физически нету для какого-то коэффициента, а информация присутствовала (как на скриншоте выше). Поэтому раньше метод FindBitmap смотрел только на наличие информации, а не на физическое наличие изображения и мог вернуть True при отсутствующем изображении. Сейчас же метод проверяет в том числе наличие битмапа. function TfgAssetBitmapSet.FindBitmap(out ABitmap: TfgBitmap): Boolean; var BitmapInfo: TfgBitmapInfo; begin ABitmap := nil; if FindBitmapInfo(BitmapInfo) then ABitmap := BitmapInfo.Bitmap; Result := ABitmap <> nil; end; Метод старый, поэтому есть две версии: /// <summary> /// Выполняет поиск наиболее подходящего под текущий скейл экрана изображение. Если изображение найдено, /// то оно возвращается в параметре <c>ABitmap</c> и в результате будет <c>True</c>, иначе вернется nil и /// <c>False</c>. /// </summary> function FindBitmap(out ABitmap: TfgBitmap): Boolean; overload; /// <summary> /// Выполняет поиск изображение для экрана со скейлом <c>AScale</c>. Если изображение найдено, /// то оно возвращается в параметре <c>ABitmap</c> и в результате будет <c>True</c>, иначе вернется nil и /// <c>False</c>. /// </summary> function FindBitmap(const AScale: Single; out ABitmap: TfgBitmap): Boolean; overload; Поиск битмапа нужного масштаба у ассета можно реализовать так: var Asset: TfgAssetBitmapSet; Bitmap: TfgBitmap; begin // Здесь код по получению ассета по имени или любым другим способом. ... // Пытаемся достать битмап if Asset.FindBitmap(Bitmap) then // Bitmap содержим экземпляр изображения else // Bitmap не найден
  18. Скачать: Релиз доступен только по запросу. Дата релиза: 31 октября 2022 Улучшения 🙌 TfgAssetsManager Методы TfgAssetBitmapSet.FindBitmap теперь возвращают ложь, если существует только информация об изображении без самого изображения (Bitmap = nil). TfgLottieImage Опубликовано свойство AutoPlay, позволяющее автоматически проигрывать анимацию. Исправление ошибок 🐛 FGX-222 Если первым символом в имени ресурса стоит цифра, то проект невозможно собрать с Assets.Consts. FGX-227 Параметр AOldOrientation в событии TfgForm.OnScreenOrientationChanged имеет некорректное значение (Android). FGX-230 При создании простого проекта с навигатором, при дальнейшем снятии приложения свайпом возникает следующая ошибка (iOS). FGX-231 FGX Native не работает в Delphi 11.0. FGX-228 Как загрузить файл по тегу <a href... /a> на html-странице в TfgWebBrowser (Android). Возможные падения и сбои при сохранении ресурсов, содержащих пустое изображение в AssetManager. При смене анимаций в TfgLottieImage они начинали проигрываться даже при AutoPlay = False.
  19. Download: The distributive is available by request only. Release date: 31 October 2022 Improvements 🙌 TfgAssetsManager TfgAssetBitmapSet.FindBitmap methods now return false if only bitmap information exists without the bitmap itself (Bitmap = nil). TfgLottieImage The new AutoPlay was published, It allows automatically start animation. Bug Fixes 🐛 Possible crashes and crashes when saving resources containing an empty image in AssetManager. FGX-222 If the first character in the asset name is a digit, then project cannot be built with Assets.Consts. FGX-227 The argument AOldOrientation in TfgForm.OnScreenOrientationChanged event has incorrect value (Android). FGX-230 When creating a simple project with a navigator, the following error occurs when the application is being hide with a swipe (iOS). FGX-231 FGX Native doesn't work in Delphi 11.0. FGX-228 TfgWebBrowser How to load file by <a href... /a> tag in html page (Android). When animation was changed in TfgLottieImage, it was automatically being played, even if AutoPlay = False.
  20. Продолжаем освещать новинки обновления 1.15.0.0. И в этот раз речь пойдет про оптимизации старта приложения и новые возможности нашей утилиты Java2Delphi. Ускорение запуска FGX Native приложения на Android Одним из важных изменений в области работы Java-Delphi мосту - является ускорение запуска FGX Native приложения на Android. До 1.15.0.0 холодный старт пустого приложения мог занимать пару секунд. В 1.15.0.0 мы реализовали отложенную инициализацию Java оберток, в результате чего это позволило нам ускорить старт пустого приложения до ~2-х раз. Улучшения в Java2Delphi Поддержка AAR В новой версии Java2Delphi теперь можно использовать AAR библиотеки. Для этого их нужно указать в конфигурационном файле в ветке "aars". "aars": [ "$(FGX)\\Libs\\Android\\fgx.admob.aar" ], Deprecated/Introduced для полей Android API меняется от версии к версии. Какие-то типы объявляются устаревшими, какие-то удаленными, а какие-то новыми. Глядя на заголовочный файл тяжело понять, какой метод в какой версии Android доступен. Ранее мы вносили специальные пометки в заголовочные файлы для методов. В этом релизе мы генерируем аналогичные пометки их и для полей. Так что, теперь можно открыв заголовочный файл, сразу понять в какой версии был добавлен тот или иной элемент, а когда он помечен, как устаревший. function isConvex: Boolean; deprecated 'Deprecated in 30'; function addWhitelistedRestrictedPermission(const AArg0: JString; const AArg1: JString; const AArg2: Integer): Boolean; // Introduced in 29'; { constants } property colorMode: Integer read _GetColorMode write _SetColorMode; // Introduced in 26'; Умная генерация параметров при зависимостях Одним из главных отличий Java от Delphi является разная реализация пространств имен и доступов к типам. В Delphi по умолчанию два модуля не могут использовать друг друга в интерфейсной части. Появляется так называется циклическая зависимость. В то же время в Java в рамках одного пакета все классы могут использовать друг друга. Получается, что заголовочные обертки для всех классов одного пакета в Java должны были быть объявлены в одном Delphi модуле. Это в свою очередь приводило к значительному росту заголовочного файла. Так как нельзя размещать взаимно используемые классы в разных модулях. В этом релизе мы так же улучшили это. Теперь вы можете раскидывать классы по разным модулям, даже если они взаимно используют друг друга. Чтобы избежать циклической зависимости, класс в одном из модулей заменяется на общий JObject. Например: Мы выделяем все типы, связанные с анимацией в модуль Android.Api.Animations. Эти типы используют JView, который объявлен в "Android.Api.ActivityAndView". Часть типов анимации используются в классе Android.Api.ActivityAndView.JView. Так геттер getAnimation должен вернуть объект JAnimation. Однако, данный тип, объявлен в Android.Api.Animations. JView = interface(JObject) // function getAnimation: JAnimation; // end; Получается циклическая зависимость. И раньше такой код не мог быть скомпилирован. Сейчас же такая зависимость заменяется генератором на такой код с указанием оригинального класса в фигурных скобках: JView = interface(JObject) // function getAnimation: JObject {JAnimation}; // end; Чтобы при использовании получить объект JAnimation, достаточно написать такой код: var Animation: JAnimation; Animation := TJAnimation.Wrap(View.getAnimation);
×
×
  • Create New...