
特别申明:本文仅供自己学习记录使用,所写内容来自各网页,如需转载自己去查找内容出处。如有侵权请联系在下,评论、私信等不论。
目录
一、system_server
1.简介
2.SystemServer中启动服务列表
3.服务的添加
4.应用端服务的调用
二、dumpsys命令
1.dumpsys命令用法
2.dumpsys activity 介绍
1 简介
2.dumpsys activity
三、service中dump函数
SystemServer的进程名实际上叫做“system_server”,通常简称为SS。
系统中的服务驻留在其中,常见的比如WindowManagerServer(Wms)、ActivityManagerSystemService(AmS)、 PackageManagerServer(PmS)等,这些系统服务都是以一个线程的方式存在于SystemServer进程中。 SS是由Zygote通过Zygote.forkSystemServer函数fork诞生出来的。与Zygote生死与共.SS诞生后,便和生父Zygote分道扬镳,它有了自己的历史使命。 ZygoteInit分裂产生的SS,其实就是为了调用com.android.server.SystemServer(SystemServer.java)的main函数:其中主要调用init1,init2函数.启动了 c++运行时库,如:sqllite,OpenGL ES等,然后把调用线程加入Binder通信中。init2在Java层,就是单独创建一个线程,用以启动系统各项服务,如:ActivityManagerService,PowerManagerService,BatteryService,WindowManagerService。这些服务都是线程,在SystemServer进程中.
这部分的服务大部分都有一个供应用进程使用的manager类,这就是一个RPC调用,用户通过调用xxxManager的方法,实际上被Binder给
迁移到system_server进程中对应的xxxManagerService中对应的方法,并将结果再通过binder带回。xxxManager的实现可参考CSDN : service_system
| 服务类名称 | 描述 | 对应的代理类 |
| EntropyService | 提供伪随机数 | |
| PowerManagerService | 电源管理服务 | PowerManager |
| ActivityManagerService | 最核心的服务之一,管理 Activity | ActivityManager |
| TelephonyRegistry | 通过该服务注册电话模块的事件响应,比如重启、关闭、启动等 | TelephonyManager |
| PackageManagerService | 程序包管理服务 | PackageManager |
| AccountManagerService | 账户管理服务,是指联系人账户,而不是 Linux 系统的账户 | AccountManager |
| ContentService | ContentProvider 服务,提供跨进程数据交换 | ContentResolver |
| BatteryService | 电池管理服务 | |
| LightsService | 自然光强度感应传感器服务 | |
| VibratorService | 震动器服务 | SystemVibrator |
| AlarmManagerService | 定时器管理服务,提供定时提醒服务 | AlarmManager |
| WindowManagerService | framework 最核心的服务之一,负责窗口管理 | WindowManager |
| BluetoothService | 蓝牙服务 | BluetoothDevice |
| DevicePolicyManagerService | 提供一些系统级别的设置及属性 | DevicePolicyManager |
| StatusBarManagerService | 状态栏管理服务 | StatusBarManager |
| ClipboardService | 系统剪切板服务 | |
| InputMethodManagerService | 输入法管理服务 | InputMethodManager |
| NetStatService | 网络状态服务 | |
| NetworkManagementService | 网络管理服务 | NetworkManagement |
| ConnectivityService | 网络连接管理服务 | ConnectivityManager |
| ThrottleService | 暂不清楚其作用 | |
| AccessibilityManagerService | 辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果 | AccessibilityManager |
| MountService | 挂载服务,可通过该服务调用 Linux 层面的 mount 程序 | |
| NotificationManagerService | 通知栏管理服务, Android 中的通知栏和状态栏在一起,只是界面上前者在左边,后者在右边 | NotificationManager |
| DeviceStorageMonitorService | 磁盘空间状态检测服务 | DeviceStorageMonitor |
| LocationManagerService | 地理位置服务 | LocationManager |
| SearchManagerService | 搜索管理服务 | SearchManager |
| DropBoxManagerService | 通过该服务访问 Linux 层面的 Dropbox 程序 | DropBoxManager |
| WallpaperManagerService | 墙纸管理服务,墙纸不等同于桌面背景,在 View 系统内部,墙纸可以作为任何窗口的背景 | WallpaperManager |
| AudioService | 音频管理服务 | |
| BackupManagerService | 系统备份服务 | BackupManager |
| AppWidgetService | Widget 服务 | |
| RecognitionManagerService | 身份识别服务 | RecognitionManager |
| DiskStatsService | 磁盘统计服务 |
方法一:使用Broadcast
我们知道使用Broadcast广播可以实现跨进程的消息传递,一些系统服务也使用了这种方法。如电池管理服务BatteryManagerService,收到底层上报的电池状态变化信息时,就将当
前的电池状态封装在一个Intent里,action为android.intent.action.BATTERY_CHANGED。应用只要注册一个对应的BroadcastReceiver就可以收到BatterManagerService发送的电池状态信息。
方法二:通过代理类
在本地应用建立其对象,如ActivityManager,PowerManager,LocationManager的对象,通过其即可调用对应的服务。实例如下:
//获得定位服务
LocationManager locationManager =
(LocationManager) getSystemService(Context.LOCATION_SERVICE);
//定义定位监听器
LocationListener locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
//监听到位置信息
}
...
};
//注册监听器
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
0, 0, locationListener); |
hint:使用AIDL定义一套接口,由系统服务端实现这些接口,应用端使用一个相应的代理就可以访问系统服务的接口,那反过来让应用端实现AIDL接口,系统服务端使用代理调用应用端
的接口。可参考:CSDN : service_system.
可通过dumpsys命令查询系统服务的运行状态(对象的成员变量属性值),命令格式:dumpsys 服务名,更多服务名查看表一、二。 例如:
dumpsys activity //查询AMS服务相关信息 dumpsys window //查询WMS服务相关信息 dumpsys cpuinfo //查询CPU情况 dumpsys meminfo //查询内存情况
可查询的服务有很多,可通过下面任一命令查看当前系统所支持的dump服务:
adb shell dumpsys -l adb shell service list
表一:
| 服务名 | 类名 | 功能 |
|---|---|---|
| activity | ActivityManagerService | AMS相关信息 |
| package | PackageManagerService | PMS相关信息 |
| window | WindowManagerService | WMS相关信息 |
| input | InputManagerService | IMS相关信息 |
| power | PowerManagerService | PMS相关信息 |
| batterystats | BatterystatsService | 电池统计信息 |
| battery | BatteryService | 电池信息 |
| alarm | AlarmManagerService | 闹钟信息 |
| dropbox | DropboxManagerService | 调试相关 |
| procstats | ProcessStatsService | 进程统计 |
| cpuinfo | CpuBinder | CPU |
| meminfo | MemBinder | 内存 |
| gfxinfo | GraphicsBinder | 图像 |
| dbinfo | DbBinder | 数据库 |
表二:
| 服务名 | 功能 |
|---|---|
| SurfaceFlinger | 图像相关 |
| appops | app使用情况 |
| permission | 权限 |
| processinfo | 进程服务 |
| batteryproperties | 电池相关 |
| audio | 查看声音信息 |
| netstats | 查看网络统计信息 |
| diskstats | 查看空间free状态 |
| jobscheduler | 查看任务计划 |
| wifi | wifi信息 |
| diskstats | 磁盘情况 |
| usagestats | 用户使用情况 |
| devicestoragemonitor | 设备信息 |
| … | … |
参考:简书
1.1 命令格式
dumpsys activity [options] [WHAT]
其中options为可选项,以-开头, 主要有以下几类:
| options | 含义 |
|---|---|
| -a | 包括所有可用Server状态 |
| -c | 包括Client状态,即App端情况 |
| -p PACKAGE | 限定输出指定包名 |
1.2 WHAT参数
列举常见的WHAT参数:
| 序号 | WHAT | 解释 | 对应源码 |
|---|---|---|---|
| 1 | a[ctivities] | activity状态 | dumpActivitiesLocked() |
| 2 | b[roadcasts] [PACKAGE_NAME] | broadcast状态 | dumpBroadcastsLocked() |
| 3 | s[ervices] [COMP_SPEC …] | service状态 | newServiceDumperLocked().dumpLocked |
| 4 | prov[iders] [COMP_SPEC …] | content provider状态 | dumpProvidersLocked() |
| 5 | p[rocesses] [PACKAGE_NAME] | 进程状态 | dumpProcessesLocked() |
| 6 | o[om] | 内存管理 | dumpOomLocked() |
| 7 | i[ntents] [PACKAGE_NAME] | pending intent状态 | dumpPendingIntentsLocked() |
| 8 | r[ecents] | 最近activity | dumpRecentsLocked() |
| 9 | perm[issions] | URI授权情况 | dumpPermissionsLocked() |
| 10 | all | 所有activities信息 | dumpActivity() |
| 11 | top | 顶部activity信息 | dumpActivity() |
| 12 | package | package相关信息 | dump() |
其中PACKAGE_NAME是指可跟包名,COMP_SPEC是指可跟具体组件信息,中括号是指缩写字母;
前面介绍dumpsys activity根据后面跟着的不同参数则输出相应的内容,当不跟任何参数, dumpsys activity等价于依次输出下面8条命令:
dumpsys activity intents dumpsys activity broadcasts //广播 dumpsys activity providers //provider dumpsys activity permissions dumpsys activity services //服务 dumpsys activity recents dumpsys activity activities //activity dumpsys activity processes
依次简要说明这8条命令:
2.1 intents
//标志性开头,dumpPendingIntentsLocked ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)
输出对象:
2.2 broadcasts
//标志性开头,dumpBroadcastsLocked
ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)
Registered Receivers:
Receiver Resolver Table:
Historical broadcasts [foreground]:
Historical broadcasts summary [foreground]:
Historical broadcasts [background]:
Historical broadcasts summary [background]:
Sticky broadcasts
mHandler
主要输出的对象:
2.3 provider
//标志性开头,dumpProvidersLocked
ACTIVITY MANAGER ConTENT PROVIDERS (dumpsys activity providers)
Published single-user content providers (by class):
Published user [n] content providers (by class):
Single-user authority to provider mappings:
User [n] authority to provider mappings:
主要输出的对象:
2.4 permissions
//标志性开头,dumpPermissionsLocked ACTIVITY MANAGER URI PERMISSIONS (dumpsys activity permissions)
主要输出的对象:
2.5 Service
//标志性开头,newServiceDumperLocked().dumpLocked ACTIVITY MANAGER SERVICES (dumpsys activity services)
主要输出的对象:
2.6 recents
//标志性开头,dumpRecentsLocked ACTIVITY MANAGER RECENT TASKS (dumpsys activity recents)
主要输出的对象:
2.7 activities
//标志性开头,dumpActivitiesLocked
ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)
Display #0 (activities from top to bottom):
Stack #0:
Task id #[n]
* Hist #[m]:
Stack #1:
主要输出的对象:
输出格式样例:
//{Hashcode #TaskId Affinity UserId 该task的Activity个数};
TaskRecord{e6d7a8e #156 A=com.gityuan.demo U=0 sz=1}
userId=0 effectiveUid=1000 mCallingUid=1000 mCallingPackage=android
realActivity=com.gityuan.demo/.Blog
//ProcessRecord{Hashcode pid:进程名/uid}
ProcessRecord{7c8a2af 12265:com.gityuan.demo/1000}
2.8 processes
//标志性开头,dumpProcessesLocked
ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)
All known processes:
Isolated process list (sorted by uid):
UID states:
UID validation:
Process LRU list (sorted by oom_adj, 60 total, non-act at 2, non-svc at 2):
PID mappings:
Foreground Processes:
主要输出的对象:
参考:个人博客