Answers:
如果您需要合理的信息,我建议您使用合理的命令:)(没有冒犯的意思,只是在开玩笑)。因此,问题应为:
现在,我们处于更好的一面。可以使用多种方法:
要完全处理该主题,它需要的不仅仅是这个简单的答案(如果感兴趣,您可以在许多网站上找到更详细的信息,或者在Andrew Hoog的书《Android Forensics:Google Android的调查,分析和移动安全》中找到)。很荣幸能够翻译成德语,可能还有许多其他来源。
因此,我将在此处给出一些示例以帮助您入门:
在这种情况下,可能最知名的应用是aLogcat,可在Playstore免费获得(开发人员会很乐意接受您为同一应用的其他变体提供的捐助)。您将在1下面找到一个屏幕截图。该应用程序允许您过滤日志,开始/停止记录日志消息,甚至将记录的片段存储到SD卡中-当然,也可以根据需要以纯文本格式存储。
本节中的另一个应用程序是Log Collector,它只是尝试获取整个可用日志并通过共享菜单2发送日志。
Android软件开发套件(SDK)包含adb
用于执行各种任务的命令。除其他功能外,它还提供了adb shell
在设备上执行命令的功能。使用此方法,您还可以收集所需的日志信息:只需在命令下方添加adb shell
。
使用终端应用程序(例如Android Terminal Emulator或Terminal IDE),您可以直接在设备本地的命令提示符下访问日志。稍微舒适一点,可以在设备上运行ssh服务器(例如DroidSSHd或DropBear SSH Server),然后从计算机访问它。这样,您就可以在大屏幕上工作,同时调查日志。
您可以使用许多强大的命令从命令行访问日志信息,这里我仅举几个例子。
该dmesg
命令提取内核日志:
$ dmesg
<6>[82839.126586] PM: Syncing filesystems ... done.
<7>[82839.189056] PM: Preparing system for mem sleep
<4>[82839.189361] Freezing user space processes ... (elapsed 0.05 seconds) done.
<4>[82839.240661] Freezing remaining freezable tasks ... (elapsed 0.00 seconds) done.
<7>[82839.242279] PM: Entering mem sleep
<4>[82839.242889] Suspending console(s) (use no_console_suspend to debug)
<7>[82839.252410] vfp_pm_save_context: saving vfp state
<6>[82839.252716] PM: Resume timer in 26 secs (864747 ticks at 32768 ticks/sec.)
<6>[82842.091369] Successfully put all powerdomains to target state
<6>[82842.092468] wakeup wake lock: wifi_wake
使用logcat
,您可以访问许多日志记录信息-但大多数情况下,这需要root用户。它具有一些用于过滤信息的参数,例如,通过选择要使用读取的日志缓冲区-b
。请阅读logcat开发人员页面上提供的信息以了解详细信息。举两个例子:logcat -b events
列出事件,或logcat -b radio
有关设备无线电调制的信息。
这两个命令dumpsys
,并dumpstate
给你详细的系统信息:
$ dumpsys
Currently running services:
LocationProxyService
SurfaceFlinger
accessibility
account
activity
<snip>
DUMP OF SERVICE account:
Accounts: 1
Account {name=xxxxxxx@googlemail.com, type=com.google}
<snip>
DUMP OF SERVICE alarm:
$ dumpstate
========================================================
== dumpstate: 2012-08-18 23:39:53
========================================================
Build: Gingerbread GWK74 - CyanogenMilestone2
Bootloader: 0x0000
Radio: unknown
<snip>
------ MEMORY INFO (/proc/meminfo) ------
MemTotal: 487344 kB
MemFree: 10436 kB
Buffers: 14136 kB
Cached: 145460 kB
<snip>
而且,如果您懒得bugreport
忘了所有这些信息,只需使用命令-该命令将上面的代码全部调用并将其捆绑在一起,即可向开发人员报告一个不错的,嗡嗡的错误报告...
当然,您可以将所有这些命令的输出重定向到文件以复制到计算机,并且在大多数情况下,您应该这样做-因为屏幕缓冲区太小而无法处理所有内容:bugreport > /mnt/sdcard/bugreport.txt
这是一个示例那部分。
adb shell pm grant com.nolanlawson.logcat android.permission.READ_LOGS
对于需要解析此原始文件的开发人员(或其他有关方面),以下是一些资源:
android_logger_list_read()
以收集日志条目:https : //android.googlesource.com/platform/system/core/+/master/logcat/logcat.cpp日志格式的实际格式在以下详细说明:
为方便起见,对相关部分进行了略加注解和重新排序的副本:
#define LOGGER_ENTRY_MAX_LEN (5*1024)
struct log_msg {
union {
/* Maximum size of entry: 5121 bytes */
unsigned char buf[LOGGER_ENTRY_MAX_LEN + 1];
struct logger_entry_v3 entry;
struct logger_entry_v3 entry_v3;
struct logger_entry_v2 entry_v2;
struct logger_entry entry_v1;
} __attribute__((aligned(4)));
}
/*
* The userspace structure for version 1 of the logger_entry ABI.
* This structure is returned to userspace by the kernel logger
* driver unless an upgrade to a newer ABI version is requested.
*/
struct logger_entry {
uint16_t len; /* length of the payload */
uint16_t __pad; /* no matter what, we get 2 bytes of padding */
int32_t pid; /* generating process's pid */
int32_t tid; /* generating process's tid */
int32_t sec; /* seconds since Epoch */
int32_t nsec; /* nanoseconds */
char msg[0]; /* the entry's payload */
} __attribute__((__packed__));
/*
* The userspace structure for version 2 of the logger_entry ABI.
* This structure is returned to userspace if ioctl(LOGGER_SET_VERSION)
* is called with version==2; or used with the user space log daemon.
*/
struct logger_entry_v2 {
uint16_t len; /* length of the payload */
uint16_t hdr_size; /* sizeof(struct logger_entry_v2) */
int32_t pid; /* generating process's pid */
int32_t tid; /* generating process's tid */
int32_t sec; /* seconds since Epoch */
int32_t nsec; /* nanoseconds */
uint32_t euid; /* effective UID of logger */
char msg[0]; /* the entry's payload */
} __attribute__((__packed__));
struct logger_entry_v3 {
uint16_t len; /* length of the payload */
uint16_t hdr_size; /* sizeof(struct logger_entry_v3) */
int32_t pid; /* generating process's pid */
int32_t tid; /* generating process's tid */
int32_t sec; /* seconds since Epoch */
int32_t nsec; /* nanoseconds */
uint32_t lid; /* log id of the payload */
char msg[0]; /* the entry's payload */
} __attribute__((__packed__));
您可以通过查看第三个字节和第四个字节来区分差异版本。格式显然也取决于平台的字节顺序。对于v1消息,__pad
等于0
。v2(和v3)消息使用24(0x18
)。
为main
,radio
以及system
日志msg
字段被解释为如下(源):
\0
作为分隔符\0
作为终止符如果此消息被截断,则\0
可能缺少尾随。
events
但是,对于日志,msg
字段包含以下二进制数据:
length
,其后是length
包含UTF8编码的字符串的字节length
,后跟length
每个树节点AndroidEventLogType
。
$ dmesg
还是dmsg
?其中之一必须有错字:)