您的位置:首页 > 娱乐 > 八卦 > 安卓Framework开发快速分析日志及定位源码

安卓Framework开发快速分析日志及定位源码

2024/10/6 16:17:37 来源:https://blog.csdn.net/CSqingchen/article/details/140097187  浏览:    关键词:安卓Framework开发快速分析日志及定位源码

文章目录

      • 如何区分源码中 main system events 日志
      • 查看 Activity 生命周期日志
      • 分析 events 日志在源码中位置
      • 应用进程ID助分析具体应用
      • ProtoLog 动态开关日志
      • 如何快速定位相关流程的代码位置

本文首发地址 https://h89.cn/archives/285.html
最新更新地址 https://gitee.com/chenjim/chenjimblog

从 adb常用命令详解–提升开发效率利器 中,我们已经知晓了 adb logcat 分析过滤关键日志的方法。本文进一步介绍日常日志分析的一些小技巧。

如何区分源码中 main system events 日志

他们有如下对应关系

类别源码中打印日志的方式
mainandroid.util.Log.i(…)
systemandroid.util.Slog.id(…)
eventsandroid.util.EventLog.writeEvent(…)

查看 Activity 生命周期日志

如下过滤 events , 可以看到 activiy 生命周期等相关日志
adb shell logcat -b events |grep wm

06-15 13:32:27.689  5940  5940 I wm_on_idle_called: com.miui.home.launcher.Launcher
06-15 13:32:27.710  2675  6055 I wm_set_resumed_activity: [0,com.miui.home/.launcher.Launcher,setFocusedTask-alreadyTop]
06-15 13:32:28.444  2675  6523 I wm_add_to_stopping: [0,166067102,com.tencent.mm/.ui.LauncherUI,makeInvisible]
06-15 13:32:28.444  2675  6523 I wm_pause_activity: [0,166067102,com.tencent.mm/.ui.LauncherUI,userLeaving=true,finishTransition]
06-15 13:32:28.461 17144 17144 I wm_on_paused_called: [0,166067102,com.tencent.mm.ui.LauncherUI,performPause,16]
06-15 13:32:28.465  2675  2721 I wm_stop_activity: [0,166067102,com.tencent.mm/.ui.LauncherUI]
06-15 13:32:28.502 17144 17144 I wm_on_stop_called: [0,166067102,com.tencent.mm.ui.LauncherUI,STOP_ACTIVITY_ITEM,19]

分析 events 日志在源码中位置

如何知晓如上日志中 wm_on_stop_called 是在哪打印的呢?

chen@U2204:~/aosp$ source build/envsetup.sh
chen@U2204:~/aosp$ cd frameworks/base/
chen@U2204:~/aosp/frameworks/base$ jgrep WmOnStopCalled
./core/java/android/app/Activity.java:8840:            EventLogTags.writeWmOnStopCalled(mIdent, getComponentName().getClassName(), reason,

如上,通过把 wm_on_stop_called转为 WmOnStopCalled ,再检索就能在 Framework 看到日志打印的位置

应用进程ID助分析具体应用

上文日志中 17144 代表 应用进程的ID,通过如下命令,可以过滤 17144 进程的所有日志
cat log.txt | grep " 17144 " 注意空格哦
cat log.txt | grep " 17144 " > 17144.log.txt 导出过滤后的日志到独立文件,以便后续分析

ProtoLog 动态开关日志

在 Framework 源码中经常可见 ProtoLog.v 相关日志
比如 frameworks/base/services/core/java/com/android/server/wm/WindowState.java
ProtoLog.v(WM_DEBUG_RESIZE,....
如果需要开启关闭相关日志,可以使用如下命令
adb shell wm logging enable-text WM_DEBUG_RESIZE WM_DEBUG_REMOTE_ANIMATIONS WM_DEBUG_ANIM WM_DEBUG_APP_TRANSITIONS_ANIM WM_DEBUG_APP_TRANSITIONS WM_DEBUG_STARTING_WINDOW WM_DEBUG_STATES WM_SHOW_SURFACE_ALLOC WM_SHOW_TRANSACTIONS WM_DEBUG_ORIENTATION
adb shell wm logging disable-text WM_DEBUG_RESIZE
更多使用方式参考 adb shell wm logging -h

Window manager logging options:start: Start proto loggingstop: Stop proto loggingenable [group...]: Enable proto logging for given groupsdisable [group...]: Disable proto logging for given groupsenable-text [group...]: Enable logcat logging for given groupsdisable-text [group...]: Disable logcat logging for given groups
Not handled, please use `adb shell dumpsys activity service SystemUIService WMShell` if you are looking for ProtoLog in WMShell

如何快速定位相关流程的代码位置

  1. 熟悉相应的模块及代码,配合IDE快捷键,定位文件+函数
  2. 通过日志的TAG,定位文件,配合 jgrep / cgrep / resgrep 等快速定位关键词位置
  3. 在一定会调用的位置,添加日志android.Util.Log.d(TAG,"out stack:"+Exception())打印函数调用的堆栈
  4. AS Debug 断点,效果同上,需要用 Android Studio 导入源码,然后选择断点的进程(需要ROOT版本),断点分析堆栈及当前变量值。
  5. adb shell dumpsys activity containersadb shell dumpsys window w 或使用 winscope,可以查看协助分析当前显示那些窗口

相关链接

  • Git配置和常用命令
  • 安卓软件开发常用命令集合
  • adb常用命令详解–提升开发效率利器
  • 安卓Framework开发快速分析日志及定位源码

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com