20分で理解するandroidの構造
   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
*unixの場合
       デーモン         サーバー                         アプリケーション




                               X-Window
                                System
              VFS
                                             Socket
                           Kernel
       VFAT

              UDF
ext3




                           driver
                                    Frame
                                    Buffer
Windowsの場合
システムプロセス               サービス             アプリケーション




                        NTDLL.DLL

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

        IFS                         USER           GDI

                     KERNEL
       VFAT
NTFS



              UDF




                                          Frame
                           HAL            Buffer
今日話すこと
 AndroidのDisplay subsystemの概要を説明
 � skia
 � ashmem
 � native binder
 � ashmem


引用する資料
 Google I/O 2009
     Noisy Androids
     Mastering the Android Media Framework

 Google I/O 2008
     Android Anatomy and Physiology
Applications
How about this?
Application



Application
Framework


Libraries




Linux
Canvasでの描画 前準備
Application
              Application

Application
Framework                                    SystemServer

Libraries

                                             surfaceflinger

                                     Layer




Linux                       ashmem
Canvasでの描画 SkCanvas
Application
              Application

Application
Framework                                       SystemServer

Libraries

                                             surfaceflinger
                Skia
                                     Layer
              SkCanvas




Linux                       ashmem
Canvasでの描画 surfaceflinger
Application



Application
Framework                                SystemServer

Libraries

                       surfaceflinger
                                                        Layer
              thread                    Layer           bufffer
                            Layer               Layer




Linux
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 }
Androidの場合
             SystemServer        アプリケーション


                              binder
             surfaceflinger




Kernel                         ashmem

driver
               Frame
               Buffer
おしまい

20分で理解するdisplaysystem

  • 1.
    20分で理解するandroidの構造 display subsystem 編 横浜Android勉強会 2011/4/29 @magoroku15
  • 2.
    ふーあむあい � 源氏名 @magoroku15 名古屋在住 � OS屋さん出身の組み込み屋さん � 2009年より@androidzaurusに師事し、日本のIT勉強会で必須と されるサブカルチャを学ぶ � 今年はFPGAでpdp11を動かすのが目標だった � UST検定 初段 � ぐだ生(土曜)、名古屋geekbar(月曜)を配信中 � magorokutv で検索 / 現在までに9770人が視聴 � ミキサー4台 大人買い � 名古屋つくる部 配信係り  � よーするに 塚田部長のパシリ、 @gabu怖い � 名古屋geekbar 早番店員  � よーするに 塚田店長のパシリ、 @gabu怖い
  • 3.
    display subsystemって何 � HWから見ると � FrameBuffer 1ピクセルが1ドット � Blit処理 矩形転送  � SWから見ると � アプリ画面、システム画面の合成 � 画面間の重なりの管理と描画の更新 � 広義にはOSの一部 � 1つのリソースを複数のアプリが利用 � 1つのコンポーネントがアプリの要求を調停 � display susbsystem
  • 4.
    *unixの場合 デーモン サーバー アプリケーション X-Window System VFS Socket Kernel VFAT UDF ext3 driver Frame Buffer
  • 5.
    Windowsの場合 システムプロセス サービス アプリケーション NTDLL.DLL システムサービスディスパッチャ IFS USER GDI KERNEL VFAT NTFS UDF Frame HAL Buffer
  • 6.
    今日話すこと  AndroidのDisplay subsystemの概要を説明 �skia � ashmem � native binder � ashmem 引用する資料 Google I/O 2009 Noisy Androids Mastering the Android Media Framework Google I/O 2008 Android Anatomy and Physiology
  • 10.
  • 12.
  • 13.
    Canvasでの描画 前準備 Application Application Application Framework SystemServer Libraries surfaceflinger Layer Linux ashmem
  • 14.
    Canvasでの描画 SkCanvas Application Application Application Framework SystemServer Libraries surfaceflinger Skia Layer SkCanvas Linux ashmem
  • 15.
    Canvasでの描画 surfaceflinger Application Application Framework SystemServer Libraries surfaceflinger Layer thread Layer bufffer Layer Layer Linux
  • 16.
    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;
  • 17.
    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 }
  • 18.
    Androidの場合 SystemServer アプリケーション binder surfaceflinger Kernel ashmem driver Frame Buffer
  • 19.