《深入理解Android:卷II》.pdf

第1 章 搭建Android 源码工作环境

1.1 Android 系统架构

1.2 搭建开发环境

         1.2.1 下载源码

         //http://source.android.com/source/downloading.html。

 

         1.2.2 编译源码

         1. 部署JDK

         2. 编译源码

 

         1.2.3 利用Eclipse 调试system_process

         1. 配置Eclipse

         2. 使用Coffee Bytes Java 插件

         3. 导入Android 源码

         4. 创建并运行模拟器

         5. 调试system_process

 

第2 章 深入理解Java Binder 和MessageQueue     

2.1 概述

 

 

2.2 Java 层中的Binder 架构分析//建议先阅读读卷I 的“第6 章深入理解Binder”。

         2.2.1 Binder 架构总览:

          

 

         1)系统定义了一个IBinder 接口类以及DeathRecipient 接口

         2)Binder 类和BinderProxy 类分别实现了IBinder ❑ 接口。其中,Binder 类作为服务端的Bn 的代表,而BinderProxy 作为客户端的Bp 的代表。

         3)系统中还定义了一个BinderInternal 类。该类是一个仅供Binder 架构使用的类。它内部有一个GcWatcher 类,该类专门用于处理和Binder 架构相关的垃圾回收

         4)Java 层同样提供一个用于承载通信数据的Parcel 类

 

         2.2.2 初始化Java 层Binder 框架

         frameworks/base/core/jni/android_util_Binder.cpp

          

 

         (1)    Binder类的初始化.

         (2)    BinderInternal类的初始化

         (3)    BinderProxy类的初始化

         主要是注册一些class 的JNI,全局对象变量.

 

 

         2.2.3 addService实列分析//ActivityManagerService

         (1) 在SM 注册服务:

                    

                    

                          

                   BinderInternal.getContextObject

                   1:通过JNI 创建BpProxy,与ServiceManager联系.

                   2:转化成java层的class BinderProxy obj.

                   3:通过asinterface传给 class ServiceManagerProxy类的remote=BinderProxy

 

                          

         (2) addService函数分析://即 调用BinderProxy. addService

                   BinderProxy. addService是native transact函数.

                    

                   调用target是JAVA层BinderProxy 创建的BpBinder

         (3) Binder,JavaBBinderHolder和JavaBBinder

                    

                   1:Binder的mobject 指向JavaBBinderHolder对象

                             

                   2: JavaBBinderHolder的mBinder指向JavaBBinder

                             

                   3:      JavaBBinder的mobject指向Binder 对象.

 

                             

                            通过ServiceManagerProxy->addService中的data->writestrongBinder(Service)中的ibinderforJavaObject中JavaBBinderholder->get

                             

 

                            4:      ActivityManagerService响应请求流程//JavaBBinder的业务函数.

 

                             

 

                            虚线表示子类重载实现.Q:响应的指令从哪里来?

 

         2.2.4 Java 层Binder 架构总结

                             

 

 

 

2.3 心系两界的MessageQueue//卷I“第5 章深入理解常见类

        

         2.3.1 MessageQueue 的创建:

                    MessageQueue.java::MessageQueue

                    通过JNI调用Native中的 new MessageQueue        

         2.3.2 Java层投递Message:

                   MessageQueue.java::enqueueMessage()

                   nativeWake 控制是否唤醒

         2.3.3 MessageQueue 提取消息:

                   MessageQueue.java::next()

                   通过JNI调用Native中nativePollOnce

         2.3.4 nativePollOnce 函数分析//实际就是一个多路复用IO epoll

                   1: 计算真正等待的时间

                   2:调用 epoll_wait

                   3:处理文件句柄,或fd 发生的事情

                   4:调用native Message处理函数,处理response数组中callback函数.

         2.3.5 添加监控请求:

                          

         2.3.6 处理监控请求:

                   nativePollOnce中:

                   3:处理文件句柄,或fd 发生的事情

                   4:调用native Message处理函数,处理response数组中callback函数.

         2.3.6 native层sendMessage:

                    

 

        

2.4 MessageQueue 总结

         2.4.1 消息处理的大家族合照

                

         (1):   Java 层提供了Looper 类和MessageQueue 类❑ ,其中Looper 类提供循环处理消息的机制,MessageQueue 类提供一个消息队                            列,以及插入、删除和提取消息的函数接口。另外,Handler 也是在Java 层常用的与消息处理相关的类。

         (2):   MessageQueue 内部通过mPtr 变量保存一个Native 层的NativeMessageQueue ❑ 对象,mMessages 保存来自Java 层的Message 消              息。

         (3):   NativeMessageQueue 保存一个native 的Looper 对象, 该Looper 从ALooper 派生,提供pollOnce 和addFd 等函数

         (4):   Java 层有Message 类和Handler 类, 而Native 层对应也有Message 类和Message-Handler 抽象类。

                   在编码时,一般使用的是MessageHandler 的派生类WeakMessage-Handler 类

 

         2.4.2 MessageQueue 处理流程总结

         (1):   MessageQueue 支持Native/Java 的Message

         (2): MessageQueue 代表是NativeMessageQueue ,MessageHander来处理Message,addfd 来添加Request

         (3): 先处理Native的Message,后处理Native的Request,再处理Java的Message

 

2.5 本章小结

 

 

第3 章 深入理解SystemServer

3.1 概述

3.2   SystemServer分析//卷I第4章 深入理解Zygote

3.3 EntropyService分析

3.4 DropBoxManagerService分析

         3.4.1. DBMS构造函数的分析

         3.4.2. dropbox日志文件的添加

         3.4.2. DBMS和setting数据库

3.5 DiskstatusService和DevicestorageMonitorService分析

         3.5.1. DiskStatusServicef分析

         3.4.1. DeviceStorageManagerService分析

3.6 SamplingProfilerService分析:

3.6 ClipboardService分析:

 

第4章 深入理解PackageManagerService 

4.1 概述

 

1)IPackageManager接口定义服务端和客户端通信的业务函数,还定义内部类stub,该类从Binder派生并实现IPackageManager接口.

2)Packagemanagerservice继承自IPackageManager.stub类,作为     PackageManagerservice服务端.

3)Stub 类定义一个类Proxy,成员mRemote作为PackageManagerservice客户端.

4)IpackageManager接口类定义了许多业务函数,

5)ApplicationpackageManager继承IpackageManager

 

4.2 初识packageManagerService

4.3 PKMS的main函数分析

         4.3.1 扫描并解析XML文件,并将其中的信息保存到特定的数据结构(Setting类)中.

         (1)Setting.类,

         1.shareduserSetting派生GrantedPermissions,其中Packages,保存申明sharedUserID 的package权限的设置信息.

         2.mUserIds,mOtherUserIDs,其目的是以UID为索引快速sharedUserSetting 对象.

          

        

         (2)AndroidManifest.xml 中sharedUserID ,相同的值share彼此数据,赋予进程对应的权限

 

         (3) XML文件扫描:

          1.通过readPermission从X)从./system/etc/permission 读取*.xml权限.转换成对应的数据结构

          /data/system/下三个.xlm文件

         packages.xm描述系统安装的package 信息,

         package-stopped-backup.xlm强制停止运行的package的信息.

         package.list,应用级别的package的信息

         2.readLPw函数

          

        

 

        

         4.3.2 扫描APK文件,

         (1)didDexOpt 变量,控制系统库的优化

         (2)扫描系统Package :

                   通过liunx inotify 机制监听文件夹是否有变化.

                   scanDirlI函数中call packageParser 类分析.APK建立package类对象数据结构(图4-6),流程请参考图4-8,得到图4-9 共有数据结构

          

 

 

 

 

         4.3.3 整理4.3.2 的信息,将信息保存到文件中.

 

4.4 APK Installation 分析

          

         4.4.1 adb install分析:

         第一步:#adb install XXX.apk,直接是通过adb 命令(commandline.c),调用install_app,call do_sync_push         把apk copy到对应的位置.再call pm_command

         第二步:pm实际是通过shell 调用脚本,用app_process起pm 进程.pm进程通过Binder客户端调用PKMS

         第三步:PKMS通过sendmessage 给mHandler处理

         第四部:mHandler处理INIT_copy和MSC_BOUND,调用HandlerParam,startcopy installArgs,不同安装行为call 不同的HandlerParam的子类.如Installparams,MoveParames,

         measureparams,intallargs ,的Fileinstallars,Sdinstallargs.

         第五步:handleStartcopy 通过IBinder call defaultContainerService

         第六步:最后call hanleReturnCode

 

         4.4.5 verification 的工作主要installParams中Handlestartcopy中

4.5  queryIntentActivities分析

         4.5.1 Intent/Intentfilter

         4.5.2 Activity信息管理.

          

         (1)mActivities 为activityintentResolverl类型,保存系统所有与activity相关的信息.

         (2)从apk中解析得到的所有和activity相关的信息,都有packageParser.activity来保存.

         (3)其他mSchemeToFilter,mActionfilter,mTypedActionToFilter,mFilter,mWildTypeToFitler,mTpyeFilter,mBaseTypeToFilter.

         4.5.2 Intent 匹配信息查询.

         (1)queryIntentActivities 查询.

 

4.6  installd及UserMananger分析

         4.6.1 installd 介绍

                   (1) install.java通过socket 调用installd,

                   (2) PKMS中用的命令:dexopt,movefiles, dofreecash.            

         4.6.1 UserManager 介绍

 

第5章 深入理解PowerManagerService     

 

第6 章 深入理解ActivityManagerService / 184       

 

6.1 概述

(1): 由ActivityManagerNative类派生,并实现watchdog Monitor和BatteryStatusimpl.batterycallbcak接口,而ActivityManagerNative由Binder派生,实现了IActivityManager接口.

(2): 客户端使用ActivityManager类,通过调用getDefault得到ActivityManagerproxy.与AMS通信.

 

 

 

 

 

6.2 初识ActivityManagerService //以system_server 调用AMS 的流程分析

 

      

          

 

         6.2.1 ActivityManagerService的main函数分析       

          

         (1): 创建一个带消息处理AThread,构造函数AMS.

                其中AMS 构造函数主要

                   a:创建BSS,USS,mProcessstatus,mProcessStateThread线程统计系统的运行状况.

                   b:赋值CompatModePackages,configuration

                  

         (2): 调用ActivityThread.systemMain ,构造ActivityThread函数.//system_server 是一个特殊的应用进程

                   a:通过ActivityThread.attach()true/false来区分,是系统线程/和应用进程

                   b:引出Instrumentation类,application 类context类.

                   c: ContextImpl与其他类之间的关系如下图:

          

         (3): 调用at.getSystemContext.得到system context

          

 

        

         (4): 调用ActivityManagerService.startRuning()

        

         总结:ActivityManagerService的main函数主要得到两个对象ActivityThread,contextImpl

          

         其中的关键变量Activity中几个hashMap

 

6.2.2 ActivityManagerService 的setSystemProcess的分析

          

         (1): ActivityThread 的installSystemApplication函数.

                   通过loadapk 第四个参数 info 传入到context.init(),将context与systemapplication即framework-res.apk绑定.

         (2): ProcessRecord 和IApplicationThread.

                   1: IApplicationThread

                            Q:AMS 怎样与应用进程交互

                            A:如下图,通过Activitythread中mAppThread Binder通信实现,其中IApplicationThread Bn(服务端)在应该程序端实现,(通过extend ApplicationthreadNative)

                               

                   2       通过newProcessRecordLocked创建ProcessRecord 类,

                            其中几个关键的成员变量是:

                            info保存Applicationinfo,

                            thread保存IApplicationthread与进程交互.        

         AMS通过mPidSelfLocked和mProcessName 来操作ProcessRecord.

 

         总结:1: 增加一些服务.2.把system_server进程加入AMS 管理.

 

 

6.2.3 InstallSystemProvider函数分析.

          

         (1): generateApplicationproviderLocked分析.

                   通过PKMS查询provider,而AMS通过mProviderByClass,ProcessRecord通过pubprovider操作ContentproviderRecord来维护.

                    

         (2): Activitythread 中installSystemProvider分析.

                    

                   1: installProvider分析:在Activitythread安装provider,最后得到如下数据结构:

                             

                            其中ProviderClientRecord是Activity thread中 provider的记录,mName 是contentprovider的authority

        

                   2: publishContentprovider

                            通过PID 找到ProcessRecord,通过其pubProvider找到ContentProviderRecord

                            以componetName/authority为key 保存到Content provider到AMS中.                           

         (3): 建立SettingProvider的检测.

                                              

 

6.2.4 SystemReady函数分析.

         (1): 第一阶段:发送处理与PRE_BOOT_COMPLETED广播相关的事情.主要和系统升级有关系.

         (2): 第二阶段:杀死在AMS未启动前已经启动的应用进程,从Setting数据库中获取配置信息.

         (3)第三阶段: 调用goingCallback run函数.启动persistent apk.和桌面,

 

6.3  StartActivity分析

6.3.1 am 介绍

         usage: am [subcommand] [options]

         usage: am start [-D] [-W] [-P <FILE>] [--start-profiler <FILE>]

               [--R COUNT] [-S] [--opengl-trace]

               [--user <USER_ID> | current] <INTENT>

       am startservice [--user <USER_ID> | current] <INTENT>

       am force-stop [--user <USER_ID> | all | current] <PACKAGE>

       am kill [--user <USER_ID> | all | current] <PACKAGE>

       am kill-all

       am broadcast [--user <USER_ID> | all | current] <INTENT>

       am instrument [-r] [-e <NAME> <VALUE>] [-p <FILE>] [-w]

               [--user <USER_ID> | current]

               [--no-window-animation] <COMPONENT>

       am profile start [--user <USER_ID> current] <PROCESS> <FILE>

       am profile stop [--user <USER_ID> current] [<PROCESS>]

       am dumpheap [--user <USER_ID> current] [-n] <PROCESS> <FILE>

       am set-debug-app [-w] [--persistent] <PACKAGE>

       am clear-debug-app

       am monitor [--gdb <port>]

       am screen-compat [on|off] <PACKAGE>

       am display-size [reset|WxH]

       am display-density [reset|DENSITY]

       am to-uri [INTENT]

       am to-intent-uri [INTENT]

       am switch-user <USER_ID>

       am stop-user <USER_ID>

 

 6.3.2 前半程图:从am 启动一个Activity分析

          

         6.3.2.1 AMS的startActivityAndWait 分析.

         (1): 基础知识的准备:

                   1: Activitystack 管理activity和 task.

                             

                            >一件事情称为一个task,一个task可以细分很多子步骤即Activity.

                            >activity由ActivityRecord表示,task由TaskRecord 表示.ActivityRecord的task指向Activity所在task.

                   2:activitystack.java中常用操作ActivityRecord的函数.

                            >topRunningActivityLocked

                            >topRunningNonDelayActivityLocked

                            >findActivitylocked

                            >findTaskLocked

                   3 launch mode 控制Activity与Task的方式:standard/singletop/singletask/singleinstance

         (2): Activitystack 中startActivityAndWait分析

         主要做的事情:

                   1 :前期准备工作,通过PKMS查询该Intent的Activityinfo,处理FLAG_CANT_SAVE_STATE,的process,获取call pid /uid

                   2 : call startActivityLocked

                   3: 后期,处理返回值.

 

         6.3.2.2 startActivityLocked分析.

         (1): 处理sourceRecord,resultRecord

         (2): 处理APP switch

         (3): 调用startActivityUncheckedLocked 处理Activity

 

         6.3.2.3 startActivityUncheckedLocked 分析

         (1): 为新的activity创建一个task,即,是否设置FLAG_ACTIVITY_NEW_TASK

         (2): 在mHistory找到一个合适的task.

         (3): 调用startActivityLocked.即call resumeTopActivitylocked

 

         6.3.2.4resumeTopActivitylocked 分析

         (1): 如果mResumeActivity 不为空,pause Activity,再重新启动.

         (2): 调用startspecificActivityLocked

        

         6.3.2.5 startspecificActivityLocked 分析

         (1):调用startProcessLocked

 

         6.3.2.6 startProcessLocked分析

         (1) :处理后台进程FLAG_FROM_BACKGROUND

         (2): 处理mBadProcesses

         (3): 调用startProcessLocked

         6.3.2.7另外一个startProcessLocked分析

         (1) 向Zygote发送不带任何信息消息,启动一个字进程.

                    

         (2) 发送超时处理信息.

                  

 

 6.3.3 后半程图:从Activitythread运行Activity分析

                

         6.3.3.1 Activitythread main函数分析

          

         attach函数主要是把Application与thread 绑定在一起.主要call attachApplicationLocked

 

         6.3.3.2 attachApplicationLocked 分析

         (1): 设置进程ProcessRecord 对象的成员变量,

         (2) :撤销PROC_START_TIMEOUT_MSG

         (3):调用thread.bindApplication

         (4): 启动应用进程Activity(mMainStack.realStartActivityLocked),Service,等组件.

        

         6.3.3.3 Application thread的bindApplication分析//Activity的 create分析

         (1):Activity thread接受AMS 的指令后,封装成一个数据结构发送 BIND_APPLICATION 消息

        (2) Activity thread 接到 BIND_APPLICATION消息后 call handleBindApplication

         (3) 创建Application对象,安装Contentprovider,调用Application的onCreate

                    

        

         6.3.3.4 Activity stack realStartActivityLocked 分析//Activity的 start分析

         (1):调用Activity与应用进程的交互scheduleLaunchActivity:

                   向Activity thread 发送LAUNCH_ACTIVITY消息,

                   即call HandleLauchActivity;

                            1:以java 反射机制通过performLaunchActivity创建Activity

                            2: handleResumeActivity

                                      

                            new Idler();call ActivityIdle 中的ActivityIdleInternal

                           

         (2):调用completeResumeLocked

                    

                   AMS 给10s ,10s后AMS 与应用进程需要交互.

         6.3.3.5 ActivityIdleInternal 分析

                    1: 被暂停的Activity处于finish状态,call finishCurrentActivityLocked

                    2: 否则,call stopActivityLocked

                    

 

 

                

         6.3.3.6 startPausingLocked 分析// Activity的 pause分析

                    1: 主要call schedulePauseActivity 通过发Message 最终call handlePauseActivity

                    2: 设置超时时间 500ms             

                    ->handlePauseActivity 分析

                    1: 实现performPauseActivity

                    2:告诉 AMS Pauseed. ActivityPaused

                   ->AMS  ActivityPaused分析

                    1: 设置paused 标识

                    2: call completePauseLocked

 

         6.3.3.7 stopActivityLocked 分析// Activity的 stop分析

                    1: 设置paused 标识

                    2: call scheduleStopActivity 发送 STOP_ACTIVITY_SHOW/STOP_ACTIVITY_HIDE call handleStopActivity

                ->handleStopActivity

                   1: call performStopActivityInner

6.4  Broadcast和broadcastReceiver分析

         Q: 什么是java反射机制.

         A:

         broadcast 发送的方式:(1) 普通模式 Sendbroadcast,(2) 串行模式,SendOrdedBroadcast,(3) sticky 模式.sendstickyBroadcast

 

         6.4.1         registerReceiver流程分析.

          ContextImpl.java 中 registerReceiver

                    

                   1: 第一部分IIntentReceiver 准备:

                             

                   2: 在AMS registerReceiver

                   (1) 第一步准备stick 和filter,建立mRegisterdReceivers, mReceiverResolver.

                    

                    

 

                   (2)为每一个满足IntentFilter的sticky的Intent创建一个BroadcastRecord对象,并保存在mParllelBroadcasts中,等待调度向AMS 发送广播.

                    

         6.4.2         SendBroadcast流程分析

         ContextImpl.java 中 SendBroadcast-->AMS中BroadcastIntent-->BroadcastIntentlocked-->sheduleBroadcastLocked.

                   1:BroadcastIntentlocked        

                   第一部分: 处理一份特殊Broadcast.

                   第二部分: 查询满足条件的动态广播接受者及静态广播接受者,非order 尽快发送出去. 非order的Broadcast都被保存在mParallelBroadcast

                                     中.

                   第三部分:动态注册者,静态注册者都合并到Receivers中,把Broadcast保存在mOrderBroadcast中,

 

         6.4.3         Broadcast_Intent_msg消息处理函数.

 

         6.4.4         应用程序处理broadcast 分析:

                           

         6.4.5 广播处理总结:

                    

 

6.5  StartService分析:

         6.5.1 Service知识介绍:

         1: 响应Client的请求方式:

                   (1) 借道Intent来,传递请求.server在OnStartCommand接到Intent.并处理.

                   (2) 借助调用BinderService和Service建立Binder关系得到Bp 端.

        

         6.5.2 StartService的流程图

                    

6.6  AMS 中的进程管理:

         6.6.1 Linux进程管理介绍

                   (1): 设置调度的优先级

                   int setpriority(int which,int who init prio)

                   (2): 设置调度策略

                   init setscheduler(pit_t pid,int policy const struct sched_param *param)

                   (3):调整进程OOM_adj值(out of memeroy adjust).

                            主要设置/sys/module/lowmemeroykiller/parameters/minfree 和/sys/module/lowmemeroykiller/parameters/adj

                             

         6.6.2 Android进程管理介绍

                   1: 应用进程的分类: forground类,visable类,Service类,background类,empty类

                   2: Process.java

                            setThreadPriority()

                            setThreadgroup()

                            setProcessgroup()

                            setOomAdj()

                   3:Processlist类,主要定义不同状态下oom_adj值.

                      ProcessRecord,定义的变量用来进程管理.

                  

         6.6.3 AMS 进程管理函数分析

                    attachApplicationLocked中

                   1:      updateLruProcessLocked函数分析//根据Lru值调用app 在mLruProcess数组中.

                   2:      updateOomAdjLocked函数分析

                   4:      computeOomAdjLocked 分析

 

 

6.7  APP的 crash 处理                

          

 

         6.7.1 应用测试的crash处理

         zygoteInit--->commonInit--->setdefaultUncaughtexceptionHandler-->handleApplicationCrash

 

         6.7.2 AMS的handleApplicationCrash

         handleApplicationCrash--->crashApplication--->makeappCrashingLocked--->handleappCrashLocked

        

         6.7.3 AppdeathRecipient中BinderDied

         BinderDied-->appDiedLocked-->HandleappDiedLocked-->cleanupApplicationRecordLocked-->killServiceLocked

                   (1): cleanupApplicationRecordLocked分析

                   第一部分: killServiceLocked

                   第二部分:        处理Content provider

                   第三部分: 处理Receiver

                   第四部分: 处理Backup 信息

6.8 本章学习指导

 

6.9  本章小结                                   

                  

                  

 

 

第7章 深入理解ContentProvider

 

第8章 深入理解ContentServer 和AccountManagerService

猜你喜欢

转载自blog.csdn.net/u011961033/article/details/83088411