Upload
magoroku-yamamoto
View
4.398
Download
0
Embed Size (px)
Citation preview
2020分で理解す分で理解するるandroidandroidの構造の構造display subsystem display subsystem 編編
横浜Android勉強会
2011/4/29
@magoroku15
ふーあむあい
� 源氏名 @magoroku15 名古屋在住� OS屋さん出身の組み込み屋さん
� 2009年より@androidzaurusに師事し、日本のIT勉強会で必須とされるサブカルチャを学ぶ
� 今年はFPGAでpdp11を動かすのが目標だった
� UST検定 初段� ぐだ生(土曜)、名古屋geekbar(月曜)を配信中
� magorokutv で検索 / 現在までに9770人が視聴
� ミキサー4台 大人買い
� 名古屋つくる部 配信係り � よーするに 塚田部長のパシリ、 @gabu怖い
� 名古屋geekbar 早番店員 � よーするに 塚田店長のパシリ、 @gabu怖い
display subsystemって何
� HWから見ると� FrameBuffer 1ピクセルが1ドット� Blit処理 矩形転送
� SWから見ると� アプリ画面、システム画面の合成� 画面間の重なりの管理と描画の更新
� 広義にはOSの一部� 1つのリソースを複数のアプリが利用� 1つのコンポーネントがアプリの要求を調停� display susbsystem
Kernel
*unixの場合
VFS
ext
3
VFA
T
UD
F
driver
デーモン
X-W
indo
w
Sys
tem
サーバー アプリケーション
Socket
FrameBuffer
Windowsの場合
システムサービスディスパッチャ
NTDLL.DLL
USER GDI
KERNEL
IFS
NTFS
VFA
T
UD
F
HAL
システムプロセス サービス アプリケーション
FrameBuffer
今日話すこと
AndroidのDisplay subsystemの概要を説明� skia� ashmem� native binder� ashmem
引用する資料Google I/O 2009
Noisy AndroidsMastering the Android Media Framework
Google I/O 2008Android Anatomy and Physiology
Applications
How about this?Application
Application Framework
Libraries
Linux
Canvasでの描画 前準備Application
Application Framework
Libraries
Linux
Application
SystemServer
ashmem
surfaceflinger
Layer
Canvasでの描画 SkCanvasApplication
Application Framework
Libraries
Linux
Application
SystemServer
ashmem
Skia
SkCanvas
surfaceflinger
Layer
Canvasでの描画 surfaceflingerApplication
Application Framework
Libraries
Linux
SystemServer
surfaceflinger
Layer Layer Layer
Layerbuffferthread
SurfaceFlinger::threadLoop
frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp 476 bool SurfaceFlinger::threadLoop() 477 {
498 if (LIKELY(hw.canDraw() && !isFrozen())) { 499 // repaint the framebuffer (if needed) 500 handleRepaint();
509 } else { 510 // pretend we did the post 511 unlockClients(); 512 usleep(16667); // 60 fps period 513 } 514 return true;
SurfaceFlinger::composeSurfaces
frameworks/base/libs/surfaceflinger/SurfaceFlinger.cpp 905 void SurfaceFlinger::composeSurfaces(const Region& dirty) 906 { 912 const SurfaceFlinger& flinger(*this); 913 const LayerVector& drawingLayers(mDrawingState.layersSortedByZ); 914 const size_t count = drawingLayers.size(); 915 sp<LayerBase> const* const layers = drawingLayers.array(); 916 for (size_t i=0 ; i<count ; ++i) { 917 const sp<LayerBase>& layer = layers[i]; 918 const Region& visibleRegion(layer->visibleRegionScreen); 919 if (!visibleRegion.isEmpty()) { 920 const Region clip(dirty.intersect(visibleRegion)); 921 if (!clip.isEmpty()) { 922 layer->draw(clip); 923 } 924 } 925 } 926 }
Kernel
Androidの場合
driver
アプリケーション
binder binder binder binder
FrameBuffer
surfaceflinger
ashmemashmemashmemashmem
SystemServer
おしまい