ソースを参照

AK: Send dbgln/outln/warnln to the NDK logger on Android

The embedding application is responsible for setting the android log
tag. If it doesn't a default of "Serenity" will be used for any Lagom
code.
Andrew Kaster 1 年間 前
コミット
0c5a546dca
3 ファイル変更110 行追加9 行削除
  1. 51 1
      AK/Format.cpp
  2. 55 8
      AK/Format.h
  3. 4 0
      Userland/Libraries/LibCore/CMakeLists.txt

+ 51 - 1
AK/Format.cpp

@@ -8,6 +8,7 @@
 #include <AK/Format.h>
 #include <AK/Format.h>
 #include <AK/GenericLexer.h>
 #include <AK/GenericLexer.h>
 #include <AK/IntegralMath.h>
 #include <AK/IntegralMath.h>
+#include <AK/String.h>
 #include <AK/StringBuilder.h>
 #include <AK/StringBuilder.h>
 #include <AK/kstdio.h>
 #include <AK/kstdio.h>
 
 
@@ -25,6 +26,10 @@
 #    include <string.h>
 #    include <string.h>
 #endif
 #endif
 
 
+#if defined(AK_OS_ANDROID)
+#    include <android/log.h>
+#endif
+
 namespace AK {
 namespace AK {
 
 
 class FormatParser : public GenericLexer {
 class FormatParser : public GenericLexer {
@@ -895,6 +900,45 @@ void vout(FILE* file, StringView fmtstr, TypeErasedFormatParams& params, bool ne
 }
 }
 #endif
 #endif
 
 
+#ifdef AK_OS_ANDROID
+static char const* s_log_tag_name = "Serenity";
+void set_log_tag_name(char const* tag_name)
+{
+    static String s_log_tag_storage;
+    // NOTE: Make sure to copy the null terminator
+    s_log_tag_storage = MUST(String::from_utf8({ tag_name, strlen(tag_name) + 1 }));
+    s_log_tag_name = s_log_tag_storage.bytes_as_string_view().characters_without_null_termination();
+}
+
+void vout(LogLevel log_level, StringView fmtstr, TypeErasedFormatParams& params, bool newline)
+{
+    StringBuilder builder;
+    MUST(vformat(builder, fmtstr, params));
+
+    if (newline)
+        builder.append('\n');
+    builder.append('\0');
+
+    auto const string = builder.string_view();
+
+    auto ndk_log_level = ANDROID_LOG_UNKNOWN;
+    switch (log_level) {
+    case LogLevel ::Debug:
+        ndk_log_level = ANDROID_LOG_DEBUG;
+        break;
+    case LogLevel ::Info:
+        ndk_log_level = ANDROID_LOG_INFO;
+        break;
+    case LogLevel::Warning:
+        ndk_log_level = ANDROID_LOG_WARN;
+        break;
+    }
+
+    __android_log_write(ndk_log_level, s_log_tag_name, string.characters_without_null_termination());
+}
+
+#endif
+
 static bool is_debug_enabled = true;
 static bool is_debug_enabled = true;
 
 
 void set_debug_enabled(bool value)
 void set_debug_enabled(bool value)
@@ -944,7 +988,9 @@ void vdbg(StringView fmtstr, TypeErasedFormatParams& params, bool newline)
     MUST(vformat(builder, fmtstr, params));
     MUST(vformat(builder, fmtstr, params));
     if (newline)
     if (newline)
         builder.append('\n');
         builder.append('\n');
-
+#ifdef AK_OS_ANDROID
+    builder.append('\0');
+#endif
     auto const string = builder.string_view();
     auto const string = builder.string_view();
 
 
 #ifdef AK_OS_SERENITY
 #ifdef AK_OS_SERENITY
@@ -955,7 +1001,11 @@ void vdbg(StringView fmtstr, TypeErasedFormatParams& params, bool newline)
     }
     }
 #    endif
 #    endif
 #endif
 #endif
+#ifdef AK_OS_ANDROID
+    __android_log_write(ANDROID_LOG_DEBUG, s_log_tag_name, string.characters_without_null_termination());
+#else
     dbgputstr(string.characters_without_null_termination(), string.length());
     dbgputstr(string.characters_without_null_termination(), string.length());
+#endif
 }
 }
 
 
 #ifdef KERNEL
 #ifdef KERNEL

+ 55 - 8
AK/Format.h

@@ -557,7 +557,7 @@ struct Formatter<nullptr_t> : Formatter<FlatPtr> {
 
 
 ErrorOr<void> vformat(StringBuilder&, StringView fmtstr, TypeErasedFormatParams&);
 ErrorOr<void> vformat(StringBuilder&, StringView fmtstr, TypeErasedFormatParams&);
 
 
-#ifndef KERNEL
+#if !defined(KERNEL)
 void vout(FILE*, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);
 void vout(FILE*, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);
 
 
 template<typename... Parameters>
 template<typename... Parameters>
@@ -576,20 +576,18 @@ void outln(FILE* file, CheckedFormatString<Parameters...>&& fmtstr, Parameters c
 
 
 inline void outln(FILE* file) { fputc('\n', file); }
 inline void outln(FILE* file) { fputc('\n', file); }
 
 
+#    ifndef AK_OS_ANDROID
 template<typename... Parameters>
 template<typename... Parameters>
-void out(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { out(stdout, move(fmtstr), parameters...); }
+void out(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
+{
+    out(stdout, move(fmtstr), parameters...);
+}
 
 
 template<typename... Parameters>
 template<typename... Parameters>
 void outln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stdout, move(fmtstr), parameters...); }
 void outln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stdout, move(fmtstr), parameters...); }
 
 
 inline void outln() { outln(stdout); }
 inline void outln() { outln(stdout); }
 
 
-#    define outln_if(flag, fmt, ...)       \
-        do {                               \
-            if constexpr (flag)            \
-                outln(fmt, ##__VA_ARGS__); \
-        } while (0)
-
 template<typename... Parameters>
 template<typename... Parameters>
 void warn(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
 void warn(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
 {
 {
@@ -600,6 +598,55 @@ template<typename... Parameters>
 void warnln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stderr, move(fmtstr), parameters...); }
 void warnln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters) { outln(stderr, move(fmtstr), parameters...); }
 
 
 inline void warnln() { outln(stderr); }
 inline void warnln() { outln(stderr); }
+#    else  // v Android ^ No Android
+enum class LogLevel {
+    Debug,
+    Info,
+    Warning,
+};
+
+void vout(LogLevel, StringView fmtstr, TypeErasedFormatParams&, bool newline = false);
+
+template<typename... Parameters>
+void out(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
+{
+    VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
+    vout(LogLevel::Info, fmtstr.view(), variadic_format_params);
+}
+
+template<typename... Parameters>
+void outln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
+{
+    VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
+    vout(LogLevel::Info, fmtstr.view(), variadic_format_params, true);
+}
+
+inline void outln() { outln(""); }
+
+template<typename... Parameters>
+void warn(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
+{
+    VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
+    vout(LogLevel::Warning, fmtstr.view(), variadic_format_params);
+}
+
+template<typename... Parameters>
+void warnln(CheckedFormatString<Parameters...>&& fmtstr, Parameters const&... parameters)
+{
+    VariadicFormatParams<AllowDebugOnlyFormatters::Yes, Parameters...> variadic_format_params { parameters... };
+    vout(LogLevel::Warning, fmtstr.view(), variadic_format_params, true);
+}
+
+inline void warnln() { warnln(""); }
+
+void set_log_tag_name(char const*);
+#    endif // AK_OS_ANDROID
+
+#    define outln_if(flag, fmt, ...)       \
+        do {                               \
+            if constexpr (flag)            \
+                outln(fmt, ##__VA_ARGS__); \
+        } while (0)
 
 
 #    define warnln_if(flag, fmt, ...)       \
 #    define warnln_if(flag, fmt, ...)       \
         do {                                \
         do {                                \

+ 4 - 0
Userland/Libraries/LibCore/CMakeLists.txt

@@ -65,3 +65,7 @@ if (APPLE)
     target_link_libraries(LibCore PUBLIC "-framework CoreServices")
     target_link_libraries(LibCore PUBLIC "-framework CoreServices")
     target_link_libraries(LibCore PUBLIC "-framework Foundation")
     target_link_libraries(LibCore PUBLIC "-framework Foundation")
 endif()
 endif()
+
+if (ANDROID)
+    target_link_libraries(LibCore PRIVATE log)
+endif()