19
20 20 分で理解す 分で理解す android android の構造 の構造 display subsystem display subsystem 横浜Android勉強会 2011/4/29 @magoroku15

20分で理解するdisplaysystem

Embed Size (px)

Citation preview

Page 1: 20分で理解するdisplaysystem

2020分で理解す分で理解するるandroidandroidの構造の構造display subsystem display subsystem 編編

横浜Android勉強会

2011/4/29

@magoroku15

Page 2: 20分で理解するdisplaysystem

ふーあむあい

� 源氏名 @magoroku15 名古屋在住� OS屋さん出身の組み込み屋さん

� 2009年より@androidzaurusに師事し、日本のIT勉強会で必須とされるサブカルチャを学ぶ

� 今年はFPGAでpdp11を動かすのが目標だった

� UST検定 初段� ぐだ生(土曜)、名古屋geekbar(月曜)を配信中

� magorokutv で検索 / 現在までに9770人が視聴

� ミキサー4台 大人買い

� 名古屋つくる部 配信係り � よーするに 塚田部長のパシリ、 @gabu怖い

� 名古屋geekbar 早番店員 � よーするに 塚田店長のパシリ、 @gabu怖い

Page 3: 20分で理解するdisplaysystem

display subsystemって何

� HWから見ると� FrameBuffer 1ピクセルが1ドット� Blit処理 矩形転送 

� SWから見ると� アプリ画面、システム画面の合成� 画面間の重なりの管理と描画の更新

� 広義にはOSの一部� 1つのリソースを複数のアプリが利用� 1つのコンポーネントがアプリの要求を調停� display susbsystem

Page 4: 20分で理解するdisplaysystem

Kernel

*unixの場合

VFS

ext

3

VFA

T

UD

F

driver

デーモン

X-W

indo

w

Sys

tem

サーバー アプリケーション

Socket

FrameBuffer

Page 5: 20分で理解するdisplaysystem

Windowsの場合

システムサービスディスパッチャ

NTDLL.DLL

USER GDI

KERNEL

IFS

NTFS

VFA

T

UD

F

HAL

システムプロセス サービス アプリケーション

FrameBuffer

Page 6: 20分で理解するdisplaysystem

今日話すこと

 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

Page 7: 20分で理解するdisplaysystem
Page 8: 20分で理解するdisplaysystem
Page 9: 20分で理解するdisplaysystem
Page 10: 20分で理解するdisplaysystem

Applications

Page 11: 20分で理解するdisplaysystem
Page 12: 20分で理解するdisplaysystem

How about this?Application

Application Framework

Libraries

Linux

Page 13: 20分で理解するdisplaysystem

Canvasでの描画 前準備Application

Application Framework

Libraries

Linux

Application

SystemServer

ashmem

surfaceflinger

Layer

Page 14: 20分で理解するdisplaysystem

Canvasでの描画 SkCanvasApplication

Application Framework

Libraries

Linux

Application

SystemServer

ashmem

Skia

SkCanvas

surfaceflinger

Layer

Page 15: 20分で理解するdisplaysystem

Canvasでの描画 surfaceflingerApplication

Application Framework

Libraries

Linux

SystemServer

surfaceflinger

Layer Layer Layer

Layerbuffferthread

Page 16: 20分で理解するdisplaysystem

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;

Page 17: 20分で理解するdisplaysystem

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 }

Page 18: 20分で理解するdisplaysystem

Kernel

Androidの場合

driver

アプリケーション

binder binder binder binder

FrameBuffer

surfaceflinger

ashmemashmemashmemashmem

SystemServer

Page 19: 20分で理解するdisplaysystem

おしまい