图文浅析APK程序运行的过程
概述
APK程序运行过程有别于FrameWork底层启动过程,它们是倆码事,本文将以图文方式总结一下APK启动的过程,主要分为一下部分
【1】基本概念
【2】APK过程
1 、新的知识点
【1】什么是UI线程与Thread线程区别
UI线程并不陌生,但是这玩意到底是啥,与普通线程Thread有啥区别呢?
什么是UI线程:
ActivityTread类所在的线程即为UI线程,负责用户交互,处理用户消息绘制界面等
区别:
UI线程的ActivityTread中的Main方法已经使用Looper.prepareMainLooper为该线程添加了Looper对象,即已经为该线程创建了消息队列MQ,而普通线程Thread只是一个裸线程而已(可以联想一下AsyncTask将普通线程变为LOOP线程的过程)
【2】Framework概述
主要包含3大部分,其服务器,客户端,Linux驱动,其中他们对应的核心类需要了解,否则APK过程分析起来就会一头雾水
核心类介绍如下
特别是DECORVIEW,在客户端程序中首先处理消息的就是DecorView
2 APK程序运行过程
首先从ActivityThread的Main()——>ActivityThread——>UILoop循环处理(绿色部分),但是在每一步背后都有详细的过程如下图黄色部分,过程
(1)首先ActivityThread的Main()执行,调用调用prepareMainLooper()为UI线程创建消息队列(MessageQueue),
(2)然后创建一个ActivityThread对象,期间会创建俩个对象Handler(处理消息队列),ApplicationThread(Binder)对象(接收远程Ams的IPC调用)
(3)UI主线程调用Looper.loop()进入消息循环体,当接收到Ams发送start某个Activity后将会创建指定的Activity对象,Actvity又会依次创建创建PhoneWindow类,DécorView类,创建View/ViewGroup
(4)最后调用WindowManager类(创建好的界面显示到屏幕)
最后顺便提下,Android的事件派发机制和Windows的消息派发机制挺像的,其实这是一种典型的消息“冒泡”机制,消息最先到 达最底层View(DecorView),然后它先进行判断是不是它所需要的,否则就将消息传递给它的子View,这样一来,消息就从水底的气泡一样向上浮了一点距离,以此类 推,气泡达到顶部和空气接触,破了(消息被处理了),当然也有气泡浮出到顶层了,还没破(消息无人处理),这个消息将由系统来处理,对于Android来
说,会由Activity来处理。
图文浅析APK程序运行的过程的更多相关文章
- [转帖]浅析java程序的执行过程
浅析java程序的执行过程 转帖来源: https://www.cnblogs.com/wangjiming/p/10315983.html 之前学习过 这一块东西 但是感觉理解的不深刻. copy一 ...
- 浅析java程序的执行过程
在研究任何一门语言时,无论是面向过程的c,c++(面向过程和面向对象),还是面向对象的.net,java等,弄清语言执行过程至关重要. 何为语言执行过程? 所谓语言执行过程,指对于任何一门语言,如j ...
- 动态绑定允许我们在程序运行的过程中动态给class加上功能,这在静态语言中很难实现
https://www.liaoxuefeng.com/wiki/ # 正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法, # 这就是动态语言的 ...
- Java内存管理-程序运行过程(一)
勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 相信在做Java开发的伙伴一定知道 JVM(Java Virtual Machine( ...
- 孙鑫MFC学习笔记3:MFC程序运行过程
1.MFC中WinMain函数的位置在APPMODUL.cpp APPMODUL.cpp中是_tWinMain,其实_tWinMain是一个宏#define _tWinMain WinMain 2.全 ...
- DirectShow程序运行过程简析
这段时间一直在学习陆其明老师的<DirectShow开发指南>一书,书中对DirectShow的很多细节讲解清晰,但是却容易让人缺少对全局的把握.在学习过程中,整理了关于DirectSho ...
- 基础知识《零》---Java程序运行机制及运行过程
Java运行机制 Java虚拟机(Java Virtual Machine):Java虚拟机可以理解成一个以字节码为机器指令的CPU:对于不同的运行平台,有不同的虚拟机:Java虚拟机机制屏蔽了底层运 ...
- Java程序编译和运行的过程
Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来简单的说明整个流程. 如下图,Java程序从源文件创建到程序运行要经过两大步骤:1.源文件由编译器编译成字节码(ByteCode) 2 ...
- Java程序编译和运行的过程【转】
转自:http://www.360doc.com/content/14/0218/23/9440338_353675002.shtml Java整个编译以及运行的过程相当繁琐,本文通过一个简单的程序来 ...
随机推荐
- iframe嵌套页面 音频在微信公众号环境无法播放
在微信公众号中 没有iframe的时候window.WeixinJSBridge为对象,有iframe时为undefined 要使用 window.parent.WeixinJSBridge得到 if ...
- 利用mybatis-generator自动生成数据持久化的代码
MyBatis生成器简介 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器.它将生成所有版本的MyBatis的代码,以及版本2.2.0之后的iB ...
- Python小代码_10_判断是否为素数
import math n = int(input('Input an integer:')) m = int(math.sqrt(n) + 1) for i in range(2, m): if n ...
- 含有分类变量(categorical variable)的逻辑回归(logistic regression)中虚拟变量(哑变量,dummy variable)的理解
版权声明:本文为博主原创文章,博客地址:,欢迎大家相互转载交流. 使用R语言做逻辑回归的时候,当自变量中有分类变量(大于两个)的时候,对于回归模型的结果有一点困惑,搜索相关知识发现不少人也有相同的疑问 ...
- Docker常见仓库MongoDB
MongoDB 基本信息 MongoDB 是开源的 NoSQL 数据库实现. 该仓库提供了 MongoDB 2.2 ~ 2.7 各个版本的镜像. 使用方法 默认会在 27017 端口启动数据库. $ ...
- webpack 1.x 配合npm scripts管理多站点
需求场景: 希望通过一个webpack文件夹管理多个站点的打包流程. 假设现在我要为站点domain配置打包流程. npm 添加淘宝镜像 你懂得 vim ~/.npmrc registry = htt ...
- Dubbo框架应用之(三)--Zookeeper注册中心、管理控制台的安装及讲解
我是在linux下使用dubbo-2.3.3以上版本的zookeeper注册中心客户端.Zookeeper是Apache Hadoop的子项目,强度相对较好,建议生产环境使用该注册中心.Dubbo未对 ...
- Activtiy完全解析(三、View的显示过程measure、layout、draw)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/52840065 本文出自:[openXu的博客] 在Activity完全解析的第一篇文章A ...
- 从Stage角度看cassandra write
声明 文章发布于CSDN cassandra concurrent 具体实现 cassandra并发技术文中介绍了java的concurrent实现,这里介绍cassandra如何基于java实现ca ...
- Hive基本原理及环境搭建
今天我主要是在折腾这个Hive,早上看了一下书,最开始有点凌乱,后面慢慢地发现,hive其实挺简单的,以我的理解就是和数据库有关的东西,那这样的话对我来说就容易多啦,因为我对sql语法应该是比较熟悉了 ...