app和SystemPRocess调试方案
1 简要说明 4 2 环境要求 4 3 SettingsApp演示调试 4 4 SystemProcess演示调试 8
1 简要说明 为了解决应用问题,有时我们需要调试应用。相比打印log来说,联调的优势在于,它能够实时的去观测变量的变化,去更加直观,更加便捷的看出问题所在,此文便是解决此问题产生。 主要分为两部分来讲解,一部分为app调试,一部分为系统SystemProcess(主要调试 AMS WMS等系统服务代码)
2环境要求 开发手机一部,eng版本。 eclipse 调试环境 代码
3SettingsApp演示调试 首先,我们打开 eclipse,新建一个工程,应用名为test,我们可以看到包名为 com.example.test 我们修改下代码: 将activity_main.xml改为:
MainActivity.java 加入:
下来我们来在settext上面打上断点,手机连上电脑,右键左侧的工程名(test)选择debug As 选择第一个应用程序,选中手机设备。 随后我们便会发现我们断点打在了text_id.setText(“test app “); 这一行。 我们点击F5选择跟入, 会发现系统提示我们找不到TextView.java代码。
我们这里点击Attach Source,进行选择代码位置:
我们在settext函数设置断点。 然后我们点击工程名,右键选择debug As 选择应用程序即可,找到连接的手机,开始调试。 我们会发现代码断点起作用,停在settext那行,然后我们点击F5进行跟入。 会有个界面:
我们点击Attact Source 去找到TextView代码。
这里有一个需要注意的地方: 我们来看下TextView.java的对应包名,package android.widget; 所以我们在选择路径的时候,要选择在android/widget的父类,如此以来,系统才会从给出的路径,去找对应的包路径下的TextView.java。 演示的为: 然后我们点击OK,会发现代码出来了。
然后你继续跟进就可以了。
这个就是一个简单的调试,解决的是可以编译过的app.然而我们系统的app基本放在eclipse无法编译过的。下来我们来说这个怎么调试。
先说下调试依据:
eclipse调试代码,是不依赖代码是否编译过的,只依赖两个参数:一个是app包名,一个 是代码,我们就来演示测试下如何来调试系统settings里面的TextView.java
新建一个工程,将包名写为:com.android.settings
下一步下一步即可。 我们将我们工程里面的textView.java 复制过来,如下目录放置好(目录为包路径)
我们可以看到,这个是报错的,我们不管。我们在它的构造函数处打断点。(700多行) 下来我们直接去调试Settings即可。 在ec的菜单项找到Window,点击Show view 然后再点击最后的other,
选择这个,然后我们能看到这个列表:
我们找到Settings包,然后选中,点击右上面的那个虫子,因为我们有com.android.Settings包名的项目,因此便调试上了。 我们来启动Settings,看下是否能在TextView源码上。 事实如此,可以调试Settings代码了。系统里面的控件View都是可以直接打断的(因为这些控件View都是运行在Settings进程内部的)
好了,就到这里,应用调试就是如此简单。
4SystemProcess演示调试 我们演示下调试activity的启动过程即可.因为SystemProcess不是app进程,不能使用上面的方式调试,我们需要使用端口直接联调,下来我们开始操作。
新建一个java工程(这里强调,是个java 工程),名字随意,这里我写为Systemserver。
创建完成后,我们将 frameworks/base/services/core/java/com/android/server/am 复制到本地,在Systemserver这个工程下,创建一个目录,为am里面的包名(重点,包名)
最终显示如上,然后我们找到ActivityStarter.java,在里面的startActivityLocked函数打上断点。
关键部分来了: 我们在DDMS里面找到system_process(AMS运行在这个进程),去看下它的进程调试端口. 这里为8602,然后我们回到项目这边来,选中项目,点击右键,出来的选择debug as 继续选择debug Configurations,找到最后的Remote java application, 点击它:
这里需要改下port 为我们上面记住的system process的端口号,这里为8602。 然后选择勾上Allow te……of remote VM
然后此时我们去DDMS去看,会发现我们的 前面有个虫子,则是调试上了。
此时我们运行随便启动一个activity,则会发现我们断点起作用了,被拦住。
此文就到这里。
新闻热点
疑难解答