Android Debugging
安卓调试新纪元
安卓(ANDROID)是在手机、平板等移动设备上流行的软件系统。内核使用的是LINUX,有特色的部分主要在用户空间,也就是所谓的Android Framework。
长期问题
因为安全方面的考虑,一般不能直接在安卓系统本机运行终端程序,只能通过adb的方式从另一台机器连接,进行有限的一些操作。而adb方式在产品阶段一般也常被禁止掉。
如果要使用gdb的话,那么一般要在安卓系统里运行gdbserver,然后在另一台机器上远程调试。
因为安卓系统的libc是谷歌开发的bionic,不是流行的glibc,所以gdbserver也不是随便找一个就能用,一般要是安卓系统的相同构建环境构建出来的(“原配”)。
一核双头
去年在解决幽兰代码本上如何支持微信的问题时,格蠹的小伙伴尝试了很多种方法。综合评估后,基于Waydroid容器的方法脱颖而出。
Waydroid是和Docker类似的容器技术,都是基于Linux内核的cgroup机制实现的。使用Waydroid,可以把安卓系统运行在Linux内核之上,仿佛给Linux内核又长出一个头来。
上帝视角
有了Waydroid方案,就可以直接把安卓应用的APK安装包复制到幽兰代码本上,简单双击就可以安装,参见格蠹小伙伴写的文档:《在幽兰上安装微信》( https://www.nanocode.cn/wiki/docs/youlan/wechat )。
更重要的是,以这种方式运行安卓后,所有的安卓进程都可以在Linux系统中看到,执行以下top或者ps等命令,就一目了然。
比如,下面是启动微信后,执行top命令,可以看到微信的界面进程排在top进程列表第一个。
10年前在英特尔工作时,有一段时间是要调试安卓应用的,当时不得不依赖远程连接的方法,必须使用adb才能看到看到安卓的进程,感觉总是隔了一层。也感觉安卓的进程一个个都桀骜不驯,一个个仿佛高高在上似的。所以当我第一次看到它们都乖乖地出现在普通的top窗口里时,感觉非常痛快。
要知道,adb小虽然也可以执行ps、top等常用命令,但都是被谷歌阉割过的版本,少了很多功能,很是不爽。
降维调试
当然,老的格友可能已经猜到,还有一个超爽的好处,那就是可以直接上gdb了。
比如,启动微信后,打开一个终端窗口,ps -A找到微信的进程ID,然后一条sudo gdb --pid就可以调试微信了。
我正是用这种方法,找到了微信进程的几个问题,特别是段错误和高功耗的问题。
值得说明的是,上述方法不仅可以调试安卓应用,还可以调试安卓的后台服务,也就是所谓的安卓框架。当然也包括调试安卓的基础库,比如bionic,Dalvik等。
好的软件是调试出来,一个不方便调试的系统会大大制约软件开发的效率。安卓系统为了安全性牺牲了普通Linux系统的灵活性和很多调试能力。
上面介绍的调试方案,不需要网络,不需要gdbserver,不需要虚拟机,可以在同一台物理机器上以“上帝视角”看到所有安卓的进程,直接访问安卓系统的所有文件,而且可以直接上gdb调试器,这绝对是把安卓系统的调试效率提升到了一个新高度。
本周三晚上,我将以直播方式演示这种新的调试方法,欢迎感兴趣的同行上线交流。
1
END
1
正心诚意,格物致知
以人文情怀审视软件,以软件技术改变人生
格友公众号
盛格塾小程序
扫描上方二维码或在微信中搜索“盛格塾”小程序
可以阅读更多文章和有声读物
往期推荐