文章出处: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详解







更多相关文章

  1. tcping测试服务器TCP端口
  2. android网络与通信
  3. Android复习笔记(8) - 服务(Service)
  4. Android(安卓)Studio V3.12环境下TV开发教程(二)管理电视控制器
  5. 【Android】 使用AndServer框架在手机上搭建服务器
  6. AIDL/IPC Android(安卓)AIDL/IPC 进程通信机制——超详细讲解及
  7. Android定时任务采用AlarmManager来实现,兼容8.0系统
  8. 【笔记】Android(安卓)App 运行的过程
  9. Android中bindService()启动Service的过程分析

随机推荐

  1. 添加轮播图圆点
  2. 【Android】RecyclerView性能优化:setHasF
  3. 【android】Location-based Service
  4. Android(安卓)AlertDialog
  5. 三级缓存图片类
  6. Layer_list(层叠图片)
  7. android TouchEvent 传递过程
  8. [转]Write your own Android(安卓)Authen
  9. Android编程入门-第100天
  10. Android(安卓)自定义Adapter