Отладка в Android-приложениях на Delphi: решение проблемы с log.d() в Delphi-Berlin Update-2
При разработке приложений под Android с использованием Delphi часто возникают вопросы, связанные с отладкой. Одна из проблем, с которой сталкиваются разработчики, заключается в использовании метода log.d() в сервисах Android. В обновлении Delphi-Berlin Update-2 при попытке использовать log.d() происходит необходимость в подключении модуля FMX.Types, что в свою очередь может привести к сбою всего приложения.
Проблема
Разработчики, использующие Delphi-Berlin Update-2, сталкиваются с трудностями при попытке использовать log.d() в сервисах Android. Это связано с тем, что log.d() требует подключения модуля FMX.Types, который, в свою очередь, может вызвать сбой приложения. Попытки извлечь раздел логов из FMX.Types не увенчались успехом, и разработчики ищут альтернативные способы решения проблемы.
Альтернативный ответ и Подход к решению
Разработчикам предлагается обратиться с сообщением о дефекте в библиотеки, если они считают, что проблема кроется именно в них. Также рекомендуется предоставлять минимально воспроизводимый пример (mcve), чтобы облегчить процесс диагностики. В случае с Delphi Tokyo наблюдается та же проблема на реальном устройстве LG-LS997.
Подтвержденное решение
Для решения проблемы можно использовать встроенную функцию LOGI, следующим образом:
uses Androidapi.Log;
procedure MyProcedure(msg: String);
var
M: TMarshaller;
begin
LOGI(M.AsUtf8(msg).ToPointer);
end;
Дополнительная информация: При включении любого модуля FMX в сервис возникает сегментация. Log.d вызывает LOGI, который, в свою очередь, использует функцию Android NDK __android_log_write. Также имеется __android_log_print для форматирования, но она не обернута. Рекомендуется форматировать сообщения внутри Delphi и вызывать __android_log_write.
Функция LOGI определена для вызова __android_log_write с уровнем логирования ANDROID_LOG_INFO. Существуют аналогичные обертки для уровней WARN, ERROR и FATAL в виде функций LOGW, LOGE и LOGF.
Дополнительно были созданы обертки для остальных уровней логирования (не тестировались, уровень ANDROID_LOG_UNKNOWN исключен):
function LOGDEF(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_DEFAULT, 'default', Text);
end;
function LOGV(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_VERBOSE, 'verbose', Text);
end;
function LOGDBG(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_DEBUG, 'debug', Text);
end;
function LOGS(Text: MarshaledAString): Integer;
begin
Result := __android_log_write(android_LogPriority.ANDROID_LOG_SILENT, 'silent', Text);
end;
Заключение
Предложенное решение позволяет использовать функционал логирования без необходимости подключения модуля FMX.Types, что исключает риск сбоя приложения. Важно помнить о необходимости корректного форматирования сообщений и использовании правильных уровней логирования. Это решение подтверждено сообществом и может быть использовано в версиях Delphi, начиная с Tokyo.
Примечание: В статье использованы примеры кода на Object Pascal, которые соответствуют основной тематике сайта и запросу на решение проблемы, связанной с Delphi и Pascal.
При разработке Android-приложений в Delphi возникла проблема с использованием метода `log.d()`, требующего подключения модуля `FMX.Types`, что может вызвать сбой приложения, и предложено решение через использование функции `LOGI` без подключения указанно
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.