android init 进程源码调试探索

android 系统native进程有很多,其中比较重要的有init,zygote,installd,dex2oat等,native进程的调试是困难的,尤其是调试其初始化过程,原因是没有集成化调试环境,虽然gdb是可能的,但是对用户不具有易用性。android studio 随能调试so,但对native可执行文件无能为力。作为对比,visual studio作为宇宙最强ide,调试windows可执行文件的能力可以说是甩开android studio几条街。笔者经过研究,找到了媲美windows上的无缝调试方法。

    先上调试效果(init 进程属性系统初始化):

 先说配置环境:windows 10 + vs2017 + visualgdb5.4 + VMware15pro + ubuntu1604 + nexus5x + aosp_android-6.0.1_r67

再说为什么选择visualgdb,相比android studio,以及vscode,vs + visualgdb支持调试的汇编视图,这是调试底层问题的有力特性。虽然visualgdb不直接支持调试aosp,但经过研究和细心配置,是可以做到的。

 

再说原理:首先visualgdb支持android native进程的开发和调试,其原理是ndk用来交叉编译,调试时会通过adb上传gdbserver,gdbserver启动进程后等待客户端连接,visualgdb连接gdbserver,其内部使用运行于windows上的gdb进行远程调试。我们只用它的调试能力,不用它来编译,编译使用VMware15pro + ubuntu1604。总结来说我们使用visualgdb的三项能力来达到比肩vs在windows平台的调试体验。

第一,创建linux工程,使用自定义构建工具。构建可在配置中定义,不过因工作量不大,也可手动在ubuntu上执行命令

第二,源码和汇编级远程调试android系统的native进程的能力。其中包括条件断点,步进,步入,调用栈,变量监视,内存查看等

第三,源码导航能力,树形文件结构,F12转到定义等。(源码同步不太好使,不过影响不大)

注意:vs在一个解决方案内创建两个工程,一个是linux工程,用于映射源码目录的视图,用于查阅源码,打调试断点等,另一个android工程用于调试。二者不可能合为一个工程,二者只有以这种方式才能很好的配合。

调试android的初始化进程如init,zygote等,最理想的情形是真机正在初始化时的情形。由于init是用户态首个进程,直接调试是不可能的,因为adbd还没有启动,但理论上可以做到,因为著名的root程序magisk原理是替换init,然后启动原始init。这个工作量略大,笔者没有研究这种方式,而是在一个已完成启动的系统上启动另一个编译的init进程来调试,虽然init的运行环境改变了,但是仍然是很有价值的调试方式,因为你可以配置你自己的init运行环境。

对于zygote,这里情况就好多了,因为zygote是在adbd启动之后运行的,并且zygote可以动态停止和运行(sart zygote,stop zygote,相当于软重启),可以做到调试时与运行时环境几乎完全相同。其他进程dex2oat之类的更简单了,是按需启动,随时启动停止,丝毫不影响系统运行。

下面说说配置过程:

1.   首先你有一台高配windows物理机,内存32G,硬盘1T起步,如果你有两台机器也无需如此高配(另一个装ubuntu1604编译android,内存16G起,硬盘建议1T)我的是windows10,安装vs2017,visualgdb5.4,vmware15pro(更早的版本会让ubuntu在挂载物理硬盘时经常死机)

2. vmware15pro安装ubuntu1604,然后下载源码android-6.0.1_r67,为什么选r67呢。其实没那么严格,版本号的前两位(6.0.1的6.0)根手机运行的系统一致就好(我是说neuxs或pixel系列,其他手机可未必)因为我有点强迫症,我拿到手机(nexus5x,H790美版 H791国际版,港版貌似是H798),

先要看硬件型号(美版或国际版等)然后在找出可刷rom,并确定版本号,

      见:https://developers.google.com/android/images

然后 根据版本号,确定源码标签,     见:https://source.android.com/setup/start/build-numbers 

然后 根据版本号,获取对应的驱动,见:https://developers.google.com/android/drivers

为什么我要这么严格,因为我知道android源码经查改动得挺大,如此可最大程度减少麻烦,但经验告诉我问题都不大,所以你应该知道怎么做合适。拿到了源码标签和驱动,就可以下载源码释放驱动并编译了(只想调试init,zygote等进程的无需下载驱动,下驱动只为刷机,很不巧,我没有找到我的机器的驱动,我也不知为何没有)

           源码下载方面,国内确实存在很大障碍,请自行解决。我在此处打个广告,我有本地源码镜像可以checkout任意android版本,镜像大小444G,从android1.6到10.0,另外ndk,模拟器等都可几分钟内checkout,想要的留言,可快递copy服务。

3.  安装ubuntu1604,和编译aosp就不说了。再此提一些技巧解决问题,关于ubuntu中aosp空间规划不好的,可以挂载物理硬盘,快捷方式out目录到别的空间等方式解决。ubuntu我在本地分了300G,另外挂载了800G物理硬盘,东西太多。编译aosp

source build/envsetup.sh
lunch aosp_bullhead-eng

make -j4

4.  首次编译完android-6.0.1_r67后,修改要调试的程序或模块的优化标志增加 -O0,关闭优化,对于init位置为:

system/core/init/Android.mk:19  ,   然后重新单独编译init ,因为init是静态编译的,所以不涉及其他模块用命令:

source build/envsetup.sh
lunch aosp_bullhead-eng
mmm system/core/init
5. 在vs + visualgdb 端 新建工程,流程如下:

vs:文件:新建:项目:已安装:visualgdb:Linux Project Wizard:
名称:and600
确定:(Project Type)
    Import a project:Import a project built with other tools
Next:(Linux computer selection)
    Build the project under Linux over network:
        Remote computer: xxx@192.168.111.139
Next:[Mismatching Env...... just default (Fix)]:Source code location:
    The sources are already on 192.168.111.139:
        Source directory: /home/xxx/src-android-local/android-6.0.1_r67
Next:Source code access:
    Upload modified sources to 192.168.111.139 on each build
Next:Building and debugging:
    i don't know the main executable yet. Ask me later when istart debugging
Finish

等待完成,注意由于源码太大,请限定子目录,去除prebuild,extral 等不必要的目录,笔者保留的目录包括:

abi;art;bionic;bootable;build;CodeDB;dalvik;frameworks;libcore;libnativehelper;system;tools;*

这样总同步文件大概2g多一点。

然后创建调试工程:

解决方案:添加到解决方案
创建名为init的android控制台工程,保证此工程是调试无问题的(当无法打断点时,重启手机有效),这里巧妙的使用的与要调试的android进程init同名的工程。拷贝编译好的带符号的init文件到and_dbg601\init\obj\local\arm64-v8a,路径为:android-6.0.1_r67/out/target/product/bullhead/root/init

使用带符号的二进制,简化了调试过程,省的设置调试符号了,最后在调试工程的属性中的path mapping中设置路径映射

/home/xxx/ext800/src-android-local/android-6.0.1_r67    D:\DEBUG\and_dbg601\and601c

6.    在调试工程中设置init启动参数--second-stage,在源码工程中打开文件D:\DEBUG\and_dbg601\and601c\system\core\init\init.cpp

 最后F5 启动调试,于是本文开头的那个调试场景就出现了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值