ActivityStart

当手指点击了桌面的App图标时

当手指点击了桌面的App图标时发生了什么

极简:桌面本身就是一个常驻的App,点击桌面图标的时候,其实也是一个正常的App唤起另一个App的过程;

那么首先处理点击事件,然后走到Activity.startActivity(),这一步会通过Instrument调用AIDL接口,AMS服务先发一个pause事务给调用方Activity,于是当前Activity的ActivityThread收到pause事务后调用自身的performPauseActivity,当前Activity进入暂停状态。

然后就是启动新App的流程,首先Zygote进程fork自身(fork所以会有runtime),之后在新进程中执行ActivityThread(App的执行入口),ActivityThead就是一个常见的Java Main类一样,走到其main(String[] args)入口方法,其中包括: 1. 调用Looper.prepareMainLooper进行主线程looper初始化; 2. ActivityThead.acttach()进行Application初始化; 3. Loop.loop()进入消息循环

进程初始化完成并且主线程进入了循环,接下来就是往消息循环中提交Launch事务进行perforLaunchActivity初始化Activity,其中包括(顺序):1. attach()初始化Window,并为其设置WindowManager; 2. onCreate()初始化DecorView并inflate布局添加到DecorView; 3. OnResume()中调用Window.addView,创建ViewRootImpl并调用其setView,setView中执行了reqeustLayout。

Activity的Window初始化并添加了DecorView后,setView意味着在OnResume执行完成后的下一个handler消息就是渲染页面了,也就是通过 渲染时通过编舞者,先post一个同步消息屏障到主线程消息循环中并注册Vsyn回调的异步消息,意在阻拦所有同步消息执行,继而使渲染的message优先执行,在屏幕发出Vsync之后,回调到编舞者中开始执行输入、动画、Traversal,其中Traversal会移除同步消息屏障后开始执行view的测量、布局、渲染。

startActivity_onCreate.jpg

Read more

Gc

现代VM:”引用计数法,不行。可达性分析法,行!”
JVM:”可达分析法,很行”

Read more

fresco

Fresco(2.5.0)

以MVC的 Fresco架构入手,层层递进分析fresco的整体思路。

img

Read more

Android Build

Apk总构建流程

简述

Aapt 会将主工程、依赖库中的资源(res、assets)和androidManifest都合并,产出R.java、资源及资源索引resources.arsc;

之后javac编译包括R.java文件、主工程的java文件、aidl产生的java文件,产出class文件;如果需要插桩的话就插桩

之后使用Proguard/R8混淆工具对.class文件脱糖、压缩、混淆等,产出新的class文件;

之后使用Dx/D8编译工具将新的class文件再转换成dex文件,

之后打包成apk,然后签名、zipalign优化。

工具:aapt/aapt2、javac、Proguard/R8、Dx/D8、ApkBuilder、zipalign

img

Read more

ScreenDraw

从onCreate到页面绘制

当手指点击了桌面的App图标时发生了什么 - ProcessOn

Android 屏幕刷新机制

主要参考 https://juejin.cn/post/6863756420380196877#heading-12

省流版:

双缓存:为了解决画面撕裂;画面撕裂来自于只有一个buffer时,正在display的那一帧数据被后一帧的数据覆盖了

Vsync:系统在收到VSync pulse(Vsync脉冲)后,将马上开始下一帧的渲染,(CPU开始计算数据)。

三缓冲:当显示器正在写入FrameBuffer同时GPU也正在写入BackBuffer时,下一次渲染开始了,此时CPU可以使用新增的GraphicBuffer进行计算。减少了Jank。(更多缓冲需要耗费更大的内存)

ChoreoGrapher机制:规定了数据计算开始(measure、layout、draw)的时机(vsync信号),使计算到渲染图像数据能有一个完整的16.6ms:更新ui(request()/invalidate())后编舞者注册vsync信号回调,在下一个vsync信号到时候立刻进行view的测量布局绘制

Read more