Android源代码分析方法组件详解

  • 1. 类方法
    • 1.1 Handler方法
    • 1.2 Looper方法
    • 1.3 Binder
    • 1.4 Instrumentation
  • 2. 组件
    • 2.1 AMS、WMS、Window
      • 2.1.1 AMS作用
      • 2.1.2 WMS作用
      • 2.1.3 Window作用
      • 2.1.4 Activity与Window
      • 2.1.5 AMS与WMS
    • 2.2 DVM、ART、JVM
      • 2.2.1 Dalvik虚拟机( Dalvik Virtual Machine,DVM)
      • 2.2.2 Android虚拟机(Android Runtime,ART)
      • 2.2.3 Java虚拟机(Java Virtual Machine,JVM)
      • 2.2.4 DVM与JVM的区别
      • 2.2.5 ART与DVM的区别
    • 2.3 Content Providers
    • 2.4 TLS(Transport Layer Security)
    • 2.5 应用程序二进制接口(Application binary interface,ABI)
    • 2.6 BOOT_COMPLETED广播-自启动
  • 3. 另附两篇Application源码分析过程中的文章
  • 4. 参考文章

1. 类方法

1.1 Handler方法

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

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

1.2 Looper方法

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

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

1.3 Binder

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

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

1.4 Instrumentation

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

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

Android源代码分析之类方法与组件名词解释(持续更新)相关推荐

  1. 3D目标检测论文方法汇总 【2022部分持续更新中~

    Automanous-3D-detection-methods 版权注释 该项目地址为:https://github.com/LittleYuanzi/awesome-Automanous-3D-de ...

  2. Android开发:WGS-84、GCJ02坐标名词解释及坐标转换

    WGS-84.GCJ02坐标名词解释及坐标转换 目录 一.什么是WSG-84坐标系? 二 .什么是GCJ-02坐标系? 三.GCJ-02坐标系使用场景 四.函数说明 五.工具类代码 注:本文仅包含国测 ...

  3. Fabric 1.0源代码分析(27) Orderer #configupdate(处理通道配置更新)

    # Fabric 1.0源代码笔记 之 Orderer #configupdate(处理通道配置更新) ## 1.configupdate概述 configupdate,用于接收配置交易,并处理通道配 ...

  4. js中text方法是啥意识_一盏茶的时间,快速捕获JS中常用的方法(细心整理,持续更新ing)...

    不知不觉上班一周辽-趁着大好周末,小编挣扎着从床上爬起来,决定对前端日常编程中常用到的一些方法做一个系统的整合. 有些人或许会觉得忘了百度就完事儿,no no no!这事儿小编真的亲践过好多次,百度一 ...

  5. android proguard 第三方jar,Android Studio代码混淆-第三方jar混淆汇总(持续更新)

    前言 Android有非常多的优秀的第三方开源jar包,我们经常在我们的项目中使用了不少jar包,但是往往到了release的时候就忘了混淆第三方jar包了,会给我们开发带来不少麻烦,所有在这里汇总一 ...

  6. vue 雷达扫描_GitHub - suneildve/vueDataV: 基于Vue + Echarts 构建的数据可视化平台,酷炫大屏展示模板和组件库,持续更新各行各业实用模板和炫酷小组件。...

    前言 一个基于Vue前端框架和第三方图表库echarts构建的可视化大数据平台,通过vue项目构建.指令的灵活运用.组件封装.组件之间通信,使内部图表组件库可实现自由替换和组合. 项目中部分前端库采用 ...

  7. android app代码审计,常规漏洞/缺陷整理(持续更新)

    app源代码安全缺陷分析报告 前言 高等级缺陷 代码注入--WebView远程代码执行 代码质量--不安全的SSL:主机名验证功能被禁用 资源管理--通过共享存储安装APK 跨站脚本--反射型XSS ...

  8. Android 各大厂面试题汇总与详解(持续更新)

    介绍 目前网络中出现了好多各种面试题的汇总,有真实的也有虚假的,所以今年我将会汇总各大公司面试比较常见的问题,逐一进行解答.会一直集成,也会收集大家提供的面试题,如有错误,请大家指出,经过排查存在,会 ...

  9. 安卓开发者中心!那些BAT大厂的Android面试官到底在想些什么?持续更新中

    最近很多人说,Android越来越不好找工作了,学习NDK开发会不会好点,今天就聊聊这个问题.是否应该选择学NDK? 1.哪些场景下要用到NDK开发? 跨平台的库,如FFmpeg, skip,weex ...

最新文章

  1. 生命天书”破译20年,生命科学由此走向“大数据时代”
  2. Oozie和Azkaban的技术选型和对比
  3. CSS学习15之定位
  4. AngularJS相关网站存档
  5. 【Linux系统编程】进程概述和进程号
  6. 记录 之 整形数除整形数 产生的数据依然是整形,难搞哦
  7. python 获取当前文件夹下所有文件名
  8. php swoole process,PHP swoole的process模块创建和使用子进程操作示例
  9. 锐捷服务器虚拟化技术_用它!锐捷“双擎”云桌面助力检察机关统一业务应用系统2.0上线...
  10. 黄聪:is_file和file_exists效率比较
  11. html转pdf错误wkhtmltopdf
  12. 预习 Delphi 2009 中的新功能 - JSON (二) : 如何在 Delphi 中使用 json
  13. Qt网络编程、tcp通信、文件传输、程序打包和图标设置(QT五)
  14. Spark versus Flink: Understanding Performance in Big Data Analytics Frameworks论文总结
  15. 阿里云短信接口对接(java版)
  16. UVA11584PartitioningByPalindromes
  17. cnpm : 无法加载文件 C:\Users\azhao\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本 问题解决
  18. 网络工程师必知:网关与防火墙有什么区别?
  19. 使用Docker pull一些软件时,遇到某个id一直处于waiting的状态
  20. Vue实现二选一、菜单更多功能:

热门文章

  1. 送客户的祝福语_送给客户的事业祝福语大全(含贺词、寄语等)
  2. 一套停车场管理软件附带源代码 J2EE服务端+android客户
  3. 23考研总分420+上岸南京大学软件工程专硕南京大学软件工程842经验贴24考研必看
  4. 外星人入侵pythonppt_入行数据分析师不得不看的10本书
  5. 有限元分析的基本知识
  6. 干货 | 每天上百万通话,携程电话系统性能测试实践
  7. 【rmzt:火影忍者佩恩动漫主题】
  8. android studio怎么使用sharesdk,Android Studio中ShareSDK分享的使用.
  9. SAP Bibliothek
  10. QT编译liblzma