Android 12(S) 圖像顯示系統 - 示例應用(二)


1 前言

為了更深刻的理解Android圖形系統抽象的概念和BufferQueue的工作機制,這篇文章我們將從Native Level入手,基於Android圖形系統API寫作一個簡單的圖形處理小程序。透過這個小程序我們將學習如何使用Native API創建Surface,如何請求圖形緩沖區,如何向圖形緩沖區中寫入數據等知識。Talk is cheap, show me the code。讓我們馬上開始吧!

注:本系列文章的分析及代碼均基於Android 12(S) Source Code,可參考:http://aospxref.com/  或 http://aosp.opersys.com/

2 程序源碼簡介

  • 源碼下載

地址:https://github.com/yrzroger/NativeSFDemo

注:可以git命令下載(比如git clone git@github.com:yrzroger/NativeSFDemo.git)或直接Download ZIP解壓后使用

  • 源碼編譯

本demo程序是基於Android源碼編譯環境開發的,所以需要放到Android源碼目錄下編譯。

將上一步中下載的的源碼放到Android源碼的合適目錄下,然后執行mm進行編譯,得到可執行檔 NativeSFDemo

  • 源碼運行

將可執行檔NativeSFDemo放到目標測試平台/system/bin下(比如:adb push NativeSFDemo /system/bin/)

然后執行 adb shell NativeSFDemo

  • 效果展示

程序中去繪制單色背景: 紅色->綠色->藍色背景交替展示,如下圖所示:

至此你已經收獲一個可以供后續學習研究的demo小程序了 !!!


Tips:

Android源碼是一個寶藏,即提供了豐富多彩的APIs供開發者使用,又可以在其中搜索到很多有價值的APIs使用實例。本文中提供的演示Demo亦是基於源碼中的參考來完成的。

我把參考位置列於此:

參考1:/frameworks/av/media/libstagefright/SurfaceUtils.cpp 

參考2:/frameworks/native/libs/gui/tests/CpuConsumer_test.cpp


 

3 程序源碼分析


  關注公眾號,《圖形圖像》專欄 ,閱讀系列文章!!


 

 

 


針對上述方法中會產生 bbq-wrapper#0” 和 “NativeSFDemo#0”兩個Layer,我們提供另一種方法,去顯式的創建BLASTBufferQueue,進而獲取surface和producer來達成demo的功能

可以將代碼的分支切換到 main_bbq 編譯后來測試, 此時去dumpsys SurfaceFlinger, 如下,其中 NativeSFDemo#0BackgroundColorLayer 是我們設置的一個黑色背景

Display 4629995328241972480 HWC layers:
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 Layer name
           Z |  Window Type |  Comp Type |  Transform |   Disp Frame (LTRB) |          Source Crop (LTRB) |     Frame Rate (Explicit) (Seamlessness) [Focused]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 NativeSFDemo#0BackgroundColorLayer
  rel -2147483648 |            0 |     CLIENT |          0 |    0    0 1920 1080 |    0.0    0.0    0.0    0.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------
 NativeSFDemo#0
  2147483647 |            0 |     CLIENT |          0 |    0    0 1920 1080 |    0.0    0.0 1920.0 1080.0 |                                              [ ]
---------------------------------------------------------------------------------------------------------------------------------------------------------------

兩個BufferStateLayer:BufferStateLayer (NativeSFDemo#0)  和  BufferStateLayer (NativeSFDemo#0BackgroundColorLayer ),其中NativeSFDemo#0BackgroundColorLayer 的parent就是NativeSFDemo#0

+ EffectLayer (NativeSFDemo#0BackgroundColorLayer) uid=1000
  Region TransparentRegion (this=0 count=0)
  Region VisibleRegion (this=0 count=1)
    [  0,   0, 1920, 1080]
  Region SurfaceDamageRegion (this=0 count=0)
      layerStack=   0, z=-2147483648, pos=(0,0), size=(  -1,  -1), crop=[  0,   0,  -1,  -1], cornerRadius=0.000000, isProtected=0, isTrustedOverlay=0, isOpaque=1, invalidate=0, dataspace=Default, defaultPixelFormat=Unknown/None, backgroundBlurRadius=0, color=(0.000,0.000,0.000,1.000), flags=0x00000000, tr=[0.00, 0.00][0.00, 0.00]
      parent=NativeSFDemo#0
      zOrderRelativeOf=none
      activeBuffer=[   0x   0:   0,Unknown/None], tr=[0.00, 0.00][0.00, 0.00] queued-frames=0, mRefreshPending=0, metadata={}, cornerRadiusCrop=[0.00, 0.00, 0.00, 0.00],  shadowRadius=0.000, 
+ BufferStateLayer (NativeSFDemo#0) uid=0
  Region TransparentRegion (this=0 count=0)
  Region VisibleRegion (this=0 count=1)
    [  0,   0, 1920, 1080]
  Region SurfaceDamageRegion (this=0 count=0)
      layerStack=   0, z=2147483647, pos=(0,0), size=(1920,1080), crop=[  0,   0,  -1,  -1], cornerRadius=0.000000, isProtected=0, isTrustedOverlay=0, isOpaque=0, invalidate=0, dataspace=Default, defaultPixelFormat=RGBA_8888, backgroundBlurRadius=0, color=(0.000,0.000,0.000,1.000), flags=0x00000100, tr=[0.00, 0.00][0.00, 0.00]
      parent=none
      zOrderRelativeOf=none
      activeBuffer=[1920x1080:1920,RGBA_8888], tr=[0.00, 0.00][0.00, 0.00] queued-frames=0, mRefreshPending=0, metadata={dequeueTime:5541992685473}, cornerRadiusCrop=[0.00, 0.00, 0.00, 0.00],  shadowRadius=0.000, 

 

4 小結

至此,我們已經建立起來了一個簡單的圖形圖像處理的簡單Demo,當讓我們目前還是只從應用的較多介紹了基本圖形APIs的使用邏輯,接下來的我們就基於此demo,深入底層邏輯探究其中的奧秘。

 

 



必讀:

Android 12(S) 圖像顯示系統 - 開篇



 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM