chromium代码量很大,要梳理流程如果直接扎进去看代码,估计会看的泪崩,当然大神级别的另当别论哈。我去看罗升阳罗老师的博客很详细也不算很深,但是是边看边忘,还是自己老老实实的跟代码,再做些笔记,毕竟好记性不如烂笔头。
如下是 我在跟chromium过程中的一些手段:
1 Java代码
1.1 log打印:
使用org.chromium.base.log,用法和 android.util.Log一样 ;
1.2 打印堆栈,打印出调用关系:
Exception e = new Exception("for chromium java debug");
e.printStackTrace();
2 c++代码
2.1 log打印:
2.1.1 LOG(INFO) « “Found “«num_cookies«” cookies”,包含四种日志级别:FATAL,ERROR,WARNING,INFO。FATAL会
2.1.2 包含头文件#include <android/log.h>,调用安卓log接口
#define BR_LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, TAG, __VA_ARGS__) ;
2.2 打印调用堆栈:
在需要打印的文件中包含头文件#include "base/debug/stack_trace.h",
在需要打印堆栈函数地方调用base::debug::StackTrace().Print();
然后编译,抓取日志,从日志中应该可以抓到如下信息,将红线部分提取出来,就是我们需要的堆栈信息。
通过安卓addr2line命令将堆栈信息转为调用关系,命令如下:
./third_party/android_ndk/toolchains/arm-linux-androideabi-4.9/prebuilt/linux-x86_64/bin/arm-linux-androideabi-addr2line -e ./out/Default/lib.unstripped/libstandalonelibwebviewchromium.so addr1 addr2 ......(add1、addr2对应的是堆栈的地址);
我写了个脚本,只要将堆栈地址拷贝到文件,执行脚本就可以进行转换。脚本已经上传到到百度网盘,有兴趣的小伙伴可以下载下来看看。脚本拷贝到src目录下。百度网盘路径如下,提取码是wbev,名字是trace2line.sh:
https://pan.baidu.com/s/1R4bEVm8YgPB8xNq1bwokPA
3 devtools调试
webview apk中在oncreate 的时候创建了对象AwDevToolsServer,调用setRemoteDebuggingEnabled,开启aw_devtools_server。这样调试设备只要打开了usb调试、adb,打开webview apk运行时,就可以在电脑chrome上进行devtool调试。
在电脑chrome中输入地址,跳转到如下界面,你设备上打开的页面就可以在这里调试:
显示点击Record,然后在你debug设备上加载URL,然后停止,应该就可以看到如下左侧跟右侧的界面,在左侧选择你需要追踪的,右侧点击鼠标左键,可以看到函数调用类似如下图,用来追踪流程也是很方便的。
devtools工具对页面进行调试,可以统计各部分耗时便于性能优化,也有内存统计、分析工具便于内存的优化,此部
分调试可参照如下地址;
https://developers.google.com/web/tools/chrome-devtools
https://blog.youkuaiyun.com/z_liny/article/details/79663645
也可以通过trace进行流程跟踪, 这样比都不知道从哪儿添加日志或者堆栈更快入门。
4 通过GDB调试,GDB调试我没有在模拟器上试过,有兴趣的可以进行研究;