《Android 进阶解密》阅读笔记

第一章:android系统架构,通过一张系统架构图就能明白了。以下是安卓系统架构图。

《Android 进阶解密》阅读笔记_第1张图片

第二章: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。


《Android 进阶解密》阅读笔记_第2张图片

待续........

第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 进阶解密》阅读笔记_第3张图片

Android 8.0的AMS 家族

图4 Android 8.0 AMS 家族

《Android 进阶解密》阅读笔记_第4张图片

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 任务栈模型

《Android 进阶解密》阅读笔记_第5张图片

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的关系

《Android 进阶解密》阅读笔记_第6张图片

第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 类的生命周期

《Android 进阶解密》阅读笔记_第7张图片

垃圾收集算法(垃圾回收机制)

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 双亲委托模式

《Android 进阶解密》阅读笔记_第8张图片

第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的地方不同

待续.........

你可能感兴趣的:(《Android 进阶解密》阅读笔记)