Android Surface理解

结合别人的博客和自己看的代码,梳理下自己对surface的理解

1.代码相关文件

/AOSP/frameworks/native/libs/ui

主要是bufferqueuecore与surfaceflinger中分配

/AOSP/frameworks/native/libs/gui

Android.mk                   IGraphicBufferAlloc.cpp
BitTube.cpp                  IGraphicBufferConsumer.cpp
BufferItemConsumer.cpp       IGraphicBufferProducer.cpp
BufferItem.cpp               IProducerListener.cpp
BufferQueueConsumer.cpp      ISensorEventConnection.cpp
BufferQueueCore.cpp          ISensorServer.cpp
BufferQueue.cpp              ISurfaceComposerClient.cpp
BufferQueueProducer.cpp      ISurfaceComposer.cpp
BufferSlot.cpp               LayerState.cpp
CleanSpec.mk                 Sensor.cpp
ConsumerBase.cpp             SensorEventQueue.cpp
CpuConsumer.cpp              SensorManager.cpp
DisplayEventReceiver.cpp     StreamSplitter.cpp
GLConsumer.cpp               SurfaceComposerClient.cpp
GraphicBufferAlloc.cpp       SurfaceControl.cpp
GuiConfig.cpp                Surface.cpp
IConsumerListener.cpp        SyncFeatures.cpp
IDisplayEventConnection.cpp  tests

SurfaceComposerClient 中成员变量 sp<ISurfaceComposerClient>  mClient;与surface.cpp binder通信

/AOSP/frameworks/native/services/surfaceflinger

Android.mk         EventControlThread.cpp   MODULE_LICENSE_APACHE2
Barrier.h          EventControlThread.h     MonitoredProducer.cpp
Client.cpp         EventLog                 MonitoredProducer.h
Client.h           EventThread.cpp          RenderEngine
clz.h              EventThread.h            SurfaceFlingerConsumer.cpp
Colorizer.h        FrameTracker.cpp         SurfaceFlingerConsumer.h
DdmConnection.cpp  FrameTracker.h           SurfaceFlinger.cpp
DdmConnection.h    Layer.cpp                SurfaceFlinger.h
DisplayDevice.cpp  LayerDim.cpp             surfaceflinger.rc
DisplayDevice.h    LayerDim.h               tests
DisplayHardware    Layer.h                  Transform.cpp
DispSync.cpp       main_surfaceflinger.cpp  Transform.h
DispSync.h         MessageQueue.cpp
Effects            MessageQueue.h

surfaceflinger管理surface及layer

2. Activity显示

2.1 Activity创建

/base/core/java/android/app/ActivityThread.java

handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
...............
    //根据类名以Java反射的方法创建一个Activity 
    Activity a = performLaunchActivity(r, customIntent);
    
    handleResumeActivity(r.token, false, r.isForward,
                    !r.activity.mFinished && !r.startsNotResumed);
................}

2.2 handleResumeActivity

final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume) {
.....................
if (r.window == null && !a.mFinished && willBeVisible) {
                r.window = r.activity.getWindow();
                //得到一个view对象
                View decor = r.window.getDecorView();
                decor.setVisibility(View.INVISIBLE);
                //获得viewManager
                ViewManager wm = a.getWindowManager();
                WindowManager.LayoutParams l = r.window.getAttributes();
                a.mDecor = decor;
                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
                l.softInputMode |= forwardBit;
                if (a.mVisibleFromClient) {
                    a.mWindowAdded = true;
                    //将view加入viewmanager
                    wm.addView(decor, l);
                }
}
..................................}

2.3 Activity 通过setContentView设置UI

Activity.java

public void setContentView(View view, ViewGroup.LayoutParams params) {
        getWindow().setContentView(view, params);
        initWindowDecorActionBar();
    }
    
 public Window getWindow() {
        return mWindow;
    }

上面出现了两个和UI有关系的类:View和Window

2.4 Activity Window 与WindowManager
Activity.java

 final void attach(Context context, ActivityThread aThread,
            Instrumentation instr, IBinder token, int ident,
            Application application, Intent intent, ActivityInfo info,
            CharSequence title, Activity parent, String id,
            NonConfigurationInstances lastNonConfigurationInstances,
            Configuration config, String referrer, IVoiceInteractor voiceInteractor) {
        //创建window对象    
        mWindow = new PhoneWindow(this);
        mWindow.setCallback(this);
        mWindow.setOnWindowDismissedCallback(this);
        mWindow.getLayoutInflater().setPrivateFactory(this);
        //创建windowManager      
        mWindow.setWindowManager(
                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
                mToken, mComponent.flattenToString(),
                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
         //保存WindowManager对象       
         mWindowManager = mWindow.getWindowManager();

setWindowManager由PhoneWindow父类window.java实现

Window.java

public void setWindowManager(WindowManager wm, IBinder appToken, String appName,){
 mWindowManager = ((WindowManagerImpl)wm).createLocalWindowManager(this);
    }

WindowManagerImpl.java

public WindowManagerImpl createLocalWindowManager(Window parentWindow) {
        return new WindowManagerImpl(mDisplay, parentWindow);
    }
public final class WindowManagerImpl implements WindowManager {}

(2.4)中流程总结

2.5 继续分析setContentView()

Activity.java

public void setContentView(View view, ViewGroup.LayoutParams params) {
        getWindow().setContentView(view, params);
        initWindowDecorActionBar();
    }

PhoneWindow.java

 private ViewGroup mContentParent;
 public void setContentView(View view) {
        setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
    }
    
  public void setContentView(View view, ViewGroup.LayoutParams params) {
  //mContentParent是一个viewGroup对象
  if (mContentParent == null) {
            installDecor();
        } 
        
  if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) {
            view.setLayoutParams(params);
            final Scene newScene = new Scene(mContentParent, view);
            transitionTo(newScene);
        } else {
            //把view加入到ViewGroup中
            mContentParent.addView(view, params);
        }
  ........}

mContentParent是一个ViewGroup类型,它从View中派生,所以也是一个UI单元。从它名字中“Group”所表达的意思分析,它还可以包含其他的View元素。这又是什么意思呢?也就是说,在绘制一个ViewGroup时,它不仅需要把自己的样子画出来,还需要把它包含的View元素的样子也画出来。读者可将它想象成一个容器,容器中的元素就是View。
installDecor()函数
主要用来给view绘制icon ,window title,logo, menu等等

2.6 重回handleResumeActivity

我们之所以分析2.5内容,是为了弄清楚View, ViewManager(就是WindowManager)这些对象

final void handleResumeActivity(IBinder token,
            boolean clearHide, boolean isForward, boolean reallyResume) {
.....................
if (r.window == null && !a.mFinished && willBeVisible) {
                r.window = r.activity.getWindow();
                //得到一个view对象
                View decor = r.window.getDecorView();
                decor.setVisibility(View.INVISIBLE);
                //获得viewManager
                ViewManager wm = a.getWindowManager();
                WindowManager.LayoutParams l = r.window.getAttributes();
                a.mDecor = decor;
                l.type = WindowManager.LayoutParams.TYPE_BASE_APPLICATION;
                l.softInputMode |= forwardBit;
                if (a.mVisibleFromClient) {
                    a.mWindowAdded = true;
                    //将view加入viewmanager
                    wm.addView(decor, l);
                }
}
..................................}

分析wm.addView(decor,l)

WindowManagerImpl.java

public final class WindowManagerImpl implements WindowManager {
    private final WindowManagerGlobal mGlobal = WindowManagerGlobal.getInstance();
 public void addView(@NonNull View view, @NonNull ViewGroup.LayoutParams params) {
        applyDefaultToken(params);
        mGlobal.addView(view, params, mDisplay, mParentWindow);
    }
WindowManagerGlobal里面可以通过AIDL与IWindowManager.Stub.asInterface 及IWindowSessionCallback.Stub() IPC通信

WindowManagerGlobal.java

public void addView(View view, ViewGroup.LayoutParams params,
            Display display, Window parentWindow) {
            root = new ViewRootImpl(view.getContext(), display);
            view.setLayoutParams(wparams);
            mViews.add(view);
            mRoots.add(root);
            mParams.add(wparams);

ViewRootImpl又是什么东东?

时间: 2024-10-12 01:21:09

Android Surface理解的相关文章

我对Android的理解

前言 写这篇文章是为了和大家描述下我对Android的理解,同时会讲述下我后面的技术规划,希望能够对大家有点参考价值.大家都想学好Android,那么怎么才能学好呢?这个真不好说,但是我可以和大家交流下我自己的心得,当然仅限应用层开发,因为我本身是侧重应用层开发的. 知识的分类 Android中有很多知识点,虽然说大部分知识点都不难,但是量很多,这就会给人一种很琐碎的感觉.在这种情况下就要对知识进行分类,我对Android知识的分类为: 1. 基本知识点 比如四大组件如何使用.如何创建Servi

Android的理解

从组件的角度来考虑 Activity------------------Service-----------------Broadcast Receiver----------------------ContentProvider 从流程的角度来看 View function------------>android functionality data----------------->android object 从业务流程角度来看 单Activity--------------->多

心得分享:关于对Android的理解,知识点梳理

前言 写这篇文章是为了和大家描述下我对Android的理解,同时会讲述下我后面的技术规划,希望能够对大家有点参考价值.大家都想学好Android,那么怎么才能学好呢?这个真不好说,但是我可以和大家交流下我自己的心得,当然仅限应用层开发,因为我本身是侧重应用层开发的. 知识的分类 Android中有很多知识点,虽然说大部分知识点都不难,但是量很多,这就会给人一种很琐碎的感觉.在这种情况下就要对知识进行分类,我对Android知识的分类为:  1. 基本知识点        比如四大组件如何使用.如

转:android surface简单使用Demo

转: http://blog.csdn.net/listening_music/article/details/6860786 通过之前介绍的如何自定义View, 我们知道使用它可以做一些简单的动画效果.它通过不断循环的执行View.onDraw方法,每次执行都对内部显示的图形做一些调整,我们假设 onDraw方法每秒执行20次,这样就会形成一个20帧的补间动画效果.但是现实情况是你无法简单的控制View.onDraw的执行帧数,这边说的执 行帧数是指每秒View.onDraw方法被执行多少次,

【Android个人理解(四)】自定义Application类的使用

1.为什么要重写Application类 如果想在整个应用中使用全局变量,在java中一般是使用静态变量,public类型:而在android中如果使用这样的全局变量就不符合Android的框架架构,但是可以使用一种更优雅的方式就是使用Application context. 那么为什么这样的全局变量就不符合Android的框架架构? 众说纷纭,我理解的是static访问是无法跨进程的.Android中的Activity,Service是可以在各自进程中运行的,用static传递参数到不同进程的

【Android 个人理解(三)】从源码剖析如何实现实现全屏效果

实现全屏的代码: // 全屏显示 requestWindowFeature(Window.FEATURE_NO_TITLE); //turning off the title at the top of the screen. getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); //the status bar will be hi

[Android个人理解(六)]使用include标签的注意事项

我们在使用include标签时是为了提高部分代码的重用性,同时增加代码的层次性和条理性. 但是在我们实际使用的时候,往往就会由于include的属性和include的原理不够清楚,而产生bug. 1.首先,我们说明include标签所在布局文件a和include所包含的布局文件b的关系 必须明确a和b通过使用include连接,与其说是包含,更像是拼接.Include不是View类,自然与其内的布局对象,不是嵌套关系. 我们都清楚,我们可以将a中的include标签删去,直接复制粘贴b的代码,这

【Android 个人理解(九)】

本篇博客首先介绍Activity的生命周期以及Task(即Activity栈的概念),从而说明在几种情况下(比如程序正常启动或退出),程序执行的顺序(即调用生命周期方法的顺序).最后重点区别几个容易混淆的生命周期方法. 一.Activity的生命周期深入理解 最初我们都会看到下面这个图: Activity整个生命周期具有4种状态,四种状态在三个嵌套循环通过调用七个主要方法转换四种状态: 1)   四种状态 1.活动(Active/Running)状态 当Activity运行在屏幕前台(处于当前任

About Android Surface Flinger

参考资料: Android4.4深入浅出之SurfaceFlinger总体结构 android/5.1.0_r1 source code onine Android图形系统分析与移植--四.Surface Manager(Surface Flinger简介) 系统的SurfaceFlinger思路以及代码追踪 android的surfaceflinger原理讲解 老罗系列: 那两年炼就的Android内功修养 Android应用程序与SurfaceFlinger服务的关系概述和学习计划 Andr