Android System_server

本文详细解析了Android系统中ActivityManagerService(AMS)和WindowManagerService(WMS)的启动过程,包括AMS的启动配置、关键步骤及WMS的初始化和服务启动流程。

AMS的启动

AMS指的是ActivityManagerService服务,这个是android提供的系统管理服务,所有的进程、组件相关的管理都在这个服务中实现,先来看一下它是怎么启动的:

  • 1.调用构造方法,初始化AMS
  • 2.调用setSystemServiceManager()和setInstaller()配置系统服务管理器和包安装器
  • 3.调用initPowerManagement()初始化power相关
  • 4.调用setSystemProcess()方法,配置自己成为apk进程,从此可以运行apk
  • 5.调用installSystemProviders()方法安装系统的ContentProvider
  • 6.调用setWindowManager()方法配置WMS
  • 7.调用systemReady()处理系统启动完毕消息 
    其中的1、4、5、7是重点讲解的过程,其他的过程只是简单的设置,大家有时间可以看一下即可
AMS的构造
  • 1.创建main handler 线程
  • 2.创建两个广播队列BroadcastQueue,一个前台广播用,前台广播超时时间为10s,一个后台广播用,后台广播超时时间为60s
  • 3.创建ActiveServices,管理ServiceRecord的生命周期
  • 4.创建AppErrors,处理app crash等问题
  • 5.创建ActivityStackSupervisor,管理ActivityStack TaskRecord ActivityRecord
  • 6.创建ActivityStarter,负责启动Activity的管理
  • 7.创建RecentTasks,管理当前所有的Task
  • 8.创建cpu tracker 线程,监测cpu使用信息
  • 9.将自己添加到WatchDog系统,监测死锁问题
setSystemProcess()方法
  • 1.添加binder服务:meminfo gfxinfo dbinfo cpuinfo,这写服务可以用于调试,查看系统状态
  • 2.查询ApplicationInfo并且加载运行
  • 3.创建进程记录表,添加到mPidsSelfLocked容器,从这个时候开始加上启动AMS之前调用SystemServer::createSystemContext()创建的apk今晨骨架,system_server进程除了提供系统服务,本身也包含了apk进程的功能,可以运行apk
installSystemProviders()方法
  • 1.查询出系统apk的所有的ContentProvider信息
  • 2.调用ActivityThread::installSystemProviders()安装所有的ContentProvider
systemReady()方法
  • 1.发送system ready消息给子系统
  • 2.置mSystemReady标志为true
  • 3.查询出不允许系统booting时启动的进程全部kill掉
  • 4.如果是工厂模式,更改默认的top action
  • 5.调用retrieveSettings()方法配置系统
  • 6.调用startPersistentApps()启动persistent进程
  • 7.调用startHomeActivityLocked()启动launcher
  • 8.发送ACTION_USER_STARTED广播

WMS的启动

WMS是指WindowManagerService,负责视窗系统管理,所有的窗体的显示都是在这里控制,它的启动流程如下:

  • 1.调用构造方法,初始化WMS
  • 2.调用displayReady()方法初始化display
  • 3.调用systemReady()方法处理系统启动完毕消息
  • 4.调用computeNewConfiguration()方法计算一次,然后配置到上下文中
Android 系统中,`system_server` 是系统核心进程之一,负责运行大部分系统服务(如 ActivityManagerService、WindowManagerService 等),其日志通常记录在 `logcat` 或者 `main` 日志缓冲区中。然而,有时开发者会遇到 `system_server` 的日志不显示或无法正常查看的问题,这可能由多种原因引起。 ### 日志不显示的常见原因 1. **日志缓冲区大小限制** Android 系统中的 `logcat` 缓冲区有大小限制(默认为 1MB 或更大,取决于设备配置),当缓冲区满时,旧的日志会被覆盖。在系统崩溃或 ANR(Application Not Responding)等异常场景下,关键日志可能已经被覆盖,导致无法查看到完整的 `system_server` 日志 [^1]。 2. **日志级别过滤** 默认情况下,`logcat` 显示的可能是 `info` 或 `warn` 级别的日志。如果 `system_server` 的日志输出级别较高(如 `verbose` 或 `debug`),则需要调整日志过滤级别才能看到相关输出。 3. **系统日志服务崩溃或阻塞** 在某些情况下,`system_server` 自身可能因为 ANR 或 Crash 而中断,导致日志服务(如 `logcat` 或 `logger` 驱动)无法正常工作。例如,引用中提到 `system_server` 因为 ART 库问题导致崩溃,从而中断了日志输出 [^2]。 4. **权限限制** 在非 root 设备上,普通应用可能无法访问完整的系统日志(尤其是 `system_server` 所属的日志内容),这会导致 `logcat` 显示受限。需要 `READ_LOGS` 权限或者 root 权限才能查看完整的系统日志。 5. **日志输出被禁用或优化** 在某些定制 ROM 或发布版本中,厂商可能为了性能优化或安全考虑,关闭了部分调试日志的输出,特别是 `system_server` 中的详细调试信息。 --- ### 解决方案与排查方法 1. **使用 `logcat` 指定缓冲区和级别查看日志** 可以通过指定缓冲区(如 `main` 或 `system`)以及日志级别来查看 `system_server` 的日志: ```bash adb logcat -b main -v threadtime *:D ``` 其中 `-b main` 表示查看主日志缓冲区,`*:D` 表示显示所有标签的 Debug 级别日志。 2. **检查 `system_server` 是否崩溃或被重启** 如果 `system_server` 发生了 Crash,系统会自动重启该进程,导致日志中断。可以通过以下命令查看系统重启时间及崩溃信息: ```bash adb shell dumpsys alarm adb shell dumpsys batterystats ``` 3. **使用 `dmesg` 查看内核日志** 在某些情况下,`system_server` 的崩溃可能与内核有关,例如内存不足或线程挂起。可以使用 `dmesg` 查看内核日志以辅助排查: ```bash adb shell dmesg ``` 4. **启用 `bugreport` 或 `bugreportz` 抓取完整日志** 当发生系统级异常时,建议使用 `bugreport` 抓取完整的系统状态和日志信息: ```bash adb bugreport > bugreport.zip ``` 该命令会生成一个包含 `logcat`、`dumpsys`、`dmesg` 等信息的压缩包,便于后续分析。 5. **检查 SELinux 策略限制** 在某些设备上,SELinux 策略可能限制了日志的输出。可以通过临时设置 SELinux 为 `permissive` 模式进行测试: ```bash adb shell setenforce 0 ``` 6. **修改系统属性启用更多日志输出** 可以尝试修改系统属性以启用更多调试日志,例如: ```bash adb shell setprop persist.log.tag SystemServer VERBOSE ``` 该命令将启用 `SystemServer` 类的详细日志输出。 --- ### 总结 `system_server` 日志无法显示的问题通常与日志缓冲机制、系统服务状态、权限限制或日志级别设置有关。通过合理使用 `logcat`、`bugreport`、`dmesg` 等工具,并结合系统状态信息进行综合分析,可以有效定位问题根源。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值