1.2 system_process不是进程的名称,它是DDM用于区别不同的Java App的标识,对于一般Android程序来说会被设置成包名
1.3 system_process的进程名称是system_server,就是我们通过ps可以看到的
1.4 system_server进程是zygote进程孵化的第一个Java进程
1.5 zygote进程的程序名称叫app_process。
它的代码在frameworks\base\cmds\app_process\app_main.cpp
在init.rc中可以看到它是怎样启动起来的:
startSystemServer中:
2 接下来我们来看看怎么去调试这个Android里Java层的最重要的进程,一般调试和开机调试
3 一般调试:
3.1 这种调试方法就是在Android启动完后,用adb连接Android,再调试system_process进程,实现起来是比较简单的,
3.2 无非就是在eclipse里创建一个名叫system_process的Android程序,然后在DDMS里选择system_process即可开始调试。
4 开机调试
4.1 有时我们需要调试一下system_process的初始化过程,因为上面的方法是在system_process已经初始化完之后开始调试的,用上面的方法是无能为力的,这就得另想办法。
4.2 搜索了下网络,没有找到比较实用的资源,于是自己研究了下。
4.3 其实也不是很麻烦:
找到SystemServer.java里的main函数,在函数的最开始加上几行代码:
首先通过判断/system/debug是否存在来判断是否要等待调试器连接
android.os.Debug.waitForDebugger()就是等待调试器来连接,在调试器连接上之前代码不会往下执行
但是第一行代码就比较费解了,先来解析下什么叫ddm,ddm就是Dalvik Debug Monitor的缩写
android.ddm.DdmHandleAppName.setAppName就是要设置Java App在ddm里的名称。
如果不设置的话,你在DDMS里看到的Name一栏就会有一个“?”,这个时候,eclipse找不到对应的工程,所以就没法调试了。
所以这一行代码很重要
4.5 接下来就是重新编译代码并烧录了,这个看自己使用的是什么平台。
4.6 呵呵,是不是可以开机后用adb连接,再通过eclipse调试了?
5 这种方式的唯一缺陷就是要修改源代码,这个留着以后再研究,现在要做的是好好享受一下这种调试方法。