我正在使用Delphi-Berlin Update-2
Android服务无法使用log.d(),因为这需要使用FMX.Types,使用它会导致整个应用程序崩溃。
我尝试从FMX.Types中提取日志部分,但没有成功。
是否有任何解决方案让log.d正常工作?
到目前为止,我一直在使用IdUDP,但这不是一个理想的解决方案。
答案 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
。警告,错误和致命信息也被包装为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;