Android app的启动到显示
lin-0410
最痛苦的事情,不是失败了,而是我本可以......
所以,如果目标还没去实现,不要感叹为时已晚,因为种一棵树最好的时间是十年前,其次是现在!
展开
-
App的启动过程(6)面向应用程序的本地窗口surface
接下来分析下面向应用程序的本地窗口surface,这里的surface不是Surface.java,而是指Surface.cpp,它承担着应用程序中的UI显示需求,一方面要向上层提供绘制图像的画板,也就是GraphicBuffer,另一方面配合surfaceflinger完成收集应用程序的图像数据。当然,应用程序是不可能直接使用surface(后者说bufferQueue,图形缓冲区Graphic原创 2017-06-01 17:17:29 · 869 阅读 · 0 评论 -
App的启动过程(9)surfaceflinger对vsync的处理
这个onVSyncReceived函数不复杂,感觉就是打开vsync,关掉vsync,但是要弄明白,还是要从surfaceflinger的初始化开始: 先简单概括下vsync信号的传递:首先是HWComposer产生vsync,通过回调hook_vsync,在通过mEventHandler.onVSyncReceived(disp,timestamp);到surfaceflin原创 2017-06-01 17:41:07 · 2257 阅读 · 2 评论 -
App的启动过程(1)framework侧-startActivity的判断处理流程
通过点击桌面图标,可以启动这个应用程序制定的一个Activity,后面会调用到ActivityManagerService的StartActivity的函数。经过一些判断和准备,如果顺利,AMS最终尝试启动制定的Activity,Android规定,在新的Activity启动前,原先处于resumed状态的activity会被pause。将一个activity置为pause,是通过这个activi原创 2017-06-01 16:59:08 · 1110 阅读 · 0 评论 -
App的启动过程(10)surfaceflinger对数据合成,送显
下面就是SurfaceFlinger执行实际的数据合成,然后刷新到屏幕上。voidSurfaceFlinger::onMessageReceived(int32_t what) { switch(what) { case MessageQueue::INVALIDATE: { bool refreshNeeded =handleMes原创 2017-06-01 17:43:35 · 2216 阅读 · 0 评论 -
App的启动过程(8)surfaceflinger的启动
接下来就是怎样把BufferQueue中数据,也就是GraphicBuffer中的数据显示到屏幕上,这就是surfaceflinger做的事情。 先说surfaceflinger的启动,Android7.0上,应该是在接下init.rc脚本时启动的,启动后运行的是main_surfaceflinger.cpp。/*surfaceflinger.rc*/service s原创 2017-06-01 17:37:18 · 1564 阅读 · 1 评论 -
App的启动过程(7)BufferQueue的申请分配
接下来看下BufferQueue的申请分配,就是经典的生产者-消费者模型。1)BufferQueueCore可以认为BufferQueueCore是一个服务中心,生产者、消费者都要通过它来管理buffer。里面有一个重要的成员数组:BufferQueueDefs::SlotsType mSlots;这个BufferSlot中有一个成员变量:spmGraphicBuffer;记录这个slot原创 2017-06-01 17:34:23 · 3517 阅读 · 0 评论 -
App的启动过程(2)framework侧-恢复最上层的Activity
上篇文档说到:startActivity的判断处理流程,接下来会调用[email protected],恢复最上层的Activity,pause之前的Activity,先看resumeFocusedStackTopActivityLocked函数的处理。/*ActivityStackSuperviso原创 2017-06-01 17:02:33 · 818 阅读 · 0 评论 -
App的启动过程(3)应用进程侧-主线程的处理
第二阶段、应用进程侧的处理,主要是ViewTree的遍历。 接着第一段的最后调用:app.thread.scheduleLaunchActivity();这里的.thread是ApplicationThread,它是应用进程跟AMS通信的桥梁,AMS会通过:app.makeActive(mSystemThread.getApplicationThread(),mProcessS原创 2017-06-01 17:07:09 · 522 阅读 · 0 评论 -
App的启动过程(4)在WMS中注册窗口
Step3、在WMS中注册窗口WMS中的窗口window是一个抽象的概念,由WindowState来描述状态。跟PhoneWindow不是一个概念。接着root.setView()分析。/* ViewRootImpl.java */ViewRootImpl除了作为ViewTree的管理者,另一个作用就是跟WMS通信,它在构造时就建立了与WMS通信的通道,这里的WindowSession原创 2017-06-01 17:10:57 · 548 阅读 · 0 评论 -
App的启动过程(5)ViewTree遍历中最后一步的Draw
以上是WMS端窗口的添加,下面接着ViewTree遍历中最后一步的Draw的分析。/* ViewRootImpl.java */private boolean drawSoftware()à canvas =mSurface.lockCanvas(dirty);跟View交互的是Canvas,比如draw(Canvas cs)参数,应用进程与surfaceflinger交互的是surf原创 2017-06-01 17:15:01 · 544 阅读 · 0 评论 -
activity的启动模式,startactivity的过程
Android:launchMode用于指定Activity被启动的方式,主要包括两个方面:即Activity是否为单实例,及Activity归属的task。不管是那种方式,被启动的Activity都要位于Activitytask的栈顶。1),standard,默认状态,这种模式下Activity是多实例的,系统总是启动一个新的Activity来满足要求,即使之前已...原创 2017-09-28 19:59:34 · 2377 阅读 · 0 评论