标签归档:安卓

从Invalidate到Draw的辗转历程

以android Q的源码为例子,一步步分析invalidate的调用流程。

在写自定义控件的时候时常会用到 invalide 方法,都知道调用 invalide 后会回调Draw方法,但其中的辗转历程鲜有人知,为了搞清这个流程,我从android Q 源码入手分析了整个调用流程。在此记录一下,省得以后忘了

1.App Call SufaceFlinger

1.任何的View的invalidate方法最终都会调用到ViewRootImpl.java的invalidate()或者invalidateChildInParent,区别只是mDirty的大小,这个mDirty表示这个区域需要重绘

frameworks/base/core/java/android/view/ViewRootImpl.java

2.scheduleTraversals的实现如下

frameworks/base/core/java/android/view/ViewRootImpl.java

3.这里需要注意的是一个插入同步屏障的过程,插入同步屏障后,只有异步的消息才能在MessageQeue循环,app这边 Handler之类的全部失去效果,所以在Traversals执行或者取消的时候会马上移除,如下所示 查看更多

Binder的一次拷贝是哪次

binder的一次拷贝发生在客户端发消息时,从用户空间拷贝消息到内核空间,原因是内核空间与用户空间存在内存隔离,必须内核和驱动开发专用函数 copy_from_user(…),把内存从用户空间拷贝过来才能继续操作

binder请求过程

简述一下通信过程:

1)进程启动时候,打开binder驱动,使用mmp()函数分配一段物理内存,让内核空间和用户空间都指向这段内存,mmp返回共享空间的地址,由进程持有,对应的内核部分由该进程对应的节点持有,驱动维护着所有节点

2)客户端通过驱动查询服务端的节点,不是直接通过驱动,而是先经过了servicemnager,但 servicemnager 实际上是句柄为0的服务端 查看更多