Android显示Surface


Surface创建

在ViewRootImpl,创建一个final的Surface对象,任何线程可访问它,内部mLock锁。ViewRootImpl类中的Surface定义。

final Surface mSurface = new Surface();

第一次performTraversals方法或窗体发生改变时,Surface的#isValid方法判断是否有效,relayoutWindow方法,初始化Surface。

之前无效,现在有效
1:设置newSurface标志,下次再绘制。
2:初始化硬件渲染,mHardwareRenderer#initinitialize方法

之前有效,现在无效
各种destroy停止

一直有效
硬件渲染更新,mHardwareRenderer#updateSurface方法

Surface的#isValid方法。

public boolean isValid() {
    synchronized (mLock) {
        if (mNativeObject == 0) return false;
        return nativeIsValid(mNativeObject);
    }
}

当Surface内部底层指针mNativeObject不空,且底层JNI方法#nativeIsValid判断有效时,认定Java层Surface有效。
通过IWindowSession的#relayout方法访问Wms服务。

public int relayout(IWindow window, int seq, ...,Surface outSurface) {
    int res = mService.relayoutWindow(this, window, ..., outSurface);
    return res;
}

Wms服务的#relayoutWindow方法,初始化App进程传过来的Surface。

public int relayoutWindow(Session session, IWindow client, ...,Surface outSurface) {
    ..
    if (viewVisibility == View.VISIBLE &&
                    (win.mAppToken == null || !win.mAppToken.clientHidden)) {
        try {
            ...
            SurfaceControl surfaceControl = winAnimator.createSurfaceLocked();
            //创建surfaceControl
            if (surfaceControl != null) {
                outSurface.copyFrom(surfaceControl);
            } else {
                outSurface.release();
            }
        } catch (Exception e) {
        }
    }
    ...
}

创建一个SurfaceControl对象,调用它的copyFrom方法,初始化底层Surface,该对象是Surface控制类。


创建SurfaceControl

SurfaceControl底层结构图。

Android显示Surface_第1张图片
SurfaceControl结构图.jpg

WindowStateAnimator的createSurfaceLocked方法。

SurfaceControl createSurfaceLocked() {
    if (mSurfaceControl == null) {
        mDrawState = DRAW_PENDING;//状态变更为待绘制
        ...
        try {
            mSurfaceW = width;//设置surface的宽高
            mSurfaceH = height;
            ...
            mSurfaceFormat = format;//设置surface格式
            mSurfaceControl = new SurfaceControl(
                        mSession.mSurfaceSession,
                        attrs.getTitle().toString(),
                        width, height, format, flags);
            w.mHasSurface = true;//winstate有了surface
            try {
                mSurfaceX = left;
                mSurfaceY = top;
                try {
                    mSurfaceControl.setPosition(left, top);
                    mSurfaceLayer = mAnimLayer;
                    ...
                    mSurfaceControl.setLayer(mAnimLayer);
                    mSurfaceControl.setAlpha(0);
                    mSurfaceShown = false;
                } catch (RuntimeException e) {
                    ...
                }
                mLastHidden = true;//刚创建的设为隐藏
            }
    }
}

在Java层,SurfaceControl#构造方法,JNI#方法,创建底层SurfaceControl,参数是SurfaceSession、宽高、格式等,返回指针。

static jlong nativeCreate(JNIEnv* env, jclass clazz, jobject sessionObj,
        jstring nameStr, jint w, jint h, jint format, jint flags) {
    sp client(android_view_SurfaceSession_getClient(env, sessionObj));
    //创建底层surfaceControl。
    sp surface = client->createSurface(
            String8(name.c_str()), w, h, format, flags);
    ...
    surface->incStrong((void *)nativeCreate);
    return reinterpret_cast(surface.get());
}

底层SurfaceComposerClient,它在SurfaceSession构造方法创建。创建底层SurfaceControl。

sp SurfaceComposerClient::createSurface(
        const String8& name,
        uint32_t w,
        uint32_t h,
        PixelFormat format,
        uint32_t flags) {
    sp sur;
    if (mStatus == NO_ERROR) {
        sp handle;
        sp gbp;
        status_t err = mClient->createSurface(name, w, h, format, flags,
                &handle, &gbp);
        if (err == NO_ERROR) {
            sur = new SurfaceControl(this, handle, gbp);
        }
    }
    return sur;
}

在Wms服务进程,此方法本质是调用Client#createSurface实现与SF进程通信,SF进程初始化handle与gbp,最后,构建一个底层SurfaceControl用于封装关键的handle与gdp。
ISurfaceComposerClient是Wms服务进程与SF进程通信业务接口,SurfaceComposerClient#onFirstRef方法在构造方法前调用。

void SurfaceComposerClient::onFirstRef() {
    sp sm(ComposerService::getComposerService());
    if (sm != 0) {
        sp conn = sm->createConnection();
        if (conn != 0) {
            mClient = conn;//初始化mClient。
            mStatus = NO_ERROR;
        }
    }
}

通过createConnection方法,调用端得到的业务接口的实现BpSurfaceComposerClient。SF进程服务端创建Client对象,继承BnSurfaceComposerClient。


SF进程createSurface方法

Wms进程发起访问后,SF进程启动binder线程处理业务,向SF主线程发送一个MessageCreateLayer消息。
Client#createSurface方法。

status_t Client::createSurface(...) {
    //先定义一个消息类MessageCreateLayer 
    class MessageCreateLayer : public MessageBase {
        SurfaceFlinger* flinger;
        Client* client;
        sp* handle;
        sp* gbp;
        status_t result;
        ..
    public:
        MessageCreateLayer(SurfaceFlinger* flinger,
                const String8& name, Client* client,
                uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
                sp* handle,
                sp* gbp)
            : flinger(flinger), client(client),
              handle(handle), gbp(gbp),
              name(name), w(w), h(h), format(format), flags(flags) {
        }
        status_t getResult() const { return result; }
        virtual bool handler() {
            result = flinger->createLayer(name, client, w, h, format, flags,
                    handle, gbp);//
            return true;
        }
    };

    sp msg = new MessageCreateLayer(mFlinger.get(),
            name, this, w, h, format, flags, handle, gbp);
    mFlinger->postMessageSync(msg);
    return static_cast( msg.get() )->getResult();
}

创建一个MessageCreateLayer消息,postMessageSync发送给SF主线程。

status_t SurfaceFlinger::postMessageSync(const sp& msg,
        nsecs_t reltime, uint32_t /* flags */) {
    status_t res = mEventQueue.postMessage(msg, reltime);
    if (res == NO_ERROR) {
        msg->wait();//栅栏等待
    }
    return res;
}

向EventQueue消息队列发送同步消息,然后通过栅栏使binder线程陷入wait,最后由主线程唤醒。MessageCreateLayer继承MessageBase,当主线程handleMessage方法处理时,触发子类MessageCreateLayer重写的handler方法,最后打开栅栏,唤醒等待的binder线程。

void MessageBase::handleMessage(const Message&) {
    //走到MessageCreateLayer重写的handler方法
    this->handler();
    barrier.open();
};
//MessageCreateLayer重写的handler方法
virtual bool handler() {
    result = flinger->createLayer(name, client, w, h, format, flags,handle, gbp);
    return true;
}

handler处理时,触发主线程SF#createLayer方法,真正初始化handle与gbp,返回result,SF#binder线程被唤醒后,createSurface继续执行,此时,result已初始化赋值。

总结
binder线程被栅栏阻挡,进入等待,当主线程handler方法执行后,有了result,打开栅栏,放行>binder线程,被唤醒拿到result。


SF主线程createLayer方法

status_t SurfaceFlinger::createLayer(
        const String8& name,
        const sp& client,
        uint32_t w, uint32_t h, PixelFormat format, uint32_t flags,
        sp* handle, sp* gbp) {
    sp layer;
    result = createNormalLayer(client,
                    name, w, h, flags, format,//format是java层传过来的
                    handle, gbp, &layer);//创建Layer对象,指针在layer中。
    ...
    result = addClientLayer(client, *handle, *gbp, layer);//将layer增加到list中
    ...
    setTransactionFlags(eTransactionNeeded);//0x01 创建Layer,触发eTransactionNeeded
    return result;
}

SurfaceFlinger#createNormalLayer方法。

status_t SurfaceFlinger::createNormalLayer(const sp& client,//普通Layer
        const String8& name, uint32_t w, uint32_t h, uint32_t flags, PixelFormat& format,
        sp* handle, sp* gbp, sp* outLayer) {
    ...
    *outLayer = new Layer(this, client, name, w, h, flags);//创建Layer
    status_t err = (*outLayer)->setBuffers(w, h, format, flags);
    if (err == NO_ERROR) {
        *handle = (*outLayer)->getHandle();//初始化handle和gbp
        *gbp = (*outLayer)->getProducer();
    }
    return err;
}

创建普通层级Layer对象,Layer#getHandle与Layer#getProducer方法初始化handle、gbp指针,将Layer加入到Client中的map保存,

每个Layer对应一个handle。

  • Layer#getHandle:handle是IBinder类型,创建服务进程端Handle对象,在内核为其创建服务节点,客户端拿到的handle是BpXxx,handle是一个远程进程连接到SF进程的句柄。
  • Layer#getProducer:返回Layer的IGraphicBufferProducer。IGraphicBufferProducer也是跨进程通信的业务接口,远程进程拿到的是BpGraphicBufferProducer,通过它操作图形内存区的。
  • SF进程通过reply的writeStrongBinder方法写入,远程进程通过readStrongBinder读取。

底层Surface

Surface#copyFrom方法。

public void copyFrom(SurfaceControl other) {
    ...
    //底层SurfaceControl指针
    long surfaceControlPtr = other.mNativeObject;
    ...
    long newNativeObject = nativeCreateFromSurfaceControl(surfaceControlPtr);
    synchronized (mLock) {
        if (mNativeObject != 0) {
            nativeRelease(mNativeObject);//释放原底层Surface指针
        }
        setNativeObjectLocked(newNativeObject);
    }
}

JNI#方法利用底层SurfaceControl创建底层Surface。
底层SurfaceControl#getSurface方法。

sp SurfaceControl::getSurface() const {
    Mutex::Autolock _l(mLock);
    if (mSurfaceData == 0) { 
        mSurfaceData = new Surface(mGraphicBufferProducer, false);
    }
    return mSurfaceData;
}

底层Surface创建,封装GraphicBufferProducer指针。

Wms服务初始化Surface,App进程通过Surface操作图形缓冲区。
GraphicBufferProducer是生产者。


任重而道远

你可能感兴趣的:(Android显示Surface)