log.d在Android服务中无效(Delphi Berlin)

时间:2016-12-12 14:13:31

标签: android delphi service

我正在使用Delphi-Berlin Update-2

Android服务无法使用log.d(),因为这需要使用FMX.Types,使用它会导致整个应用程序崩溃。

我尝试从FMX.Types中提取日志部分,但没有成功。

是否有任何解决方案让log.d正常工作?

到目前为止,我一直在使用IdUDP,但这不是一个理想的解决方案。

1 个答案:

答案 0 :(得分:1)

我正在使用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。警告,错误和致命信息也被包装为LOGWLOGELOGF

我将其余的日志记录级别包装在此处(未经测试,并且不包括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;