如何像 Chrome 调试网页那样,调试你的安卓 APP - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
figofuture

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

  •  
  •   figofuture Apr 19, 2016 15414 views
    This topic created in 3659 days ago, the information mentioned may be changed or developed.

    从事移动端安卓 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/

    10 replies    2016-04-19 17:37:11 +08:00
    kamen
        1
    kamen  
       Apr 19, 2016 via Android
    软文,还特别长,大家都散了吧
    chairuosen
        2
    chairuosen  
       Apr 19, 2016
    不是软文,还不错
    figofuture
        3
    figofuture  
    OP
       Apr 19, 2016
    @kamen 亲身实践的,怎么会是软文呢?主要是为了介绍 Facebook 开源的 Stetho 工具来的。
    dphdjy
        4
    dphdjy  
       Apr 19, 2016 via Android
    不是软文,但是。。。大概开发的基本都知道了才对~
    dphdjy
        5
    dphdjy  
       Apr 19, 2016 via Android
    不过。。。_(:з)∠)_ 好拖沓的文章。。。
    kamen
        6
    kamen  
       Apr 19, 2016 via Android
    @figofuture 好吧,我为自己的言论道歉,不过这文章也太拖沓了吧?
    Light3
        7
    Light3  
       Apr 19, 2016
    = = 看了点别的 不错
    MASAILA
        8
    MASAILA  
       Apr 19, 2016
    文章写的不错的 其实不用全文转载 贴个 url 就好了
    Exin
        9
    Exin  
       Apr 19, 2016
    借地问一句:我用 Android Studio 调试 App 的时候,加断点经常导致 App 在断点之后无故退出且没有错误日志。有人遇到过吗?
    morning
        10
    morning  
       Apr 19, 2016
    @Exin 把最右边的过滤去掉应该能看到
    About     Help     Advertise     Blog     API     FAQ     Solana     1028 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 23:05 PVG 07:05 LAX 16:05 JFK 19:05
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86