1. 类方法

1.1 Handler方法

子线程与主线程的消息传送的方法,用于向消息队列中插入消息。在子线程中刷新UI,会造成UI更新冲突,线程不安全。

序号方法描述
1public final boolean sendMessage (Message msg)。发送消息,返回是否发送成功
2public void handleMessage(Message msg)。接收消息,用于更新UI

1.2 Looper方法

无限循环方法,用于封装消息循环和消息队列的类,用于在线程中进行消息处理。

序号方法描述
1private static void prepare(boolean quitAllowed)。创建一个消息循环
2public static void loop()。开始循环

1.3 Binder

Android进程间的通信机制,与传统的进程间通信机制相比,Binder进程间通信机制在进程间传输数据时,只需要执行一次拷贝操作,不仅提高了效率,而且节省了内容空间。

序号方法描述
1public static final int getCallingPid()。获取远程Binder调用端的pid
2public static final native long clearCallingIdentity()。清除远程Binder调用端uid和pid信息,返回origId变量
3public static final int getCallingPid()。获取远程Binder调用端的uid
4public static final native void restoreCallingIdentity(long token)。通过origId变量,还原远程Binder调用端的uid和pid信息

1.4 Instrumentation

具有跟踪application及activity生命周期的功能,用于android 应用测试框架中,被做为基类使用。
Instrumentation可以把测试包和目标测试应用加载到同一个进程中运行。既然各个控件和测试代码都运行在同一个进程中了,测试代码当然就可以调用这些控件的方法了,同时修改和验证这些控件的一些数据。
Android instrumentation是Android系统里面的一套控制方法或者“钩子”。这些钩子可以在正常的生命周期(正常是由操作系统控制的)之外控制Android控件的运行。

序号方法描述
1public void callActivityOnCreate(Activity activity, Bundle icicle)。钩住了本应该系统调用的onCreate方法,然后由用户自己来控制勾住的这个方法什么时候执行
2public void callActivityOnDestroy(Activity activity)。钩住了本应该系统调用的onDestroy方法
3public void callActivityOnStart(Activity activity)。钩住了本应该系统调用的onStart方法

2. 组件

2.1 AMS、WMS、Window

Android的framework层主要是由AMS、 WMS和View构成,其中AMS和WMS属于Android中的系统服务。

2.1.1 AMS作用

  1. 统一调度所有应用程序的Activity的生命周期;
  2. 启动或杀死应用程序的进程;
  3. 启动并调度Service的生命周期;
  4. 注册BroadcastReceiver,并接收和分发Broadcast;
  5. 启动并发布ContentProvider;
  6. 调度task;
  7. 处理应用程序的Crash;
  8. 查询系统当前运行状态。

2.1.2 WMS作用

  1. 为所有窗口分配Surface。客户端向WMS添加一个窗口的过程,其实就是WMS为其分配一块Surface的过程,一块块Surface在WMS的管理下有序的排布在屏幕上。Window的本质就是Surface。
  2. 管理Surface的显示顺序、尺寸、位置;
  3. 管理窗口动画;
  4. 输入系统相关:WMS是派发系统按键和触摸消息的最佳人选,当接收到一个触摸事件,它需要寻找一个最合适的窗口来处理消息,而WMS是窗口的管理者,系统中所有的窗口状态和信息都在其掌握之中。

2.1.3 Window作用

与窗口相关,窗口是一个抽象的概念,从用户的角度来讲,它是一个界面;从SurfaceFlinger的角度来看,它是一个Layer,承载着和界面有关的数据和属性;从WMS角度来看,它是一个WindowState,用于管理和界面有关的状态。

2.1.4 Activity与Window

  1. Activity只负责生命周期和事件处理;
  2. Window只控制视图;
  3. 一个Activity包含一个Window,如果Activity没有Window,那就相当于Service。

2.1.5 AMS与WMS

  1. AMS统一调度所有应用程序的Activity;
  2. WMS控制所有Window的显示与隐藏以及要显示的位置。

2.2 DVM、ART、JVM

2.2.1 Dalvik虚拟机( Dalvik Virtual Machine,DVM)

DVM是Google专门为Android平台开发的虚拟机,它运行在Android运行时库中。DVM并不是一个Java虚拟机(以下简称JVM)。

2.2.2 Android虚拟机(Android Runtime,ART)

Android 4.4发布,用来替换Dalvik虚拟技,Android 4.4默认采用的还是DVM,系统会提供一个选项来开启ART。在Android 5.0时,默认采用ART,DVM从此退出历史舞台。

2.2.3 Java虚拟机(Java Virtual Machine,JVM)

Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。

2.2.4 DVM与JVM的区别

  1. JVM基于栈则意味着需要去栈中读写数据,所需的指令会更多,这样会导致速度慢,对于性能有限的移动设备,显然不是很适合。DVM是基于寄存器的,它没有基于栈的虚拟机在拷贝数据而使用的大量的出入栈指令,同时指令更紧凑更简洁。但是由于显示指定了操作数,所以基于寄存器的指令会比基于栈的指令要大,但是由于指令数量的减少,总的代码数不会增加多少;
  2. 在Java SE程序中,Java类会被编译成一个或多个.class文件,打包成jar文件,而后JVM会通过相应的.class文件和jar文件获取相应的字节码。执行顺序为: .java文件 -> .class文件 -> .jar文件而DVM会用dx工具将所有的.class文件转换为一个.dex文件,然后DVM会从该.dex文件读取指令和数据。执行顺序为:.java文件 –>.class文件-> .dex文件。

2.2.5 ART与DVM的区别

  1. DVM中的应用每次运行时,字节码都需要通过即时编译器(JIT,just in time)转换为机器码,这会使得应用的运行效率降低。而在ART中,系统在安装应用时会进行一次预编译(AOT,ahead of time),将字节码预先编译成机器码并存储在本地,这样应用每次运行时就不需要执行编译了,运行效率也大大提升;
  2. 与DVM的GC不同的是,ART的GC类型有多种,主要分为Mark-Sweep GC和Compacting GC。ART的运行时堆的空间根据不同的GC类型也有着不同的划分,如果采用的是Mark-Sweep GC,运行时堆主要是由四个Space和多个辅助数据结构组成。

2.3 Content Providers

用于在不同的应用程序之间进行数据共享, Content Providers组件是运行在一个独立的应用程序中,即 它本身也是一个Android应用程序。组件一次传递给业务层中的Android应用程序的数据的量可能会非常大的,结合Binder进程间通信机制以及匿名共享内存机制,Content Providers组件就可以高效的将它里面的数据传递给业务层中的Android应用程序访问了。

2.4 TLS(Transport Layer Security)

HTTPS依赖一种实现方式,目前通用的是SSL,数字证书是支持这种安全通信的文件。另外有SSL衍生出TLS和WTLS,前者是IEFT将SSL标准化之后产生的(TLS1.0),与SSL差别很小,后者是用于无线环境下的TSL。
Android5.0开始默认启用了TLSv1.1和TLSv1.2,但是从Android4.1开始TLSv1.1和TLSv1.2其实就被支持了,只是默认没有启用。
Android P的应用程序要求默认使用加密连接,将禁止 App 使用所有未加密的连接,无论是接收或者发送流量,未来都不能明码传输,需要使用下一代(Transport Layer Security)传输层安全协议,而 Android Nougat 和 Oreo 则不受影响。

2.5 应用程序二进制接口(Application binary interface,ABI)

ABI定义了一套规则,允许编译好的二进制目标代码能在所有兼容该ABI的操作系统中无需改动就能运行。不同的Android手机使用不同的CPU,因此需要提供对应的二进制接口交互规则(即对应的ABI文件)才能进行交互。部分CPU是能支持多种交互规则,但这是在牺牲性能的前提下所做的兼容。主流的ABI架构:

  1. armeabiv-v7a: 第7代及以上的 ARM 处理器。2011年以后的生产的大部分Android设备都使用它;
  2. arm64-v8a: 第8代、64位ARM处理器,很少设备,三星 Galaxy S6是其中之一;
  3. armeabi: 第5代、第6代的ARM处理器,早期的手机用的比较多;
  4. x86: 平板、模拟器用得比较多;
  5. x86_64: 64位的平板。

2.6 BOOT_COMPLETED广播-自启动

  1. 在ActivityManagerService中由系统发送;
  2. 应用可以监听该广播,成为自启动权限,但是这样会有很多缺点,最大的缺点就是拖慢开机进度,影响用户体验;
  3. 开机状态会sys.boot_completed,可以通过该属性状态得到开机状态。

3. 另附两篇Application源码分析过程中的文章

  1. Android Applicaion组件创建的源代码分析.https://blog.csdn.net/qq_26906345/article/details/103693846。
  2. 部分源代码详解.
    https://blog.csdn.net/qq_26906345/article/details/103695560。

4. 参考文章

[1]: Android的Handler的简单理解和使用. https://blog.csdn.net/weixin_43548748/article/details/91128791.
[2]: Android消息处理机制:Handler中sendMessage()方法的几种重载方法. https://blog.csdn.net/fansl410k/article/details/79425765.
[3]: Android系统服务 —— WMS与AMS. https://www.jianshu.com/p/47eca41428d6.
[4]: Android源码的Binder权限控制. https://blog.csdn.net/bbmcdull/article/details/52046690.
[5]: Binder进程间通信系统. Android系统源代码情景分析.
[6]: Android进阶(三):Application启动过程(最详细&最简单). https://www.jianshu.com/p/4a8f44b6eecb.
[7]: Application初始化过程,基于android10. https://juejin.im/post/5ddb6b0de51d4523307fca86.
[8]: Android内存优化:DVM和ART原理初探. https://blog.csdn.net/weixin_42336002/article/details/80610555.
[9]: Content Provider组件的实现原理. Android系统源代码情景分析.
[10]: Android HTTPS、TLS版本支持相关解决方案. https://blog.csdn.net/devrecord/article/details/88580235.
[11]: 不同版本的TLS在Android中的支持情况. https://blog.csdn.net/yanzhenjie1003/article/details/80202476.
[12]: 加密传输才是王道!谷歌在 Android P 上默认启用 TLS. https://www.oschina.net/news/95202/dns-over-tls-support-in-android-p.
[13]: Android instrumentation原理. https://blog.csdn.net/a19891024/article/details/54342799.
[14]: Instrumentation的理解. https://www.jianshu.com/p/5a7768f22b36.
[15]: Android ABI的浅析. https://www.jianshu.com/p/d2119b3880d8.
[16]: 关于BOOT_COMPLETED广播-自启动. https://www.jianshu.com/p/679dc03ee650.
[17]: PackageManagerService原理分析文章合集. https://www.douban.com/note/726553288/.
[18]: PackageManagerService服务框架详解. https://www.jianshu.com/p/ef058fcfcd30.
[19]: Android 插件化原理解析——Hook机制之AMS&PMS.https://www.jianshu.com/p/8632fdc86009.
[20]: 一篇文章看明白 Android PackageManagerService 工作流程.https://blog.csdn.net/freekiteyu/article/details/82774947.

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐