android SystemServer详解
文章出处:http://blog.csdn.net/shift_wwx
前言:在之前android systemserver启动详解中大概分析了一下systemserver的启动过程,可以很清晰的看到system_server进程是通过zygote fork()而来。那在SystemServer中做了些什么事情,结合code继续分析。
通过之前的分析,最终会通过ZygoteInit调用SystemServer.main()。
@/frameworks/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) { /* * In case the runtime switched since last boot (such as when * the old runtime was removed in an OTA), set the system * property so that it is in sync. We can't do this in * libnativehelper's JniInvocation::Init code where we already * had to fallback to a different runtime because it is * running as root and we need to be the system user to set * the property. http://b/11463182 */ SystemProperties.set("persist.sys.dalvik.vm.lib", VMRuntime.getRuntime().vmLibrary()); if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) { // If a device's clock is before 1970 (before 0), a lot of // APIs crash dealing with negative numbers, notably // java.io.File#setLastModified, so instead we fake it and // hope that time from cell towers or NTP fixes it // shortly. Slog.w(TAG, "System clock is before 1970; setting to 1970."); SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME); } if (SamplingProfilerIntegration.isEnabled()) { SamplingProfilerIntegration.start(); timer = new Timer(); timer.schedule(new TimerTask() { @Override public void run() { SamplingProfilerIntegration.writeSnapshot("system_server", null); } }, SNAPSHOT_INTERVAL, SNAPSHOT_INTERVAL); } // Mmmmmm... more memory! dalvik.system.VMRuntime.getRuntime().clearGrowthLimit(); // The system server has to run all of the time, so it needs to be // as efficient as possible with its memory usage. VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);Boolean hasMassStorage = SystemProperties.getBoolean("ro.has.mass.storage",false);if(hasMassStorage) Environment.setUserRequired(false);else Environment.setUserRequired(true); System.loadLibrary("android_servers"); if(SystemProperties.getBoolean("ro.app.optimization",false)){ System.loadLibrary("optimization"); } Slog.i(TAG, "Entered the Android system server!"); // Initialize native services. if(!SystemProperties.getBoolean("config.disable_vibrator", false)) { nativeInit(); } // This used to be its own separate thread, but now it is // just the loop we run on the main thread. ServerThread thr = new ServerThread(); thr.initAndLoop(); }1、重新定义prop persist.sys.dalvik.vm.lib,为了防止上一次启动的时候经过特殊原因将这个值改变了
2、更改系统时间,SystemServer第一次起来之后,将系统时间默认设置为1970年,有个判断,会到RTC读当前系统时间,我们现在用的平台是没有RTC的,所以,系统起来之后都会设一遍。
3、dalvik.system.VMRuntime.getRuntime().clearGrowthLimit();不知道是干嘛的,注释的意思貌似是说释放更多memory
4、VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);
setTargetHeapUtilization(float newTarget) 可以设定内存利用率的百分比,当实际的利用率偏离这个百分比的时候,虚拟机会在GC的时候调整堆内存大小,让实际占用率向个百分比靠拢。
平台起来之后关于heap一些prop:
1|root@HaierT866:/dev/socket # getprop | grep heap[dalvik.vm.heapgrowthlimit]: [64m][dalvik.vm.heapmaxfree]: [8m][dalvik.vm.heapminfree]: [512k][dalvik.vm.heapsize]: [384m][dalvik.vm.heapstartsize]: [8m][dalvik.vm.heaptargetutilization]: [0.75]5、nativeInit();
之前load 了android_servers这个native so,可以看一下source code。
@/frameworks/base/services/jni/com_android_server_SystemServer.cpp
static void android_server_SystemServer_nativeInit(JNIEnv* env, jobject clazz) { char propBuf[PROPERTY_VALUE_MAX]; property_get("system_init.startsensorservice", propBuf, "1"); if (strcmp(propBuf, "1") == 0) { // Start the sensor service SensorService::instantiate(); }}初始化SensorService
6、thr.initAndLoop();
public void initAndLoop() { ...... Looper.prepareMainLooper(); android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND); ...... Looper.loop(); Slog.d(TAG, "System ServerThread is exiting!");}这个里面的code太长了,大概有1000多行。但是再长的code也不影响分析。
1)Looper.prepareMainLooper();
刚开始在进程中创建了一个Looper,详细关于looper、MessageQueue、handler可以参考Android异步消息处理线程之----Looper+MessageQueue+Handler
这里的MainLooper是不允许quit的,所以prepare的参数是false。
Looper准备好了,必定会有loop()出现的,函数的最后就出来了。
2)这里也关注一下THREAD_PRIORITY_FOREGROUND,thread的priority很高呀,不让kill的,了解kill memory机制应该知道,出现oom或者内存紧张的时候,会kill一些进程,就是按照process的优先级来的。
3)Installer,installd 的java类
平台起来之后ps:
root 177 1 1004 220 c057e4b8 b6f344e0 S /system/bin/installd进程启动是在init.rc中:
service installd /system/bin/installd class main socket installd stream 600 system system在Android系统中,PackageManagerService用于管理系统中的所有安装包信息及应用程序的安装卸载,但是应用程序的安装与卸载并非PackageManagerService来完成,而是通过PackageManagerService来访问installd服务来执行程序包的安装与卸载的。
对于installd讲解网上很多,这里暂时不过多分析。
4)PowerManagerService 电源管理服务
5)ActivityManagerService Android framework框架核心服务,管理整个框架中任务、进程管理, Intent解析等的核心实现,管理四大组建的生命周期。
6)DisplayManagerService用于管理全局显示生命周期,决定在已连接的物理设备如何配置逻辑显示,并且通知系统和应用状态的改变。
7)TelephonyRegistry提供电话注册、管理服务,可以获取电话的链接状态、信号强度等等。
8)SchedulingPolicyService调度策略。
9)PackageManagerService Android framework框架核心服务,用于APK的解析、权限验证、安装等。
10)EntropyMixer
11)UserManagerService 用户管理
12)AccountManagerServiceAndroid账户服务,提供了对账户、密码、授权的集中管理。必须要在ContentService之前初始化
13)ContentService内容服务,主要是数据库等提供解决方法的服务。
14)LightsService光感应传感器服务。
15)BatteryService负责监控电池的充电状态、电池电量、电压、温度等信息,当电池信息发生变化时,发生广播通知其他关系电池信息的进程和服务。
16)VibratorService振动器服务
17)ConsumerIrService远程控制,通过红外等控制周围的设备(例如电视等)
18)AlarmManagerService 提供闹铃和定时器等功能
19)GpioManagerService GPIO的服务
20)InputManagerService 以前在WindowManagerService中,现在独立了出来,用户处理事件分发。
21)InputMethodManagerService输入法服务,打开和关闭输入法。
22)AccessibilityManagerService辅助管理程序截获所有的用户输入,并根据这些输入给用户一些额外的反馈,起到辅助的效果,View的点击、焦点等事件分发管理服。
23)MountService磁盘加载服务程序,一般要和一个linux daemon程序如vold/mountd等合作起作用,主要负责监听并广播device的mount/unmount/badremoval等等事件。
24)LockSettingsService和锁屏界面中的输入密码,手势等安全功能有关。可以保存每个user的相关锁屏信息
25)DevicePolicyManagerService提供一些系统级别的设置及属性
26)StatusBarManagerService状态栏。
27)ClipboardService剪贴板服务
28)NetworkManagementService网络管理服务。ANDROID 系统网络连接和管理服务由四个系统服务ConnectivityService、NetworkPolicyManagerService、NetworkManagementService、NetworkStatsService共同配合完成网络连接和管理功能。ConnectivityService、NetworkPolicyManagerService、NetworkStatsService三个服务都通过INetworkManagementService接口跨进程访问NetworkManagementService服务,实现与网络接口的交互及信息读取。
29)TextServicesManagerService文本服务,例如文本检查等。
30)NetworkStatsService 网络统计相关。
31)NetworkPolicyManagerService维护网络使用策略。
32)WifiP2pServiceWifi Direct服务。
33)WifiServiceWifi服务
34)ConnectivityService网络连接状态服务。
35)NsdService网络服务搜索
36)UpdateLockService
37)NotificationManagerService通知服务
38)DeviceStorageMonitorService 存储空间监控
39)LocationManagerService位置服务,GPS、定位等。
40)CountryDetectorService检测用户国家
41)SearchManagerService搜索服务
42)DropBoxManagerService用于系统运行时日志的存储于管理。
43)WallpaperManagerService 壁纸管理服务
44)AudioServiceAudioFlinger的上层管理封装,主要是音量、音效、声道及铃声等的管理。
45)WiredAccessoryManager监视手机和底座上的耳机
46)UsbServiceUSB Host和device管理服务
47)SerialService对串口的设备进行操作
48)TwilightService指出用户当前所在位置是否为晚上,被UiModeManager等用来调整夜间模式。
49)UiModeManagerService管理当前Android设备的夜间模式和行车模式.
50)AppWidgetServiceAndroid中提供Widget的管理和相关服务
51)RecognitionManagerService身份识别相关
52)DiskStatsService磁盘统计服务,供dumpsys使用
53)SamplingProfilerService用于耗时统计等
54)NetworkTimeUpdateService监视网络时间,当网络时间变化时更新本地时间。
55)CommonTimeManagementService管理本地常见的时间服务的配置,在网络配置变化时重新配置本地服务。
56)DreamManagerService屏幕保护
57)AssetAtlasService负责将预加载的bitmap组装成纹理贴图,生成的纹理贴图可以被用来跨进程使用,以减少内存
58)IdleMaintenanceService用于观察设备状态,在设备空闲时执行维护任务。将一些比较耗时的代价比较高的任务放到设备空闲时执行,这样保证用户的体验
59)PrintManagerService打印服务
60)MediaRouterService用于管理各个应用程序的多媒体播放的行为,wifiDisplay会用到
services后期会一个一个补充,service new出来后会通过ServiceManager.addService,统一管理。基本都是一些初始化工作,或者service之间需要依赖的。
最后,通过systemReady或者systemRunning来进一步的启动这些services。
61)Looper.loop(); 处理MessageQueue里的message
Over!
至此,将从init启动,到SystemServer启动都小结了一下,感觉轻松了很多,可是实际上,这才刚刚进入ANDROID世界,真正的android相关后期会持续补充。
zygote 相关博文:
(1)Android 的init过程详解
(2)android zygote之启动过程分析
(3)android systemserver启动详解
(4)android SystemServer详解
更多相关文章
- tcping测试服务器TCP端口
- android网络与通信
- Android复习笔记(8) - 服务(Service)
- Android(安卓)Studio V3.12环境下TV开发教程(二)管理电视控制器
- 【Android】 使用AndServer框架在手机上搭建服务器
- AIDL/IPC Android(安卓)AIDL/IPC 进程通信机制——超详细讲解及
- Android定时任务采用AlarmManager来实现,兼容8.0系统
- 【笔记】Android(安卓)App 运行的过程
- Android中bindService()启动Service的过程分析