android 真机调试原始的init进程
init作为android用户态启动的第一个进程,是难以直接调试的,之前的文章讲了如何调试单独启动的init,参见(https://blog.****.net/lslxfhc/article/details/106076437),也就是在系统启动完成之后再启动一个init,这时候系统环境完全变了,不是init执行的原始环境了,调试起来并不能了解init真正的执行过程。
现在我介绍如何直接调试原始的init进程。虽然还是不能调试init的初始化,但其所接收命令的执行过程是可调试的,且是原汁原味的。先上个效果图:
这是中断所有进程后,init进程正在等待
下面是,发出stop zygote后,init进程接收到命令:
简述基本的配置过程:更详细的配置过程参见(https://blog.****.net/lslxfhc/article/details/106076437)
环境:windows10 + vs2017 + visualgdb + nexus5x
1. 首先 nexus5x 解锁后刷官方rom android 601,然后编译aosp android601针对bullhead的eng版本,修改init的优化标志为-O0,也就是完全关闭优化,把编译好的init,打包进magisk包,nexus5x刷twrp后,用twrp刷打包好的magisk包,这样neuxs5x就同时获得了product 版rom,可隐藏的root,与调试要用的aosp源码匹配的init的定制版。
-----这里说下,用magisk的优点,可对应用隐身,以及隐藏root,以及绕过safety-net,magisk替换init是magisk官方不支持的,这是本人研究magisk源码的成果。详见:https://blog.****.net/lslxfhc/article/details/106169097
2. visualgdb 创建一个linux交叉编译工程,连接到ubuntu1604上,自动同步android源码,本工程解决方案自动创建,再创建一个visualgdb的android工程,名称为init,选择execute工程,将工程添加到同一个解决方案。
3. 将init编译一次,并确保能正常调试这个无功能的init小程序,然后把aosp编译的init的符号文件android-6.0.1_r67/out/target/product/bullhead/symbols/init 覆盖到init小程序的符号目录中 init\obj\local\arm64-v8a/init ,然后是设置源码路径映射,因为aosp源码编译时路径和调试机也就是windows上不同,所以需要设置,否则调试器无法找到源码,源码上打断点也不会生效。再然后是android的调试设置为手动attach,因为init进程已经启动了。如下图:
最后当然是f5了,注意提示工程过期,不要编译,否则覆盖的init符号文件就失效了,然后双击init进程,如下:
现在你可以在vs中找到init的源码打断点,愉快的调试了