本节将介绍如何利用Eclipse来调试Android Java Framework的核心进程SystemServer。
1. 配置Eclipse
首先要下载Android SDK。下载地址为[http://developer.android.com/sdk/index.html](http://developer.android.com/sdk/index.html)
在Linux环境下,该网站截图如图1-6所示。
:-: ![](http://img.blog.csdn.net/20150803101432799?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-6 AndroidSDK下载网页示意图
笔者下载的是Linux系统上的SDK。解压后的位置在/thunderst/disk/anroid/android-sdk-linux_x86下。
然后要为Eclipse安装ADT插件(Android Development Tools),步骤如下。
- 单击Eclipse菜单栏Help->Install New Software,输入Android ADT下载地址:https://dl-ssl.google.com/android/eclipse/, 然后安装其中的所有组件,并重启Eclipse。
- 单击Eclipse菜单栏Preferences->Android一栏,在右边的SDK Location中输入刚才解压SDK后得到的目录,即笔者设置的/thunderst/disk/anroid/android-sdk-linux_x86,最终结果如图1-7所示。
:-: ![](http://img.blog.csdn.net/20150803101340333?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-7 SDK安装示意图
- 单击Eclipse菜单栏Window->Android SDK Manager,弹出一个对话框,如图1-8所示。
:-: ![](http://img.blog.csdn.net/20150803101359895?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-8 Android SDK Manager对话框
在图1-8中选择下载其中的Tools和对应版本的SDK文档、镜像文件、开发包等。有条件的读者可以将Android 4.0.3和4.0对应的内容及Tools全部下载过来。
2. 使用Coffee Bytes Java插件
Coffee BytesJava是Eclipse的一个插件,用于对代码进行折叠,其功能比Eclipse自带的代码折叠功能强大多了。对于大段代码的研究,该插件的作用功不可没。此插件的安装和配置步骤如下:
- 单击Eclipse菜单栏Help->Install New Software,在弹出的对话框中输入[http://eclipse.realjenius.com/update-site](http://eclipse.realjenius.com/update-site) ,选择安装这个插件即可。
- 单击Eclipse菜单栏Window->Preference,在左上角输入Folding进行搜索,结果如图1-9所示。
:-: ![](http://img.blog.csdn.net/20150803101524076?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-9 Coffee Bytes Java 插件配置
在图1-9所示的对话框中,要先打开Enablefolding选项,然后从Select foldingto use框中选择CoffeeBytes Java Folding。图1-9右下部分的勾选框用来配置此插件的代码折叠功能。读者不妨按照图1-9所示来配置它。使用该插件后的示意图如图1-10所示。
如果不关心else if分支,就可以把这段代码折叠起来
:-: ![](http://img.blog.csdn.net/20150803101538943?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-10 Coffee Bytes Java插件的使用示例
从图1-10中可看到,使用该插件后,基本上代码中所有分支都可以折叠起来,该功能将帮助开发人员集中精力关注自己所关心的分支。
3. 导入Android源码
注意,这一步必须编译完整个Android源码才可以实施,步骤如下:
· 复制Android源码目录/development/ide/eclipse/.classpath到Android源码根目录。
· 打开Andriod源码根目录下的.classpath文件。该文件是供Eclipse使用的,其中保存的是源码目录中各个模块的路径。由于我们只关心Framework相关的模块,因此可以把一些不是Framework的目录从该文件中注释掉。同时,去掉不必要的模块也可加快Android源码导入速度。图1-11所示为该文件的部分内容。
:-: ![](http://img.blog.csdn.net/20150803101445385?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-11.classpath文件部分文件内容
另外,一些不必要的模块会导致后续在Eclipse中Android源码编译失败。笔者共享了一个.classpath文件,读者可从[http://download.csdn.net/detail/innost/4247578](http://download.csdn.net/detail/innost/4247578) 下载并直接使用。
单击Eclipse菜单栏New->Java Project,弹出如图1-12所示的对话框。设置Location为Android4.0源码所在路径。
:-: ![](http://img.blog.csdn.net/20150803101501172?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-12 导入Android源码示意图
由于Android 4.0源码文件较多,导入过程会持续较长一段时间,大概10几分钟左右。
注意导入源码前一定要取消Eclipse的自动编译选项(通过菜单栏Project->BuildProject Automatically设置)。另外,源码导入完毕后,读者千万不要清理(clean)这个工程。清理会删除之前源码编译所生成的文件,导致后续又得重新编译Android系统了。
4. 创建并运行模拟器
单击Eclipse菜单栏Window->AVD Manager,创建模拟器,如图1-13所示。
:-: ![](http://img.blog.csdn.net/20150803101521078?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-13 模拟器创建示意图
模拟器创建完毕后即可启动它。
5. 调试SystemServer
调试SystemServer的步骤如下:
- 首先编译Android源码工程。编译过程中会有很多警告。如果有错误,大部分原因是.classpath文件将不需要的模块包含了进来。读者可根据Eclipse的提示做相应处理。笔者配置的几台机器基本都是一次配置就成功了。
- 在Android源码工程上单击右键,依次单击Debug As->Debug Configurations,弹出如图1-14所示的对话框,然后从左边找到RemoteJava Application一栏。
:-: ![](http://img.blog.csdn.net/20150803101534400?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-14 Debug配置框示意图
- 单击图1-14中黑框中的新建按钮,然后按图1-15中的黑框中的内容来设置该对话框。
:-: ![](http://img.blog.csdn.net/20150803101703027?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-15 Remote Java Application配置示意图
由图1-15所示,需要选择Remote调试端口号为8600,Host类型为localhost。8600是SystemServer进程的调试端口号。Eclipse一旦连接到该端口,即可通过JDWP协议来调试SystemServer。
- 配置完毕后,单击图1-15右下角的Debug按钮,即可启动SystemServer的调试。
图1-16所示为笔者调试startActivity流程的示意图。
:-: ![](http://img.blog.csdn.net/20150803101610889?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
图1-16 SystemServer调试效果图
- 前言
- 第1章 搭建Android源码工作环境
- 1.1 Android系统架构
- 1.2 搭建开发环境
- 1.2.1 下载源码
- 1.2.2 编译源码
- 1.2.3 利用Eclipse调试system_process
- 1.3 本章小结
- 第2章 深入理解Java Binder和MessageQueue
- 2.1 概述
- 2.2 Java层中的Binder架构分析
- 2.2.1 Binder架构总览
- 2.2.2 初始化Java层Binder框架
- 2.2.3 addService实例分析
- 2.2.4 Java层Binder架构总结
- 2.3 心系两界的MessageQueue
- 2.3.1 MessageQueue的创建
- 2.3.2 提取消息
- 2.3.3 nativePollOnce函数分析
- 2.3.4 MessageQueue总结
- 2.4 本章小结
- 第3章 深入理解SystemServer
- 3.1 概述
- 3.2 SystemServer分析
- 3.2.1 main函数分析
- 3.2.2 Service群英会
- 3.3 EntropyService分析
- 3.4 DropBoxManagerService分析
- 3.4.1 DBMS构造函数分析
- 3.4.2 dropbox日志文件的添加
- 3.4.3 DBMS和settings数据库
- 3.5 DiskStatsService和DeviceStorageMonitorService分析
- 3.5.1 DiskStatsService分析
- 3.5.2 DeviceStorageManagerService分析
- 3.6 SamplingProfilerService分析
- 3.6.1 SamplingProfilerService构造函数分析
- 3.6.2 SamplingProfilerIntegration分析
- 3.7 ClipboardService分析
- 3.7.1 复制数据到剪贴板
- 3.7.2 从剪切板粘贴数据
- 3.7.3 CBS中的权限管理
- 3.8 本章小结
- 第4章 深入理解PackageManagerService
- 4.1 概述
- 4.2 初识PackageManagerService
- 4.3 PKMS的main函数分析
- 4.3.1 构造函数分析之前期准备工作
- 4.3.2 构造函数分析之扫描Package
- 4.3.3 构造函数分析之扫尾工作
- 4.3.4 PKMS构造函数总结
- 4.4 APK Installation分析
- 4.4.1 adb install分析
- 4.4.2 pm分析
- 4.4.3 installPackageWithVerification函数分析
- 4.4.4 APK 安装流程总结
- 4.4.5 Verification介绍
- 4.5 queryIntentActivities分析
- 4.5.1 Intent及IntentFilter介绍
- 4.5.2 Activity信息的管理
- 4.5.3 Intent 匹配查询分析
- 4.5.4 queryIntentActivities总结
- 4.6 installd及UserManager介绍
- 4.6.1 installd介绍
- 4.6.2 UserManager介绍
- 4.7 本章学习指导
- 4.8 本章小结
- 第5章 深入理解PowerManagerService
- 5.1 概述
- 5.2 初识PowerManagerService
- 5.2.1 PMS构造函数分析
- 5.2.2 init分析
- 5.2.3 systemReady分析
- 5.2.4 BootComplete处理
- 5.2.5 初识PowerManagerService总结
- 5.3 PMS WakeLock分析
- 5.3.1 WakeLock客户端分析
- 5.3.2 PMS acquireWakeLock分析
- 5.3.3 Power类及LightService类介绍
- 5.3.4 WakeLock总结
- 5.4 userActivity及Power按键处理分析
- 5.4.1 userActivity分析
- 5.4.2 Power按键处理分析
- 5.5 BatteryService及BatteryStatsService分析
- 5.5.1 BatteryService分析
- 5.5.2 BatteryStatsService分析
- 5.5.3 BatteryService及BatteryStatsService总结
- 5.6 本章学习指导
- 5.7 本章小结
- 第6章 深入理解ActivityManagerService
- 6.1 概述
- 6.2 初识ActivityManagerService
- 6.2.1 ActivityManagerService的main函数分析
- 6.2.2 AMS的 setSystemProcess分析
- 6.2.3 AMS的 installSystemProviders函数分析
- 6.2.4 AMS的 systemReady分析
- 6.2.5 初识ActivityManagerService总结
- 6.3 startActivity分析
- 6.3.1 从am说起
- 6.3.2 AMS的startActivityAndWait函数分析
- 6.3.3 startActivityLocked分析
- 6.4 Broadcast和BroadcastReceiver分析
- 6.4.1 registerReceiver流程分析
- 6.4.2 sendBroadcast流程分析
- 6.4.3 BROADCAST_INTENT_MSG消息处理函数
- 6.4.4 应用进程处理广播分析
- 6.4.5 广播处理总结
- 6.5 startService之按图索骥
- 6.5.1 Service知识介绍
- 6.5.2 startService流程图
- 6.6 AMS中的进程管理
- 6.6.1 Linux进程管理介绍
- 6.6.2 关于Android中的进程管理的介绍
- 6.6.3 AMS进程管理函数分析
- 6.6.4 AMS进程管理总结
- 6.7 App的 Crash处理
- 6.7.1 应用进程的Crash处理
- 6.7.2 AMS的handleApplicationCrash分析
- 6.7.3 AppDeathRecipient binderDied分析
- 6.7.4 App的Crash处理总结
- 6.8 本章学习指导
- 6.9 本章小结
- 第7章 深入理解ContentProvider
- 7.1 概述
- 7.2 MediaProvider的启动及创建
- 7.2.1 Context的getContentResolver函数分析
- 7.2.2 MediaStore.Image.Media的query函数分析
- 7.2.3 MediaProvider的启动及创建总结
- 7.3 SQLite创建数据库分析
- 7.3.1 SQLite及SQLiteDatabase家族
- 7.3.2 MediaProvider创建数据库分析
- 7.3.3 SQLiteDatabase创建数据库的分析总结
- 7.4 Cursor 的query函数的实现分析
- 7.4.1 提取query关键点
- 7.4.2 MediaProvider 的query分析
- 7.4.3 query关键点分析
- 7.4.4 Cursor query实现分析总结
- 7.5 Cursor close函数实现分析
- 7.5.1 客户端close的分析
- 7.5.2 服务端close的分析
- 7.5.3 finalize函数分析
- 7.5.4 Cursor close函数总结
- 7.6 ContentResolver openAssetFileDescriptor函数分析
- 7.6.1 openAssetFileDescriptor之客户端调用分析
- 7.6.2 ContentProvider的 openTypedAssetFile函数分析
- 7.6.3 跨进程传递文件描述符的探讨
- 7.6.4 openAssetFileDescriptor函数分析总结
- 7.7 本章学习指导
- 7.8 本章小结
- 第8章 深入理解ContentService和AccountManagerService
- 8.1 概述
- 8.2 数据更新通知机制分析
- 8.2.1 初识ContentService
- 8.2.2 ContentResovler 的registerContentObserver分析
- 8.2.3 ContentResolver的 notifyChange分析
- 8.2.4 数据更新通知机制总结和深入探讨
- 8.3 AccountManagerService分析
- 8.3.1 初识AccountManagerService
- 8.3.2 AccountManager addAccount分析
- 8.3.3 AccountManagerService的分析总结
- 8.4 数据同步管理SyncManager分析
- 8.4.1 初识SyncManager
- 8.4.2 ContentResolver 的requestSync分析
- 8.4.3 数据同步管理SyncManager分析总结
- 8.5 本章学习指导
- 8.6 本章小结