如何像 Chrome 调试网页那样,调试你的安卓 APP

2016-04-19 11:25:05 +08:00
 figofuture

从事移动端安卓 APP 的开发,除了代码逻辑之外就是在和数据打交道。数据的输入输出,往返于网络接口之间,流窜于内存之中存储之内,不能像编写的代码那样直接在代码编辑器中看到其具体的内容。所以如果想窥探数据的真伪对错,目前来说,不外三法。本文开始,告诉你第四条路。

现状,以及各自的问题 前面说传统上有两条路可以帮助开发者查看 APP 运行过程中处理的数据,这里简单描述下处理方式以及每种方式的优缺点。

断点调试运行中的 APP 。你可以用调试器直接调试一个 APP ,但如果这个 APP 过于庞大,初始化加载时间很久,那么,最好的调试办法是先将 APP 在设备(手机或者模拟器)上运行起来,然后用 attach to process 的方式在被调试的 APP 进程上加载调试器,这样会比一上来直接调试 APP 更快一些。想看数据的话,直接在相应代码行加上断点,附着在 APP 进程上的调试器会自动断下程序,然后查看当前上下文中各种变量的值以及内存的数据,也可以修改这些数据。但是,如果你想看某个数据是不是真的写到存储的文件里,估计需要添加额外的读取代码来查看,而且,每次给 APP 挂调试器查看数据,感觉还是有些不方便。如果你想诊断和分析网络的访问速度和数据的流量,数据存储的空间和总体数据量,单靠调试这种手段显得力不从心了。而且如果断点的地方在 UI 的某处代码,长时间处于断点状态查看数据,会导致 APP 发生 ANR 的异常。

加打印日志。类似产品运营的埋点和服务端访问/操作日志,我们也可以在客户端 APP 相应的位置大书类似到此一游和此地无淫三百靓的句式,让 APP 进程通过一个叫控制台的老东西( console 是计算机世界的老司机了,啥大风大浪没见过的)告诉我们发生了啥,如何发生的,以及发生的结果如何。断点不好做到的网络访问速度和数据流量等东西也可以通过日志叫唤了。这么看起来,貌似加日志已经是一种很完美的办法了。但是,你有没有感觉到这样超级麻烦?首先是你的代码量突然变大了,代码结构变丑了,代码环境卫生变差了,翠花上的酸菜我不敢吃了。相信我,日志海(骷髅海的代码态)一定会让你疲惫的双眼犹如狂风暴雨里的一叶孤舟,说翻就翻,眼都不带眨一下的。说人话,日志是一种侵入式的调试手段,啥叫侵入式?就是它必须由您老人家亲自动手埋藏在代码的心房里,直到天荒地老, APP 下架,它也不会化作半点春泥更护花的。而对于调试来说,看日志的情调 less than lower ,千篇飞过如同嚼蜡。看过安卓日志的童鞋都知道,前尘往事并木有渺云烟,那些个天天在微信群里大呼小叫的群主来看看到底啥叫刷屏。可怜的安卓开发们,天天被日志刷屏。

借助第三方工具。对于网络来说,基本就是设置代理,最常用的不外乎 Charles (收费,基于 Java 开发,跨平台); Fiddler (免费&收费,基于.Net 开发,目前支持通过 mono 的方式运行在 Mac 和 Linux 上); Mitmproxy (免费&开源,基于 Python 开发,跨平台);还有比较麻烦的办法,比如 Http/Https 代理+ Wireshark/tcpdump 这种。这些工具只能满足网络监控,对于非网络数据就无能为力了。对于存储在手机上的数据,可以通过 adb 登陆到手机,获得 root 权限后查看 APP 内部数据,也可以采用一些安装在手机端的带图形界面的 APP 来查看和修改数据,比如 SQLEditor 之类的,这类 APP 同样需要获取 root 权限。

那么,后来, Facebook 给我们这些可怜的娃带来了福音和福利,试试看咯

听诊器来了 Stetho 英译为“听诊”,是 Facebook 研发的安卓 APP 网络诊断和数据监控的框架,目前已经开放源代码,开发者接入 Stetho 框架提供的 SDK 到 APP 中,这样就可以通过安装在开发机( PC/MAC , Windows/OS X/Linux )上安装的谷歌的 Chrome 开发者工具(通过 Chrome 浏览器使用)来查看,诊断和分析 APP 中发生的网络请求和响应以及数据内容,就像用 Chrome 调试网站一样调试 APP 程序。当然,几乎任何工具都自带老司机 console , Stetho 也不例外,它提供了一个叫做 dumpapp 的工具,可以向你倾述更多的 APP 内心世界。

欲知后事,请点击 http://www.figotan.org/2016/04/18/using-stetho-to-diagnose-data-on-android/

11974 次点击
所在节点    Android
10 条回复
kamen
2016-04-19 12:04:54 +08:00
软文,还特别长,大家都散了吧
chairuosen
2016-04-19 12:09:22 +08:00
不是软文,还不错
figofuture
2016-04-19 12:11:47 +08:00
@kamen 亲身实践的,怎么会是软文呢?主要是为了介绍 Facebook 开源的 Stetho 工具来的。
dphdjy
2016-04-19 12:14:41 +08:00
不是软文,但是。。。大概开发的基本都知道了才对~
dphdjy
2016-04-19 12:15:28 +08:00
不过。。。_(:з)∠)_ 好拖沓的文章。。。
kamen
2016-04-19 12:22:02 +08:00
@figofuture 好吧,我为自己的言论道歉,不过这文章也太拖沓了吧?
Light3
2016-04-19 13:19:40 +08:00
= = 看了点别的 不错
MASAILA
2016-04-19 13:54:48 +08:00
文章写的不错的 其实不用全文转载 贴个 url 就好了
Exin
2016-04-19 14:47:39 +08:00
借地问一句:我用 Android Studio 调试 App 的时候,加断点经常导致 App 在断点之后无故退出且没有错误日志。有人遇到过吗?
morning
2016-04-19 17:37:11 +08:00
@Exin 把最右边的过滤去掉应该能看到

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/272190

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX