<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Systrace分析知識(shí)點(diǎn)

          共 6571字,需瀏覽 14分鐘

           ·

          2023-06-20 10:46

          和你一起終身學(xué)習(xí),這里是程序員Android

          經(jīng)典好文推薦,通過(guò)閱讀本文,您將收獲以下知識(shí)點(diǎn):

          一、抓取Systrace
          二、CPU模塊知識(shí)點(diǎn)
          三、input 點(diǎn)擊事件處理流程
          四、Vsync 事件處理
          五、Android 繪制一幀流程分析
          六、Camx Trace TAG開啟方法
          七、參考文獻(xiàn)

          一、抓取Systrace

          1.1 使用手機(jī)抓取

          使用Google 預(yù)留的開發(fā)者模式中的 系統(tǒng)跟蹤 功能抓取systrace。
          步驟:
          設(shè)置--開發(fā)者模式--系統(tǒng)跟蹤
          trace文件保存路徑:
          /data/local/traces

          手機(jī)抓取trace

          抓取完之后使用adb 命令 pull 出來(lái)即可

          C:\Users\ >adb pull /data/local/traces .
          /data/local/traces/: 1 file pulled, 0 skipped. 95.1 MB/s (51342186 bytes in 0.515s)

          C:\Users\ >
          1.2 python 命令抓取

          參考命令如下:

           python systrace.py -o mynewtrace.html sched freq idle am wm gfx view binder_driver hal dalvik camera input res

          比較麻煩,需要安裝環(huán)境,不推薦,有成熟腳本除外。

          二、CPU模塊知識(shí)點(diǎn)

          2.1 CPU頻率,CPU loading 計(jì)算

          CPU loading 計(jì)算公式
          CPU 負(fù)載loading = Wall duration ÷ 選擇CPU 個(gè)數(shù)÷ 選擇CPU的范圍

          CPU Loading

          2.2 Thread 在CPU中的狀態(tài)
          • 綠色:運(yùn)行中 Running
            對(duì)于在CPU上執(zhí)行的進(jìn)程,需要查看其運(yùn)行時(shí)間、是否跑在該跑的核上、頻率是否夠等。

          • 淺綠色:可運(yùn)行 Runnable
            對(duì)于在等待序列中的進(jìn)程,需要查看是否有過(guò)多任務(wù)在等待、等待時(shí)間是否過(guò)長(zhǎng)等。

          • 白色:休眠中 Sleeping
            這里一般是在等事件驅(qū)動(dòng)。

          • 橘色:不可中斷的睡眠態(tài)_IO_Block Uninterruptible Sleep | WakeKill - Block I/O
            線程在I / O上被阻塞或等待磁盤操作完成。

          • 紫色:不可中斷的睡眠態(tài) Uninterruptible Sleep
            線程在另一個(gè)內(nèi)核操作(通常是內(nèi)存管理)上被阻塞。

          舉例如下:

          Thread 在CPU中的狀態(tài)

          2.3 CPU 喚醒關(guān)系查看
          1. 首先點(diǎn)擊查看當(dāng)前線程正在哪個(gè) CPU 中運(yùn)行

          CPU 喚醒關(guān)系查看一

          1. 點(diǎn)擊查看 Thread 的 箭頭,既可以查看是被誰(shuí)喚醒的

          CPU 喚醒關(guān)系查看二

          三、input 點(diǎn)擊事件處理流程

          3.1 Android 點(diǎn)擊事件處理流程概覽
          1. SystemServer AppLaunch_dispatchPtr:Up 處理點(diǎn)擊up事件

          2. SystemServer 通過(guò)InputReader讀取屏幕點(diǎn)擊事件后,將點(diǎn)擊事件通過(guò)InputDispatcher 進(jìn)行分發(fā)

          3. SystemServer OutboundQueue 接收存放即將派發(fā)給AppConnection 的點(diǎn)擊事件

          4. SystemServer WaitQueue接收存放已經(jīng)派發(fā)給AppConnection ,但 App還在處理且沒(méi)有返回成功的點(diǎn)擊事件

          5. Launcher deliverInputEvent: Launcher 桌面 被input事件喚醒

          6. Camera APP bind 通過(guò)跟SystemServer bind 調(diào)用,開始啟動(dòng)Camera

          3.2 Android 點(diǎn)擊事件處理流程圖

          Android 點(diǎn)擊事件處理流程圖如下:

          Android 點(diǎn)擊事件處理流程圖

          3.2 Android 點(diǎn)擊事件處理關(guān)鍵TAG
          TAG名字 所在進(jìn)程 備注
          AppLaunch_dispatchPtr:Down SystemServer 點(diǎn)擊Down事件
          AppLaunch_dispatchPtr:Up SystemServer 點(diǎn)擊up事件
          InputReader SystemServer 點(diǎn)擊事件讀取
          InputDispatcher SystemServer 點(diǎn)擊事件分發(fā)
          oq SystemServer OutBoundQueue 點(diǎn)擊事件存放
          wq SystemServer WaitQueue 點(diǎn)擊事件待消費(fèi)返回
          deliverInputEvent Launcher app 點(diǎn)擊事件消費(fèi)

          四、Vsync 事件處理

          Vsync 信號(hào)可以由硬件產(chǎn)生,也可以用軟件模擬,不過(guò)現(xiàn)在基本上都是硬件產(chǎn)生,負(fù)責(zé)產(chǎn)生硬件 Vsync 的是 HWC,HWC 可生成 VSYNC 事件并通過(guò)回調(diào)將事件發(fā)送到 SurfaceFlinger , DispSync 將 Vsync 生成由 Choreographer 和 SurfaceFlinger 使用的 VSYNC_APP 和 VSYNC_SF 信號(hào)

          4.1 VSYNC_app信號(hào)app處理

          第一階段:
          App 在收到 Vsync-App 的時(shí)候,在主線程進(jìn)行 measure、layout、draw(構(gòu)建 DisplayList , 里面包含 OpenGL 渲染需要的命令及數(shù)據(jù)) 。這里對(duì)應(yīng)的 Systrace 中的主線程 doFrame 操作

          第二階段:
          CPU 將數(shù)據(jù)上傳(共享或者拷貝)給 GPU, 這里 ARM 設(shè)備 內(nèi)存一般是 GPU 和 CPU 共享內(nèi)存。這里對(duì)應(yīng)的 Systrace 中的渲染線程的 flush drawing commands 操作

          第三階段:
          通知 GPU 渲染,真機(jī)一般不會(huì)阻塞等待 GPU 渲染結(jié)束,CPU 通知結(jié)束后就返回繼續(xù)執(zhí)行其他任務(wù),使用 Fence 機(jī)制輔助 GPU CPU 進(jìn)行同步操作

          第四 階段:
          swapBuffers,并通知 SurfaceFlinger 圖層合成。這里對(duì)應(yīng)的 Systrace 中的渲染線程的 eglSwapBuffersWithDamageKHR 操作
          VSYNC_app信號(hào)處理流程如下:

          VSYNC_app信號(hào)處理

          4.2 VSYNC_sf 信號(hào)SF處理

          第五階段:
          SurfaceFlinger 開始合成圖層,如果之前提交的 GPU 渲染任務(wù)沒(méi)結(jié)束,則等待 GPU 渲染完成,再合成(Fence 機(jī)制),合成依然是依賴 GPU,不過(guò)這就是下一個(gè)任務(wù)了.這里對(duì)應(yīng)的 Systrace 中的 SurfaceFlinger 主線程的 onMessageReceived 操作(包括 handleTransaction、handleMessageInvalidate、handleMessageRefresh)SurfaceFlinger 在合成的時(shí)候,會(huì)將一些合成工作委托給 Hardware Composer,從而降低來(lái)自 OpenGL 和 GPU 的負(fù)載,只有 Hardware Composer 無(wú)法處理的圖層,或者指定用 OpenGL 處理的圖層,其他的 圖層偶會(huì)使用 Hardware Composer 進(jìn)行合成

          第六階段 :
          最終合成好的數(shù)據(jù)放到屏幕對(duì)應(yīng)的 Frame Buffer 中,固定刷新的時(shí)候就可以看到了
          VSYNC_sf 信號(hào)SF處理流程如下:

          VSYNC_sf 信號(hào)SF處理

          五、Android 繪制一幀流程分析

          5.1 顯示一幀流程概覽

          程序員Android

          原圖鏈接:
          https://upload-images.jianshu.io/upload_images/5851256-5d802da2815c12f2.png

          5.1.1 Android 顯示一幀大致分為下面 八步:
          1. App 接收到 vsync-app 信號(hào)后開始工作。

          2. App 主線程被Message喚醒,執(zhí)行onVsync。

          3. App 執(zhí)行 doFrame ,處理input、animation、traversal、draw等。

          4. App UIThread 跟RenderThread sync 數(shù)據(jù)。

          5. App 執(zhí)行DrawFrame,從SurfaceFlinger(后續(xù)簡(jiǎn)稱SF) 的 BufferQueue 中 Dequeue buffer,取出一個(gè)bufffer后,執(zhí)行渲染繪制,接著將繪制好的Buffer 通過(guò)queuebuffer 放回到。BufferQueue中給 SF消費(fèi)。

          6. App queuebuffer 后, SF 中對(duì)應(yīng)的 app buffer 會(huì)增加 +1。

          7. Vsync-sf 到來(lái)后,SF 從BufferQueue 中 acquireBuffer一個(gè)Buffer 進(jìn)行消費(fèi), 對(duì)應(yīng)SF 中的 app buffer 會(huì)減 - 1 , SF 消費(fèi)處理后,通過(guò) releaseBuffer 將buffer 歸還到BufferQueue 中。

          8. SF 通過(guò) bind 跟 Hardware Composer HAL(簡(jiǎn)稱HWC) 進(jìn)行通信,通過(guò)一些處理后顯示到手機(jī)屏幕上。

          5.2 生產(chǎn)者,消費(fèi)者 BufferQueue 流轉(zhuǎn)圖

          生產(chǎn)者,消費(fèi)者 BufferQueue 流轉(zhuǎn)圖

          原圖鏈接:
          https://upload-images.jianshu.io/upload_images/5851256-1fd0a4018940ddd8.png

          1. dequeue(生產(chǎn)者發(fā)起) :
            當(dāng)生產(chǎn)者需要緩沖區(qū)時(shí),它會(huì)通過(guò)調(diào)用 dequeueBuffer() 從 BufferQueue 請(qǐng)求一個(gè)可用的緩沖區(qū),并指定緩沖區(qū)的寬度、高度、像素格式和使用標(biāo)記。

          2. queue(生產(chǎn)者發(fā)起):
            生產(chǎn)者填充緩沖區(qū)并通過(guò)調(diào)用 queueBuffer() 將緩沖區(qū)返回到隊(duì)列。

          3. acquire(消費(fèi)者發(fā)起) :
            消費(fèi)者通過(guò) acquireBuffer() 獲取該緩沖區(qū)并使用該緩沖區(qū)的內(nèi)容

          4. release(消費(fèi)者發(fā)起) :
            當(dāng)消費(fèi)者操作完成后,它會(huì)通過(guò)調(diào)用 releaseBuffer() 將該緩沖區(qū)返回到隊(duì)列

          5.3 App ,SF Buffer 交互圖

          App ,SF Buffer 交互圖

          原圖鏈接:
          https://upload-images.jianshu.io/upload_images/5851256-9ee4c505abf5eff3.png

          1. App 通過(guò)bind 向SF dequeuebuffer 進(jìn)行buffer申請(qǐng)

          2. SF 對(duì)端完成對(duì)bufferQueue 的dequeuebuffer的申請(qǐng)

          3. App 處理合成完后,通過(guò)binder向SF queuebuffer 申請(qǐng)buffer 入隊(duì)。

          4. SF 對(duì)端通過(guò)queuebuffer 完成buffer 對(duì)BufferQueue的入隊(duì)申請(qǐng),供SF消費(fèi)并顯示到屏幕上

          5.4 SF 跟 HWC 交互圖

          SurfaceFlinger 接受來(lái)自多個(gè)來(lái)源的數(shù)據(jù)緩沖區(qū),對(duì)它們進(jìn)行合成,然后發(fā)送到顯示設(shè)備。

          SF 送顯圖

          原圖鏈接:
          https://upload-images.jianshu.io/upload_images/5851256-e2998c0cd7dd4219.png

          SF 跟 HWC 交互圖

          原圖鏈接:
          https://upload-images.jianshu.io/upload_images/5851256-53d12f9bfef6809a.png

          1. vsync-sf 周期到來(lái),SF 開始繪制準(zhǔn)備工作

          2. SF 通過(guò) acquirebuffer 從BufferQueue 中取出一幀進(jìn)行消費(fèi)

          3. App 對(duì)應(yīng)的BufferQueue 在SF acquirebuffer 后對(duì)那個(gè)的值會(huì) -1

          4. App 對(duì)應(yīng)的buffer 值為 2

          5. App 對(duì)應(yīng)的buffer值 在SF acquirebuffer 后變?yōu)?1

          6. SF 跟HWC 通過(guò)binder 通信處理完后,通過(guò)rleasebuffer將buffer 歸還到BufferQueue中,緊接著一幀就可以顯示出來(lái)

          六、Camx Trace TAG開啟方法

          6.1 打開 Camx HAL 層 camx log tag

          執(zhí)行以下命令,打開camx trace log tag

               adb root
          adb remount
          adb shell mkdir /vendor/etc/camera
          adb shell rm -rf /vendor/etc/camera/camxoverridesettings.txt
          adb shell touch /vendor/etc/camera/camxoverridesettings.txt
          adb shell "echo traceGroupsEnable=0x10080 >> /vendor/etc/camera/camxoverridesettings.txt"
          adb shell "echo traceErrorEnable=TRUE >> /vendor/etc/camera/camxoverridesettings.txt"
          adb shell "echo traceOutputEnable=0x10080 >> /vendor/etc/camera/camxoverridesettings.txt"
          adb shell cat /vendor/etc/camera/camxoverridesettings.txt
          adb reboot
          6.2 重啟手機(jī)后打開kernel 的trace開關(guān)

          重啟后打開kernel trace 開關(guān)

                 adb root
          adb remount
          adb shell "echo 1 > /sys/kernel/tracing/events/camera/enable"

          七、參考文獻(xiàn)

          【騰訊文檔】Camera學(xué)習(xí)知識(shí)庫(kù)
          https://docs.qq.com/doc/DSWZ6dUlNemtUWndv


          友情推薦:

          Android 開發(fā)干貨集錦

          至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺(jué)得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請(qǐng)聯(lián)系小編刪除,歡迎您的建議與指正。同時(shí)期待您的關(guān)注,感謝您的閱讀,謝謝!

          點(diǎn)擊閱讀原文,為大佬點(diǎn)贊!

          瀏覽 130
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女扒开粉嫩尿囗桶爽免费网站 | 日韩婬乱a一级毛片无码 | 狠狠亲狠狠操 | 夏晴子在线观看 | 高清中文字幕在线A片 |