Android UI程序启动流程(AMS/PMS)
当启动一个app,会先加载ActivityThread类的main方法,来开辟一个主线程ActivityThread,里面构造一个Looper.prepareMainLooper(),方法最后会调用Looper.loop()方法。
结合之前的handle学习,主looper需要进行阻塞住,当界面没有任何事件过来主线程就会堵塞在那里,来消息了才会再次运行。
Instrumentation用于管理Activity生命周期;
ApplicationThread:作为一个通信类,专门负责ActivityThread和AMS之间的通信。属于是ActivityThread为AMS提供的N个回调函数;
PMS管理的是清单文件;
重整体过程中我们可以整理一下几点:
1.Lunch进程会将清单文件中相关配置信息传递数据入AMS;
2.AMS负责的管理配置信息;
3.Activity启动后会生产一个ApplicationThread通信类对于AMS进行通信
4.AMS接收到attach调用后,将相关配置信息筛选、打包后交由事物管理进行回调,事物管理会回调ApplicationThread中的相关schudle函数进行通信;
5.所有的具体数据构建的反射构建由Instrumentation完成;
AMS、PMS是系统存在的,当手机关机就不存在了;
PMS:管理清单文件;
AMS/PMS到底是什么作用?
PMS用于包管理、包解析、结果缓存、接口查询,是运行在手机开机的时候;
PMS中有包缓存集合,解析出这些包,然后通过这些包找到各自对应的activityInfo信息,activityInfo中有ActivityName等信息,可以利用反射构建成Activity界面,Activity生命周期需要管理,ActivityThread进行缓存管理(一个应用对应一个ActivityThread,充当AMS的缓存中心);
AMS用于Activity的生命周期管理,是在需要进行Activity跳转的时候;
hook AMS实现集中式登录,登录的时候通过跳转的时候进行hook,判断是否跳转登录,然而代码中只写startActivity跳转,其他内部操作由hook技术实现
hook技术的弊端:有兼容性,系统源码会不一样,hook方式也不一样。
hook必须是静态变量,非静态的是不能hook的;
刷新率:表示一秒屏幕刷新的速度,一般是60HZ;
帧速率:表示GPU在一秒内绘画出来多少画面,如:30FPS/60FPS;
如果刷新率高于帧速率:会出现画面黑屏,刷新的速度过快导致画面没有那么多,中间会出现黑画面表示没有图展示;
如果帧速率高于刷新率:也就是每秒的绘画速度会高于每秒看到的画面速度,就会导致出现跳屏,比如游戏画面会一下到另外的场景;