如何从框架ui代码中稳健地调试日志记录?

时间:2018-02-22 16:03:04

标签: android android-logcat

我正在调查android的View遍历和测量缓存的行为, 使用AOSP源代码和模拟器。

我想从每个函数发出调试日志消息 View.measure(),View.layout(),View.draw(), 来自调用它们的所有过程。

听起来很直白,对吧?但我还没有找到一种可靠的机制。

我尝试了什么:

  1. 标准日志记录机制:java.util.Log(以及使用logcat查看)。

    失败:当邮件太多时,会随机丢弃邮件。

  2. 创建并附加到目录中的文件 Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)。

    失败:这仅适用于某些进程(具有WRITE_EXTERNAL_STORAGE的进程) 许可,大概是)。

  3. 在目录view.getContext()。getCacheDir()中创建并附加到文件。

    失败:调用getCacheDir()在system_process中失败,其中: “java.lang.RuntimeException:找不到包android的数据目录”。

  4. 创建并附加到目录view.getContext()中的文件.getExternalCacheDir()。

    失败:这似乎适用于除system_process之外的所有进程, 其中getExternalCacheDir()返回/ storage / emulated / 0 / Android / data / android / cache, 但是尝试写入那里的文件会产生AccessDeniedException。

  5. 创建并附加到目录view.getContext()中的文件.getExternalFilesDir(null)。

    失败:与(4)相同的结果,除了目录名以“files”结尾而不是“cache”。

  6. 创建并附加到/ data / local / tmp中的文件。

    失败:在所有进程中都提供AccessDeniedException。

  7. 我该如何记录?

    我对以下任何一行的具体解决方案感兴趣:

    • 破解AOSP源以防止java.util.Log丢弃消息
    • 编写备用日志后台程序,它不会丢弃邮件 并且必须在系统启动期间可用(以便它可用于诸如system_process和com.android.systemui之类的进程)。
    • 找到一个 允许system_process写入的目录/文件     (我认为这是我找不到这样一个文件的唯一过程)
    • 使用AOSP源来实现system_process 写入某个文件的权限。

1 个答案:

答案 0 :(得分:0)

我找到了以下目录,每个进程显然可以创建文件并写入;因此,让每个进程在相应的目录中为其日志记录/跟踪创建一个文件。 显然有两种情况必须完全分开处理。

  • “system_process”(又名“system_server”又名“system”)(与“com.android.system.ui”不同)可写入:
    • Environment.getDataDirectory()=“/ data”
    • Environment.getDownloadCacheDirectory()=“/ data / cache”
    • Environment.getDataSystemDirectory()=“/ data / system”
  • 使UI可以写入的所有其他进程:
    • context.getExternalCacheDir()=“/ storage / emulated/0 / Android / data / app.name.appears.here / cache”
    • context.getExternalFilesDir(null)=“/ storage / emulated/0 / Android / data / app.name.appears.here / files”
    • context.getCacheDir()=“/ data / user / / app.name.appears.here / cache”或“/data/user_de/0/app.name.appears.here/cache”
    • context.getFilesDir()=“/ data / user / 0 / app.name.appears.here / files”或“/data/user_de/0/app.name.appears.here/files”

注意:上面列出的字符串文字是我在AOSP源代码构建的仿真器上观察到的每个函数的回归;我不认为对它们进行硬编码是安全的。