第一章:android系统架构,通过一张系统架构图就能明白了。以下是安卓系统架构图。
第二章:android系统启动
android 的系统启动流程:
1.启动电源以及Rom中加载BootLoader到RAM中。
2.引导程序BootLoader的启动。
3.Linux内核启动。
4.init进程的启动。
5.Zygote进程启动
6.SystemServer进程启动
7.Launcher启动
属性服务:Windows平台上有个注册表管理器,主要记录用户,软件的一些信息。即使系统或软件重启,可以根据之前注册表的信息,进行相应的初始化工作。android系统也有类似的机制,就是属性服务。
init 进程(1号进程)启动总结:
1.创建和挂载启动所需要的文件目录
2.初始化和启动属性服务。
3.解析init.rc配置文件并启动Zygote进程。
Zygote 即孵化器,通过fock(复制进程)的形式来创建应用程序进程和SystemServer进程。
Zygote进程启动总结:
1.创建AppRuntime并调用其start方法,启动Zygote进程。
2.创建Java虚拟机并为Java虚拟机注册JNI方法。
3.通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层
4.通过registerZygoteSocket方法创建服务器端Socket,并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程。
5.启动SystemServer进程。
SystemServer进程总结:
1.启动Binder线程池,可以与其他进程进行通信。
2.创建SystemServiceManager ,其用于对系统的服务进行创建,启动和生命周期管理
3.启动各种服务。包括WindowManagerService(WMS), PackageManagerService,CameraService,SensorService,ActivityManagerService(AMS)等服务。
第三章 应用程序进程启动过程
应用程序和应用程序进程的区别:
要启动一个应用程序,首先要保证该应用程序的应用程序进程已经启动。AMS在启动应用程序的时候会先检查该应用的进程是否已经存在,不存在就会请求Zygote进程启动需要的应用程序进程。
每一个应用程序都运行在对应的应用程序进程中。下面介绍下应用程序进程创建过程:
1.AMS通知Zygote进程创建进程:AMS通过调用process和zygoteProcwss等start函数组装进程必须要的参数Arg,最后通过ZygoteProcess的connect方法发送请求给Zygote进程。
2.Zygote进程在创建的时候会启动监听AMS的请求(runSelectLoop),当有请求时会执行该函数的runOnce方法。在runOnce方法中先取出发送过来的进程参数,然后通过Zygote通过fork方法创建新进程,当然会判断是否是新进程。之后会创建Binder线程池(主要实现进程间通信)和创建消息循环(主要是实现消息处理机制,如handle消息)。之后通过反射原理找到进程的类,并实现类加载(classloader),然后找到类的main方法,执行main函数。从而完成应用程序的创建和执行。
第四章 四大组件的工作过程
四大组件:
1.Activity
2.Service
3.Broadcast
4.Content Provider。
待续........
第5章 理解上下文Context
Context 即上下文对象,是android 常用的类。四大组件都会涉及到Context。例如 启动Service 会调用ContextWrapper以及ContextImpl的startService方法。
Context 是一个抽象类,它的内部定义来很多方法以及静态常量。具体实现类为ContextImpl,ContextWrapper等类
待续........
第6章 理解ActivityManagerService
ActivityManagerService简称 AMS。
Android 7.0 的AMS 家族有以下一些类:
ActivityManager 对运行中的Activity进行管理
ActivityManagerNative
ActivityManagerProxy
图3 Android 7.0 AMS家族
Android 8.0的AMS 家族
图4 Android 8.0 AMS 家族
AMS是在SystemService进程中启动的,
SystemService的main方法调用了run函数
privte void run() {
.....
//启动引导服务
(包括:ActivityManagerService,PowerManagerService,PackageManagerService)
startBootstrapServices();
//启动核心服务
(包括:DropBoxManagerService,BatterySerice, UsageStatsService,WebViewUpdateService)
startCoreService();
//启动其他服务
(包括:CameraService,AlarmManagerService,VrManagerService)
startOtherServices();
}
AMS 重要的数据结构
1.ActivityRecord。 记录了Activity的所有信息,用来描述一个Activity。在启动Activity时被创建,具体就是在ActivityStarter的startActivity 方法中创建
2.TaskRecord。用来描述一个Activity任务栈
3.ActivityStack。用来管理系统所有Activity,其内部维护来一个Activity所有状态,特殊状态的Activity以及和Activity相关的列表
例如: ActivityStack, ActivityState,特殊状态的Activity,维护的ArrayList
Activity 栈管理
图7 Activity 任务栈模型
Launch Mode启动模式
1.standerd: 默认模式,每次启动Activity都会创建一个新的Activity实例。
2.singleTop:如果要启动的Activity已经在栈顶,就不会创建实例;若不在栈顶,就会重新创建实例(判断是否在栈顶)
3.singleTask:如果要启动的Activity已经存在栈中,就不会创建实例,将栈中位于该Activity上的所有Activity出栈。如果不存在,就创建实例并置于栈顶(判断是否在栈中)
4.singleInstance:启动Activity时,创建一个新栈,新Activity压入新栈中(每次都创建新栈)
第7章 理解WindowManager
window,WindowManger和WMS的区别:
window:是一个抽象类,具体实现类为PhoneWindow,对View的管理
WindowManager:是接口类,继承自接口ViewManager接口,是管理Window的。实现类为WindowManagerImpl类
WMS,具体管理window的类,windowManager要进行添加,更新,删除window的时候,WindowManager通过binder垮进程通讯,通知WMS。由WMS来添加,更新,删除Window
图8 Window WindowManager和WMS的关系
第8章 理解WindowManagerService
图9 WMS 的职责
第9章 JNI原理
JNI 是Java Native Interface,是Java与其他语言通讯的桥梁。提供了NDK工具集合.
MediaRecorder框架的JNI层:
Java Framework层(MediaRecorder.java) --------->JNI层(libmedia_jni.so)--------->Native层(libmedia.so)
待续.........
第10章 Java虚拟机
图11 类的生命周期
垃圾收集算法(垃圾回收机制)
1.标记-清除算法:可回收,未使用的分别标记,到时候系统把可回收的资源都回收掉,缺点:1.效率不高;2.产生大量不连续碎片。
2.复制算法:把区域分成两块相等的区域,每次只使用其中一块区域。在垃圾回收的时候,遍历当前区域,把还存活的数据复制到另一个区域。清空当前区域。
3.标记-压缩算法:
4.分代收集算法:
第12 章 理解CalssLoader
Java 类加载器分两种类型:
1.系统类加载器:Bootstrap ClassLoader ,Extensions ClassLoader和 Application ClassLoader 三种
2.自定义加载器。
android 类加载器分两种类型:
1.系统类加载器:BootClassLoader, PathClassLoader和 DexClassLoader (加载dex文件以及包含dex的压缩文件)三种
2.自定义加载器。
类加载器查找class所采用的是双亲委托模式:首先先判断该Class是否已经加载,如果没有加载则委托给父加载器进行查找,这样依次进行递归,直到委托到最顶层的Bootstrap ClassLoader,如果Bootstrap ClassLoader找到了该Class,就会直接返回,如果没有找到则继续依次向下查找,如果没有找到则最后会交由自身去查找。
图12 双亲委托模式
第13章 热修复原理
热修复框架的核心技术有三类:
1.代码修复。
2.资源修复。
3.动态链接库修复。
代码修复,分三种方案:
1.类加载方案:在App重启之后,让ClassLoader重新加载新的类。具体就是在Element数组的第一个元素得到优先加载。
2.底层替换方案:在Native层直接修改原有类。具体就是替换ArtMethod结构体中的一个字段或者替换整个ArtMethod结构体。
3.Instant Run方案。
资源热修复 主要是Instant Run
Instant Run 机制的资源修复步骤:
1.创建新的AssetManager,通过反射调用addAssetPath方法加载外部的资源,
2.将AssetManager类型的mAssets字段的引用全部替换为新创建的AssetManager。
动态链接库修复。
具体为直接替换so库,具体就是在System 的load 和loadLibarary函数上替换新的so库。
第14章 Hook技术
Hook的API语言划分: Hook Java 和Hook Native
Hook Java:主要通过反射和代理来实现,应用于在SDK开发环境中修改Java代码
Hook Native:应用于在NDK开发环境和系统开发中修改Native 代码。
Hook的进程划分:应用程序进程Hook和全局Hook
应用程序进程Hook:只能Hook当前所在的应用程序进程。
全局Hook:通过对Zygote进行Hook,就实现全局Hook。
第15章 插件化原理
插件化思想:例如手机内安装一个app并正常使用,卸载一个App,也不会影响系统和其他app。 这就是插件化思想。
Activity插件化
1.反射实现
2.接口实现
3.Hook技术实现
Hook IActivityManager 方案实现:
1.注册Activity 进行占坑。
2.使用占坑Activity 通过AMS验证
Hook Instrumentation 方案。
1.注册Activity 进行占坑
2.替换Activit以及还原插件Activity的地方不同
待续.........