《深入理解Android2》读书笔记(一)
2017-5-12
从今天开始估计有一段空闲时间,开始阅读《深入理解Android2》,并写读书笔记。
第一章搭建环境直接略过。
第二章是Binder,暂时略过
7大类服务包括:
1.Android核心服务,如:ActivityManagerService、WindowManagerService等
2.和通信相关的服务,如:Wifi相关服务、Telephone相关服务
3.和系统功能相关的服务,如:AudioService、MountService、UsbService等
4.BatteryService、VibratorService等
5.EntropyService、DiskStasService、Watchdog等相对独立的服务
6.蓝牙服务
7.和UI紧密相关的服务,如状态栏服务、通知管理服务
SystemServer--是由Zygote孵化而来的一个进程。
EntropyService--熵服务,和随机数的生成有关
ClipboardService(CBS)-剪贴板服务
DropBoxManagerService(DBMS)--和系统运行时日志的存储和管理有关,用于生成和管理系统运行时的一些日志文件。日志文件大多记录的是系统或某个应用程序出错时的信息,主要功能是存储空间不足时需要删除一些旧的日志文件以节省存储空间。
DBMS注册一个BroadcastReceiver对象,同时会监听Setting数据库的变动。
DiskStatsService和DeviceStorageMonitorService--用于查看和监测系统存储空间,与系统内部存储管理、监控有关
DeviceStorageManagerService(DSMS)是用来检测系统内部存储空间的状态的
PackageManagerService(PKMS)--负责系统中Package的管理,应用程序的安装、卸载、信息查询等。
PKMS构造函数的主要功能:扫描android系统中几个目标文件夹中的APK,从而建立合适的数据结构以管理诸如Package信息、四大组件信息、权限信息等各种信息。
PKMS除了负责Android系统中Package的安装、升级、卸载外,还有一项很重要的职责,就是对外提供统一的信息查询功能,其中包括查询系统中匹配Intent的Activities、BroadCastReceivers或Services等。
PackagerParser主要负责APK文件的解析,即解析APK文件中的AndroidManifest.xml以填充package的信息
queryIntentActivities功能就是进行Intent匹配查询
PowerManagerService(PMS)--负责Android系统中电源管理方面的工作。PowerManagerService从IPowerManager.Stub类派生,并实现了Watchdog.Monitor及LocalPowerManager接口。
IPowerManager.Stub及内部类Proxy均由AIDL工具处理IPower-Manager.aidl后得到。
客户端使用PowerManager类,其内部通过代表BinderProxy端的mService成员变量与PowerManagerService进行跨Binder通信。
PMS由SystemServer在ServerThread线程中创建。
init函数初始化PMS内部的一些重要成员变量,分为3步:
1.对一些成员变量进行赋值
2.调用nativeInit函数初始化Native层相关资源
3.调用updateNativePowerStateLocked更新Native层的电源状态
systemReady主要工作为:
1.PMS创建SensorManager,通过它可与对应的传感器交互。PMS仅仅启用或禁止特定的传感器,而来自传感器的数据将通过回调的方式通知PMS,PMS根据接收到的传感器事件做相应处理。
2.通过setPowerState函数设置电源状态为ALL_BRIGHT(不考虑UseSoftwareAutoBrightness的情况)。此时屏幕及键盘灯都会点亮。
3.调用BatteryStateService提供的函数,以通知屏幕打开事件,在BatteryStateService内部将处理该事件。
当系统中的服务都在systemReady中进行处理后,系统会广播一次ACTION_BOOT_COMPLETED消息,而PMS也将处理该广播。
WakeLock是Android提供给应用程序获取电力资源的唯一方法。只要还有其他地方在使用WakeLock,系统就不会进入休眠状态。
WakeLock总结:
1.如果flags和屏幕有关(除PARTIAL_WAKE_LOCK外),则需要更新屏幕、灯光状态。其中,屏幕操作通过Power类来完成,灯光则通过LightService类来完成
2.如果FLAGS是PARTIAL_WAKE_LOCK,则需要通过Power提供的接口获取Kernel层的WakeLock
3.在WakeLock工作流程中还混杂了用户体验、光传感器、接近传感器等方面的处理逻辑。这部分代码集中体现在setPowerState函数中。
4.WakeLock还要通知BatteryStatsService,以帮助其统计电量使用情况。
5.PMS在JNI层页保存了当前屏幕状态信息,这是通过updateNativePowerStateLocked完成的。
BatteryService--提供接口用于获取电池信息,充电状态等。
BatteryStatsService(BSS)--主要用于用电统计,通过它可知谁是系统中的“耗电大户”。电量统计的核心是BSImpl,实现了StopwatchTimer(秒表)、SamplingTimer(抽样计时)、Counter(计数器)和SamplingCounter(抽样计数)等4个具体的计量工具
PMS功能为根据当前系统状态(包括mUserState和mWakeLockState)去操作屏幕和灯光。而触发状态改变的有WakeLock的获取和释放、userActivity函数的调用。
ActivityManagerService(AMS)--是android中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似,因此它在android中非常重要。
AMS的构造函数:
1.创建BSS、USS、mProcessStats(ProcessStats类型)、mProcessStatsThread线程,这些都与系统运行状况统计相关
2.创建/data/system目录,为mCompatModePackages(CompatModePackages类型)和mConfiguration(Configuration类型)等成员变量赋值。
ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行),其职责就是调度及执行在线程中运行的四大组件。
systemMain函数调用后得到一个ActivityThread对象,它代表应用进程的主线程。还得到一个Context对象,它背后所指向的Application环境与framework-res.apk有关。
总结一句话,systemMain函数将为system_server进程搭建一个和应用进程一样的Android运行环境。
其中,进程来源于操作系统,是在OS中看到的运行体。我们编写的代码一定要运行在一个进程中。
Android运行环境:Android努力构筑了一个自己的运行环境。在这环境中,进程的概念被模糊化了。组件的运行及它们之间的交互均在该环境中实现。
Application从ContextWrapper派生,并实现了ComponentCallbacks2接口。Application中有一个LoadedApk类型的成员变量mLoadedApk。LoadedApk代表一个APK文件。由于一个AndroidManifest.xml文件只能声明一个Application标签,所以一个Application必然会和一个LoadedApk绑定。
Service从ContextWrapper派生,其中Service内部成员变量mApplication指向Application(在AndroidManifest.xml中,Service只能作为Application的子标签,所以在代码中Service必然会和一个Application绑定)
ContextThemeWrapper重载了和Theme(主题)相关的两个函数。这些和界面有关,所以Acitivity作为Android系统中的UI容器,必然页会从ContextThemeWrapper派生。与Service一样,Activity内部也通过mApplication成员变量指向startRunning。
AMS的main函数目的:
1.创建AMS对象
2.创建一个供system_server进程使用的Android运行环境(包括ActivityThread和ContextImpl)
AMS的setSystemProcess的工作:
1.注册AMS、meminfo、gfxinfo等服务到ServiceManager中
2.根据PKMS返回的ApplicaionInfo初始化Android运行环境,并创建一个代表system_server进程的ProcessRecord,从此,system_server进程页并入AMS的管理范围内。
AMS的installSystemProviders函数其实就是用于启动SettingsProvicer。
AMS总结:
1.AMS的main函数:创建AMS实例,其中最重要的工作是创建Android运行环境,得到一个ActivityThread和一个Context对象
2.AMS的setSystemProcess函数:该函数注册AMS和meminfo等服务到ServiceManager中。另外,它为system_server创建了一个ProcessRecord对象。由于AMS是Java世界
的进程管理及调度中心,要做到对Java进程一视同仁,尽管system_server贵为系统进程,此时也不得不将其并入AMS的管理范围内。
3.AMS的installSystemProviders函数:为system_server加载SettingsProvider
4.AMS的systemReady函数:做系统启动完毕前最后一些扫尾工作。该函数调用完毕后,Home Activity将呈现在用户面前。
启动Activity的核心函数是startActivityLocked,主要工作包括:
1.处理sourceRecord及resultRecord。其中,sourceRecord表示发起本次请求的Activity,resultRecord表示接收处理结果的Activity(启动一个Activity肯定需要它完成某项事情,当目标Activity将事情成后,就需要告知请求者该事情的处理结果)。在一般情况下,sourceRecord和resultRecord应指向同一个Activity。
2.处理App switch。如果AMS当前禁止app switch,则只能把本次启动请求保存起来,以待允许app switch时再处理。从代码中可知,AMS在处理本次请求前,会先调用doPendingActivityLauchesLocked函数,在该函数内部将启动之前因系统禁止app switch而保存的Pending请求
3.调用startActivityUncheckedLocked处理本次Activity启动请求
startActivity总结:
1.我们利用arm start命令,发起本次目标Activity的启动请求
2.接下来进入ActivityManagerService和ActivityStack这两个核心类。对于启动Activity来说,分为两个阶段:
2.1根据启动模式和启动标志找到活创建ActivityRecord及对应的TaskRecord
2.2处理Activity启动或切换相关的工作
3.然后讨论AMS直接创建目标进程并运行Activity的流程,其中涉及目标进程的创建,目标进程Android运行环境的初始化,目标Activity的创建以及onCreate、onStart及onResume等其在生命周期中重要函数的调用等相关知识点。
4.接着又讨论了AMS先暂停当前Activity,然后再创建目标进程并运行Activity的流程,其中两个应用进程和AMS交互。
processNextBroadcast第三阶段工作总结如下:
1.如果广播接受者为动态注册对象,则直接调用deliverToRegisteredReceiverLocked处理他。
2.如果广播接受者为静态注册对象,并且该对象对应的进程已经存在,则调用processCurBroadcastLocked处理它。
3.如果广播接受者为静态注册对象,并且该对象对应的进程还不存在,则需要创建该进程。这是最糟糕的情况。
AMS对进程的管理仅涉及两个方面:
1.调节进程的调度优先级和调度策略
2.调节进程的oom值
Android将应用进程分为五大类,分别为Forground类、Visible类、Service类、Background类及Empty类
Forground类1.包含一个前端Activity(当前正在显示的那个Activity)2.包含一个Service,且该Service和一个前端Activity绑定
3.含一个调用了startForground的Service,或者该进程的Service正在调用其生命周期的函数(onCreate、onStart或onDestroy)4.该进程中有BroadcastReceiver实例正在执行onReceiver函数
Visible类进程包含1.一个仅onPause被调用的Activity2.一个Service,且该Service和一个Visible(或Forground)的Activity绑定
Service类进程包含一个Service,此Service通过startService启动
Background进程包含当前不可见的Activity,系统保存这些进程到一个LRU(最近最少使用)列表。当系统需要回收内存时,改列表中哪些最忌你最少使用的进程将被杀死
Empty进程:Activity主动调用finish销毁自己后就会变成Empty进程。系统保留Empty进程的原因是当又重新需要它们时,可以省去fork进程、创建Android运行环境等一系列漫长而艰苦的工作
ContentService包括两个不同部分,一个是数据更新通知机制,另一个是同步服务管理。在这个两部分中,ContentService承担了数据更新通知机制的工作,同步服务管理的工作则委托给SyncManager来完成。
ps:后面几章节讲四大组件的,看的比较潦草,所以就没做笔记了,以后有空再复习。