15c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
25c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Copyright (C) 2009 The Android Open Source Project
35c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
45c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Licensed under the Apache License, Version 2.0 (the "License");
55c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * you may not use this file except in compliance with the License.
65c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * You may obtain a copy of the License at
75c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
85c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *      http://www.apache.org/licenses/LICENSE-2.0
95c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
105c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Unless required by applicable law or agreed to in writing, software
115c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * distributed under the License is distributed on an "AS IS" BASIS,
125c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * See the License for the specific language governing permissions and
145c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * limitations under the License.
155c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
165c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
175c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifndef _ANDROID_LOG_H
185c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#define _ANDROID_LOG_H
195c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
205c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/******************************************************************
215c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
225c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * IMPORTANT NOTICE:
235c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
245c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   This file is part of Android's set of stable system headers
255c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   exposed by the Android NDK (Native Development Kit) since
265c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   platform release 1.5
275c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
285c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   Third-party source AND binary code relies on the definitions
295c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   here to be FROZEN ON ALL UPCOMING PLATFORM RELEASES.
305c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
315c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT MODIFY ENUMS (EXCEPT IF YOU ADD NEW 32-BIT VALUES)
325c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT MODIFY CONSTANTS OR FUNCTIONAL MACROS
335c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT CHANGE THE SIGNATURE OF FUNCTIONS IN ANY WAY
345c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - DO NOT CHANGE THE LAYOUT OR SIZE OF STRUCTURES
355c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
365c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
375c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
385c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Support routines to send messages to the Android in-kernel log buffer,
395c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * which can later be accessed through the 'logcat' utility.
405c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
415c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Each log message must have
425c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - a priority
435c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - a log tag
445c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *   - some text
455c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
465c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * The tag normally corresponds to the component that emits the log message,
475c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * and should be reasonably small.
485c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
495c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Log message text may be truncated to less than an implementation-specific
505c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * limit (e.g. 1023 characters max).
515c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
525c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Note that a newline character ("\n") will be appended automatically to your
532ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn * log message, if not already there. It is not possible to send several
542ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn * messages and have them appear on a single line in logcat.
555c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
565c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * PLEASE USE LOGS WITH MODERATION:
575c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
585c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *  - Sending log messages eats CPU and slow down your application and the
595c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *    system.
605c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
615c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *  - The circular log buffer is pretty small (<64KB), sending many messages
625c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *    might push off other important log messages from the rest of the system.
635c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
645c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *  - In release builds, only send log messages to account for exceptional
655c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *    conditions.
665c967da341c9395a4c378c149f326505224ec66eMark Salyzyn *
675c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * NOTE: These functions MUST be implemented by /system/lib/liblog.so
685c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
695c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
705c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#include <stdarg.h>
715c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
725c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __cplusplus
735c967da341c9395a4c378c149f326505224ec66eMark Salyzynextern "C" {
745c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
755c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
765c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
775c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Android log priority values, in ascending priority order.
785c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
795c967da341c9395a4c378c149f326505224ec66eMark Salyzyntypedef enum android_LogPriority {
802ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_UNKNOWN = 0,
812ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_DEFAULT, /* only for SetMinPriority() */
822ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_VERBOSE,
832ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_DEBUG,
842ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_INFO,
852ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_WARN,
862ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_ERROR,
872ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_FATAL,
882ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn  ANDROID_LOG_SILENT, /* only for SetMinPriority(); must be last */
895c967da341c9395a4c378c149f326505224ec66eMark Salyzyn} android_LogPriority;
905c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
915c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
925c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Send a simple string to the log.
935c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
945c967da341c9395a4c378c149f326505224ec66eMark Salyzynint __android_log_write(int prio, const char* tag, const char* text);
955c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
965c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
975c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Send a formatted string to the log, used like printf(fmt,...)
985c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
992ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynint __android_log_print(int prio, const char* tag, const char* fmt, ...)
1005c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__GNUC__)
1015c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __USE_MINGW_ANSI_STDIO
1025c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if __USE_MINGW_ANSI_STDIO
1032ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(gnu_printf, 3, 4)))
1045c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1052ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1065c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1075c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1082ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1095c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1105c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1115c967da341c9395a4c378c149f326505224ec66eMark Salyzyn    ;
1125c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
1135c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
1145c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * A variant of __android_log_print() that takes a va_list to list
1155c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * additional parameters.
1165c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
1172ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynint __android_log_vprint(int prio, const char* tag, const char* fmt, va_list ap)
1185c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__GNUC__)
1195c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __USE_MINGW_ANSI_STDIO
1205c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if __USE_MINGW_ANSI_STDIO
1212ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(gnu_printf, 3, 0)))
1225c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1232ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 0)))
1245c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1255c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1262ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 0)))
1275c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1285c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1295c967da341c9395a4c378c149f326505224ec66eMark Salyzyn    ;
1305c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
1315c967da341c9395a4c378c149f326505224ec66eMark Salyzyn/*
1325c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * Log an assertion failure and abort the process to have a chance
1335c967da341c9395a4c378c149f326505224ec66eMark Salyzyn * to inspect it if a debugger is attached. This uses the FATAL priority.
1345c967da341c9395a4c378c149f326505224ec66eMark Salyzyn */
1352ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzynvoid __android_log_assert(const char* cond, const char* tag, const char* fmt,
1362ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn                          ...)
1375c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if defined(__GNUC__)
1382ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__noreturn__))
1395c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __USE_MINGW_ANSI_STDIO
1405c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#if __USE_MINGW_ANSI_STDIO
1412ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(gnu_printf, 3, 4)))
1425c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1432ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1445c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1455c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#else
1462ed51d708eda64516ec79ac6397f690de38f0075Mark Salyzyn    __attribute__((__format__(printf, 3, 4)))
1475c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1485c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1495c967da341c9395a4c378c149f326505224ec66eMark Salyzyn    ;
1505c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
1515c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#ifdef __cplusplus
1525c967da341c9395a4c378c149f326505224ec66eMark Salyzyn}
1535c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif
1545c967da341c9395a4c378c149f326505224ec66eMark Salyzyn
1555c967da341c9395a4c378c149f326505224ec66eMark Salyzyn#endif /* _ANDROID_LOG_H */
156