日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

基于Android5.1的双屏异显分析

發布時間:2025/3/15 Android 87 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于Android5.1的双屏异显分析 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

平臺:android5.1?
場景:客戶的設備需要使用到雙屏異顯。分析雙屏異顯時,framework所做的準備。?
時間:2016.9.28

Android從4.2開始支持雙屏異顯,其Java使用示例代碼如下:

1.如何獲取設備上的屏幕?

DisplayManager mDisplayManager;//屏幕管理類Display[] displays;//屏幕數組mDisplayManager = (DisplayManager)context.getSystemService(Context.DISPLAY_SERVICE);displays =mDisplayManager.getDisplays();

2.主屏和副屏的區分??
主屏:displays[0]?
副屏:displays[1]

3.如何在副屏上展示內容??
通過Presentation來實現,Presentation繼承了Dialog。?
假設我們寫了一個DifferentDislay的類,這個類是要繼承Presentation類:

privateclass DifferentDislay extends Presentation{public DifferentDislay(ContextouterContext, Display display) {super(outerContext,display);//TODOAuto-generated constructor stub }@Overrideprotectedvoid onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.diffrentdisplay_basket);}}

4.開啟副屏

DifferentDislay mPresentation =new DifferentDislay (context,displays[1]);//displays[1]是副屏mPresentation.getWindow().setType(WindowManager.LayoutParams.TYPE_TOAST);mPresentation.show();

以上代碼的核心在于Presentation類,其繼承與Dialog。?
從new DifferentDislay (context,displays[1]) 函數分析其初始化:

public Presentation(Context outerContext, Display display, int theme) {super(createPresentationContext(outerContext, display, theme), theme, false); //核心函數mDisplay = display;mDisplayManager = (DisplayManager)getContext().getSystemService(Context.DISPLAY_SERVICE);getWindow().setGravity(Gravity.FILL);setCanceledOnTouchOutside(false);} private static Context createPresentationContext(Context outerContext, Display display, int theme) { ...Context displayContext = outerContext.createDisplayContext(display); ...// Derive the display's window manager from the outer window manager.// We do this because the outer window manager have some extra information// such as the parent window, which is important if the presentation uses// an application window type.final WindowManagerImpl outerWindowManager =(WindowManagerImpl)outerContext.getSystemService(Context.WINDOW_SERVICE);final WindowManagerImpl displayWindowManager =outerWindowManager.createPresentationWindowManager(display); //針對特定的display創建對應的WindowManagerImpl管理對象return new ContextThemeWrapper(displayContext, theme) { //返回的Context的getSystemService()被重載,通過此Context獲取的Window管理對象為上面創建的這個@Overridepublic Object getSystemService(String name) {if (Context.WINDOW_SERVICE.equals(name)) {return displayWindowManager;}return super.getSystemService(name);}}; }

上面代碼的設計原則:?
每一個display擁有自己的管理對象以及context對象,這樣雙屏的操作互相獨立—Display是核心對象。對于上層而言,其即意味著一個屏幕。?
mPresentation.show()拉開了雙屏異顯的序幕。結合上面的分析,WindowManagerImpl.java中的addView()方法將傳入上面初始化的display[1],繼而:

WindowManagerGlobal.javapublic void addView(View view, ViewGroup.LayoutParams params,Display display, Window parentWindow) { ...root = new ViewRootImpl(view.getContext(), display); ... }ViewRootImpl.javapublic void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { ...res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,getHostVisibility(), mDisplay.getDisplayId(),mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, mInputChannel); ... }WindowManagerService.javapublic int addWindow(Session session, IWindow client, int seq,WindowManager.LayoutParams attrs, int viewVisibility, int displayId,Rect outContentInsets, Rect outStableInsets, InputChannel outInputChannel) { ...final DisplayContent displayContent = getDisplayContentLocked(displayId); //先從mDisplayContents查詢。若沒有,則先判定displayId對應的設備是否存在。若存在,則調用newDisplayContentLocked創建新的DisplayContent對象,并保存到mDisplayContents ...win = new WindowState(this, session, client, token,attachedWindow, appOp[0], seq, attrs, viewVisibility, displayContent); //DisplayContent內部保存了mDisplayId,以都與相對的WindowState進行了綁定 ... } private DisplayContent newDisplayContentLocked(final Display display) { ...DisplayInfo displayInfo = displayContent.getDisplayInfo();final Rect rect = new Rect();mDisplaySettings.getOverscanLocked(displayInfo.name, displayInfo.uniqueId, rect);synchronized (displayContent.mDisplaySizeLock) {displayInfo.overscanLeft = rect.left;displayInfo.overscanTop = rect.top;displayInfo.overscanRight = rect.right;displayInfo.overscanBottom = rect.bottom;mDisplayManagerInternal.setDisplayInfoOverrideFromWindowManager(displayId, displayInfo); //此函數可以深究,當前存在雙屏,其在找到displayId對應屏的情況下,會發送DisplayManagerGlobal.EVENT_DISPLAY_CHANGED消息}configureDisplayPolicyLocked(displayContent); //以上初始化displayContent中的displayInfo對象 ... }關于displayId與displayInfo.layerstack,當檢測到雙屏后:// Adds a new logical display based on the given display device.// Sends notifications if needed.private void addLogicalDisplayLocked(DisplayDevice device) { ...final int displayId = assignDisplayIdLocked(isDefault);final int layerStack = assignLayerStackLocked(displayId); //直接將displayId賦值給layerStack。即他們始終為同一個值LogicalDisplay display = new LogicalDisplay(displayId, layerStack, device); //此處創建的LogicalDisplay對象為上面提供的display[1]的某一真實對象 ... }

接下來開始進入到主題,framework為支持雙屏異顯做了哪些工作??
兩個重點:?
1.檢測到雙屏(第二個屏)后,系統做了哪些準備?(主屏幕和HDMI是兩個默認開機就進行檢測的屏幕設備,其他監聽后使用hotplug處理)?
2.如何進行/區分雙屏異顯?

上面提到Android4.2開始支持雙屏異顯,除了引入Presentation 類,其還定制了HWComposer,其構造函數中:

if (hwcHasApiVersion(mHwc, HWC_DEVICE_API_VERSION_1_1))mCBContext->procs.hotplug = &hook_hotplug;elsemCBContext->procs.hotplug = NULL;

即HWC的版本大于等于1.1即可支持雙屏異顯。我們從hook_hotplug開始查看檢測到插入新屏時的系統

HWComposer.cpp void HWComposer::hotplug(int disp, int connected)SurfaceFlinger.cpp void SurfaceFlinger::onHotplugReceived(int type, bool connected) //NUM_BUILTIN_DISPLAY_TYPES = HWC_NUM_PHYSICAL_DISPLAY_TYPES//默認為2。當type小于2時,才會繼續執行。即默認最多支持兩個屏。此處的type標示著屏幕類型,如下所示:enum DisplayType {DISPLAY_ID_INVALID = -1,DISPLAY_PRIMARY = HWC_DISPLAY_PRIMARY, //0,默認屏幕DISPLAY_EXTERNAL = HWC_DISPLAY_EXTERNAL, //1,第二屏DISPLAY_VIRTUAL = HWC_DISPLAY_VIRTUAL, //虛擬屏幕NUM_BUILTIN_DISPLAY_TYPES = HWC_NUM_PHYSICAL_DISPLAY_TYPES,};void SurfaceFlinger::createBuiltinDisplayLocked(DisplayDevice::DisplayType type){ALOGW_IF(mBuiltinDisplays[type],"Overwriting display token for display type %d", type);mBuiltinDisplays[type] = new BBinder();DisplayDeviceState info(type);// All non-virtual displays are currently considered secure.info.isSecure = true;mCurrentState.displays.add(mBuiltinDisplays[type], info); //保存到mCurrentState.displays,此處的info為DisplayDeviceState對象,mBuiltinDisplays[type]為IBinder對象。 } uint32_t SurfaceFlinger::setTransactionFlags(uint32_t flags) void SurfaceFlinger::signalTransaction() MessageQueue.cpp void MessageQueue::invalidate() { #if INVALIDATE_ON_VSYNC //此宏為1mEvents->requestNextVsync(); #elsemHandler->dispatchInvalidate(); #endif }EventThread.cpp void EventThread::requestNextVsync( const sp<EventThread::Connection>& connection) //mCondition.broadcast()將掛起的線程喚起 Vector< sp<EventThread::Connection> > EventThread::waitForEvent( DisplayEventReceiver::Event* event) //此函數中的mDisplayEventConnections值得深究。其通過registerDisplayEventConnection()<<<EventThread::Connection::onFirstRef()<<<EventThread::createEventConnection()<<<(SurfaceFlinger::createDisplayEventConnection() <<<DisplayEventReceiver::DisplayEventReceiver())---這個是mEventThread對象的 | (MessageQueue::setEventThread()<<<SurfaceFlinger::init())---這個是mSFEventThread對象的在此構造函數中創建了DisplayEventConnection SurfaceFlinger.cpp void SurfaceFlinger::onMessageReceived(int32_t what) void SurfaceFlinger::handleTransaction(uint32_t transactionFlags){ ...// Here we're guaranteed that some transaction flags are set// so we can call handleTransactionLocked() unconditionally.// We call getTransactionFlags(), which will also clear the flags,// with mStateLock held to guarantee that mCurrentState won't change// until the transaction is committed.transactionFlags = getTransactionFlags(eTransactionMask); //此函數作用?handleTransactionLocked(transactionFlags); //上面函數看上去是將transactionFlags清零 ...invalidateHwcGeometry(); } void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags){ ...if (transactionFlags & eDisplayTransactionNeeded) {// here we take advantage of Vector's copy-on-write semantics to// improve performance by skipping the transaction entirely when// know that the lists are identicalconst KeyedVector< wp<IBinder>, DisplayDeviceState>& curr(mCurrentState.displays);const KeyedVector< wp<IBinder>, DisplayDeviceState>& draw(mDrawingState.displays);...const size_t cc = curr.size();...// find displays that were added// (ie: in current state but not in drawing state)for (size_t i=0 ; i<cc ; i++) {...BufferQueue::createBufferQueue(&bqProducer, &bqConsumer, new GraphicBufferAlloc()); //為對應的display創建新的BufferQueue...else {mEventThread->onHotplugReceived(state.type, true); //通知有新屏設備接入,mEventThread對象中的Connection需要先創建,即createEventConnection()函數需要先被執行,以便后面利用Connection內部對象mChannel來通信!---注意區分與mSFEventThread差別}}} ... } EventThread.cpp void EventThread::onHotplugReceived(int type, bool connected){ //此時type為1,即DISPLAY_EXTERNAL。connected為trueMutex::Autolock _l(mLock);if (type < DisplayDevice::NUM_BUILTIN_DISPLAY_TYPES) {DisplayEventReceiver::Event event;event.header.type = DisplayEventReceiver::DISPLAY_EVENT_HOTPLUG; event.header.id = type;event.header.timestamp = systemTime();event.hotplug.connected = connected;mPendingEvents.add(event); //插入event,將在waitForEvent()讀取mCondition.broadcast();} } Vector< sp<EventThread::Connection> > EventThread::waitForEvent(DisplayEventReceiver::Event* event){ ...if (!timestamp) {// no vsync event, see if there are some other eventeventPending = !mPendingEvents.isEmpty();if (eventPending) {// we have some other event to dispatch*event = mPendingEvents[0]; //取出上面插入的eventmPendingEvents.removeAt(0);}}// find out connections waiting for eventssize_t count = mDisplayEventConnections.size(); //此處對應新display的connectcion已經建立,如何建立???...if (eventPending && !timestamp && !added) {// we don't have a vsync event to process// (timestamp==0), but we have some pending// messages.signalConnections.add(connection);} ...if (!timestamp && !eventPending) { //此時eventPending為true,不會進入此if進行wait,同時signalConnections.add(),所以會退出while循環...}while (signalConnections.isEmpty()); ... } bool EventThread::threadLoop() status_t EventThread::Connection::postEvent( const DisplayEventReceiver::Event& event) //sendEvents()中的mChannel為new new BitTube(),此對象用于pipe通信。關注此時signalConnections[i]來源,其決定pipe通信的兩端。 BitTube.cpp ssize_t BitTube::sendObjects(const sp<BitTube>& tube, void const* events, size_t count, size_t objSize) //objSize為模板size ssize_t BitTube::write(void const* vaddr, size_t size){ //vaddr為event的地址,size為objSize*count ...len = ::send(mSendFd, vaddr, size, MSG_DONTWAIT | MSG_NOSIGNAL); //socket函數進行pipe通信。BitTube的構造函數中,調用init函數,其調用socketpair(AF_UNIX, SOCK_SEQPACKET, 0, sockets)初始化了mReceiveFd和mSendFd ... }

至此,將新屏插入的event消息通過socket發出。?
那何處何時接收并處理此消息呢?從mReceiveFd逆向推出:

BitTube.cpp ssize_t BitTube::read(void* vaddr, size_t size) ssize_t BitTube::recvObjects(const sp<BitTube>& tube, void* events, size_t count, size_t objSize) DisplayEventReceiver.cpp DisplayEventReceiver::getEvents(mDataChannel, events, count) //此處mDataChannel為mEventConnection建立時,初始化的針對此connection的數據通道,其為DisplayEventReceiver內部對象mEventConnection中的mChannel。event為讀取的插入事件指針 MessageQueue.cpp int MessageQueue::eventReceiver(int /*fd*/, int /*events*/){ ssize_t n;DisplayEventReceiver::Event buffer[8];while ((n = DisplayEventReceiver::getEvents(mEventTube, buffer, 8)) > 0) {for (int i=0 ; i<n ; i++) {if (buffer[i].header.type == DisplayEventReceiver::DISPLAY_EVENT_VSYNC) { #if INVALIDATE_ON_VSYNCmHandler->dispatchInvalidate(); #elsemHandler->dispatchRefresh(); #endifbreak;}}}return 1; }

SF在創建事件線程時,同時創建了監聽回調:

mSFEventThread = new EventThread(sfVsyncSrc);mEventQueue.setEventThread(mSFEventThread);void MessageQueue::setEventThread(const sp<EventThread>& eventThread) {mEventThread = eventThread;mEvents = eventThread->createEventConnection(); //其中new Connection(),即初始化了mChannel(new BitTube()),此通道用于監聽注冊mEventTube = mEvents->getDataChannel(); //mChannelmLooper->addFd(mEventTube->getFd(), 0, Looper::EVENT_INPUT,MessageQueue::cb_eventReceiver, this); //Android自4.1后在SF嵌入了消息機制。mLooper->addFd()為注冊監聽,MessageQueue::cb_eventReceiver為回調函數,其調用了eventReceiver() }

分析到此處,插入消息接收處理仿佛已經找到,但 eventReceiver()只處理DISPLAY_EVENT_VSYNC,而我們event包含的是DISPLAY_EVENT_HOTPLUG消息,莫非不用處理??
addFd()先注冊了監聽,當向pipe寫入event插入消息時,從消息隊列中喚起并執行處理。

先關注mEventTube->getFd()監聽的對象:?
setEventThread()只適用于mSFEventThread變量,而我們跟蹤的是另外EventThread對象mEventThread。?
所以上面并非正確的調用處。

回頭看DisplayEventReceiver::getEvents(),同時結合其構造函數創建mEventConnection,等同創建mChannel,必然有地方提前初始化此對象。?
搜索”DisplayEventReceiver “:

android_view_DisplayEventReceiver.cpp class NativeDisplayEventReceiver : public LooperCallback { ... virtual int handleEvent(int receiveFd, int events, void* data); //回調函數DisplayEventReceiver mReceiver; ... }

此類繼承LooperCallback,說明其可以實現消息機制的回調。再查看注冊監聽以及消息獲取:

int rc = mMessageQueue->getLooper()->addFd(mReceiver.getFd(), 0, Looper::EVENT_INPUT, this, NULL); while ((n = mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0)

該有的都有了,斷定此處即為處理插入事件的地方。

在分析EventThread::waitForEvent()時,此函數中的mDisplayEventConnections通過

registerDisplayEventConnection()<<<EventThread::Connection::onFirstRef()<<<EventThread::createEventConnection()<<<(SurfaceFlinger::createDisplayEventConnection() <<<DisplayEventReceiver::DisplayEventReceiver())"

所以addFd(mReceiver.getFd(),xxx)和conn->postEvent(event)中的mChannel為同一個。?
關于native的消息機制,與java的原理類似,熟悉的Handler,Looper,MessageQueue。

Looper.cpp int Looper::pollInner(int timeoutMillis) { ...int callbackResult = response.request.callback->handleEvent(fd, events, data); //setEventThread() 對應的mSFEventThread也使用了callback方式,其傳入了函數指針,被SimpleLooperCallback封裝 ... }

總結一下mChannel這個變量:?
DisplayEventReceiver::mDataChannel<>EventThread::Connection::mChannel?
1).其為BitTube對象?
2).BitTube對象中的mReceiveFd和mSendFd為socket的兩端?
3).addFd注冊監聽,傳入BitTube::mReceiveFd被epoll掛起監聽。同時獲取消息時,::recv(mReceiveFd, vaddr, size, MSG_DONTWAIT),從mReceiveFd讀取?
4).::send(mSendFd, vaddr, size, MSG_DONTWAIT | MSG_NOSIGNAL),mSendFd用于發送消息

現在搞清楚了監聽注冊,接受消息,我們繼續看兩個問題:?
(1).對于插入新屏的處理?
(2).android_view_DisplayEventReceiver.cpp的初始化

android_view_DisplayEventReceiver.cpp

int NativeDisplayEventReceiver::handleEvent(int receiveFd, int events, void* data) //雖然傳入了receiveFd,但此函數內部并沒有使用。為什么可以自己思考。 bool NativeDisplayEventReceiver::processPendingEvents( nsecs_t* outTimestamp, int32_t* outId, uint32_t* outCount){ ...while ((n = mReceiver.getEvents(buf, EVENT_BUFFER_SIZE)) > 0) {...case DisplayEventReceiver::DISPLAY_EVENT_HOTPLUG:dispatchHotplug(ev.header.timestamp, ev.header.id, ev.hotplug.connected);break;} ... }

DisplayEventReceiver.java //DisplayEventReceiver.java為抽象類,LocalDisplayAdapter.java的內部類HotplugDisplayEventReceiver繼承了DisplayEventReceiver?
// Called from native code.?
@SuppressWarnings(“unused”)?
private void dispatchHotplug(long timestampNanos, int builtInDisplayId, boolean connected) {?
onHotplug(timestampNanos, builtInDisplayId, connected);?
}

LocalDisplayAdapter.java

private void tryConnectDisplayLocked(int builtInDisplayId){ //為ev.header.id,此處值為1IBinder displayToken = SurfaceControl.getBuiltInDisplay(builtInDisplayId);if (displayToken != null) {SurfaceControl.PhysicalDisplayInfo[] configs =SurfaceControl.getDisplayConfigs(displayToken); //查詢mBuiltinDisplays.此處configs何時被設定?if (configs == null) {// There are no valid configs for this device, so we can't use itSlog.w(TAG, "No valid configs found for display device " +builtInDisplayId);return;} ...LocalDisplayDevice device = mDevices.get(builtInDisplayId); //此處創建的是LocalDisplayDevice對象if (device == null) {// Display was added.device = new LocalDisplayDevice(displayToken, builtInDisplayId,configs, activeConfig);mDevices.put(builtInDisplayId, device);sendDisplayDeviceEventLocked(device, DISPLAY_DEVICE_EVENT_ADDED); //此處場景為第一次插入第二個屏} ... }

DisplayManagerService.java

private void handleDisplayDeviceAddedLocked(DisplayDevice device){ ...addLogicalDisplayLocked(device);Runnable work = updateDisplayStateLocked(device); //此device為FLAG_NEVER_BLANK并且mGlobalDisplayState狀態不一致時,會調用SurfaceControl.setDisplayPowerMode(token, mode)if (work != null) {work.run();}scheduleTraversalLocked(false); //將調用WindowManagerService::performLayoutAndPlaceSurfacesLockedLoop()>>>performLayoutAndPlaceSurfacesLockedInner()>>>mDisplayManagerInternal.performTraversalInTransactionFromWindowManager()>>>DMS::performTraversalInTransactionLocked()>>>configureDisplayInTransactionLocked()>>>LogicalDisplay::configureDisplayInTransactionLocked()>>>DisplayDevice::setLayerStackInTransactionLocked()>>>SurfaceControl.setDisplayLayerStack(mDisplayToken, layerStack) 如此重要的調用,隱藏的好深!其最終對應Composer::setDisplayLayerStack(),將新創建DisplayState對象并保存到mDisplayStates中,同時DisplayState對象設定狀態eLayerStackChanged和對應layerstack,提供后面顯示使用 ... } private void addLogicalDisplayLocked(DisplayDevice device){ //Adds a new logical display based on the given display device. Sends notifications if needed. ...final int displayId = assignDisplayIdLocked(isDefault);final int layerStack = assignLayerStackLocked(displayId); //最開始提到的將displayid與layerstack一致便是此時完成LogicalDisplay display = new LogicalDisplay(displayId, layerStack, device);display.updateLocked(mDisplayDevices); ...sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_ADDED); }

DisplayManagerGlobal.java

public void registerDisplayListener(DisplayListener listener, Handler handler) //收到EVENT_DISPLAY_ADDED消息,將調用參數listener的回調函數onDisplayAdded()。Presentation.java和ViewRootImpl.java對ADD是空操作,它們更關心CHANGE,REMOVE的變化

到此,插入第二個屏基本結束。從SF開始,到WMS結束。?
其主要作用:在SF對新屏進行了參數初始化,在DMS創建并保存了新的Display,DisplayDevice對象,使得displayId與layerstack對應一致。?
注意:此處分析的是插入新屏,系統開機過程中,DMS默認會對主屏和HDMI進行掃描并創建設備對象:?
LocalDisplayAdapter.java

public void registerLocked() {super.registerLocked();mHotplugReceiver = new HotplugDisplayEventReceiver(getHandler().getLooper());for (int builtInDisplayId : BUILT_IN_DISPLAY_IDS_TO_SCAN) {tryConnectDisplayLocked(builtInDisplayId);}}

系統初始化了第二個的設備對象,那么是如何控制顯示的呢??
我們從ViewRootImpl說起:?
ViewRootImpl.java

public void setView(View view, WindowManager.LayoutParams attrs, View panelParentView) { ...requestLayout(); //下面的跨進程調用addToDisplay()先創建了win,并綁定了對應的displayId。此處將通過Handler執行performTraversals() ...res = mWindowSession.addToDisplay(mWindow, mSeq, mWindowAttributes,getHostVisibility(), mDisplay.getDisplayId(),mAttachInfo.mContentInsets, mAttachInfo.mStableInsets, mInputChannel); ... }private void performTraversals() { ...relayoutResult = relayoutWindow(params, viewVisibility, insetsPending); //創建對應的Surface畫布 ...performDraw(); //在創建并返回的Surface上執行繪畫 ... }

WindowManagerService.java

public int relayoutWindow(Session session, IWindow client, int seq,WindowManager.LayoutParams attrs, int requestedWidth,int requestedHeight, int viewVisibility, int flags,Rect outFrame, Rect outOverscanInsets, Rect outContentInsets,Rect outVisibleInsets, Rect outStableInsets, Configuration outConfig,Surface outSurface){ //此處outSurface為null,其在WMS被創建賦值,并返回給ViewRootImpl ...SurfaceControl surfaceControl = winAnimator.createSurfaceLocked();if (surfaceControl != null) {outSurface.copyFrom(surfaceControl);if (SHOW_TRANSACTIONS) Slog.i(TAG," OUT SURFACE " + outSurface + ": copied");} ... }

WindowStateAnimator.java

SurfaceControl createSurfaceLocked(){ ... // Start a new transaction and apply position & offset.SurfaceControl.openTransaction(); ...if (displayContent != null) {mSurfaceControl.setLayerStack(displayContent.getDisplay().getLayerStack()); //此處只關注第二個屏,即layerstack的處理} ...SurfaceControl.closeTransaction(); //將此處的設置一并提交 ... }

因為SF與framework對應的變量有著重重封裝,此處直接跳過:

SurfaceComposerClient.cpp

status_t Composer::setLayerStack(const sp<SurfaceComposerClient>& client,const sp<IBinder>& id, uint32_t layerStack) { //id為SurfaceControl.cpp中的mHandleMutex::Autolock _l(mLock);layer_state_t* s = getLayerStateLocked(client, id); //將第二個屏對應的ComposerState對象添加到mComposerStates中。ComposerState對象s.client為SF的Bp端,s.state.surface為IBinder對象mHandleif (!s)return BAD_INDEX;s->what |= layer_state_t::eLayerStackChanged;s->layerStack = layerStack; //設置了flag和laystack,在closeTransaction()提交時處理return NO_ERROR; }//SurfaceControl.closeTransaction()的對應處理 void Composer::closeGlobalTransactionImpl(bool synchronous) { ...transaction = mComposerStates;mComposerStates.clear();displayTransaction = mDisplayStates; //上面分析已經提供mComposerStates和mDisplayStates的創建添加mDisplayStates.clear(); ...sm->setTransactionState(transaction, displayTransaction, flags); //因為前面也有getLayerStateLockedmSurfaceControl.setSize(),其會將mForceSynchronous賦值為true,所以flag有eSynchronous。 }

SurfaceFlinger.cpp

void SurfaceFlinger::setTransactionState(const Vector<ComposerState>& state,const Vector<DisplayState>& displays,uint32_t flags) { ...count = state.size();for (size_t i=0 ; i<count ; i++) {const ComposerState& s(state[i]);if (s.client != NULL) {sp<IBinder> binder = s.client->asBinder();if (binder != NULL) {String16 desc(binder->getInterfaceDescriptor());if (desc == ISurfaceComposerClient::descriptor) {sp<Client> client( static_cast<Client *>(s.client.get()) );transactionFlags |= setClientStateLocked(client, s.state); //將調用Layer::setLayerStack(),將layerstack保存到mCurrentState.layerStack,為mTransactionFlags添加eTransactionNeeded,后面的onDraw()使用}}}} ...if (transactionFlags) { //此時eTransactionNeeded|eTraversalNeeded// this triggers the transactionsetTransactionFlags(transactionFlags); //將調用到handleTransactionLocked()// if this is a synchronous transaction, wait for it to take effect// before returning.if (flags & eSynchronous) { mTransactionPending = true;}if (flags & eAnimation) {mAnimTransactionPending = true;}while (mTransactionPending) { //此時mTransactionPending為truestatus_t err = mTransactionCV.waitRelative(mStateLock, s2ns(5));if (CC_UNLIKELY(err != NO_ERROR)) {// just in case something goes wrong in SF, return to the// called after a few seconds.ALOGW_IF(err == TIMED_OUT, "setTransactionState timed out!");mTransactionPending = false;break;}}} }void SurfaceFlinger::handleTransactionLocked(uint32_t transactionFlags){ ...if (transactionFlags & eTraversalNeeded) {for (size_t i=0 ; i<count ; i++) {const sp<Layer>& layer(currentLayers[i]);uint32_t trFlags = layer->getTransactionFlags(eTransactionNeeded); //if (!trFlags) continue;const uint32_t flags = layer->doTransaction(0); //每個layer進行遍歷處理,將調用Layer::commitTransaction()>>>mDrawingState = mCurrentState。這樣第二個屏的已經轉變為mDrawingState狀態。if (flags & Layer::eVisibleRegion)mVisibleRegionsDirty = true;}} ...commitTransaction(); //調用mTransactionCV.broadcast(),使得 SurfaceControl.closeTransaction()線程返回.同時mDrawingState = mCurrentState;updateCursorAsync(); }

至此,已經將SF和Layer中的mDrawingState與第二個屏綁定。performDraw()可以愉快在插入的新屏上繪制了。

http://www.voidcn.com/article/p-wxfimpep-bpd.html

總結

以上是生活随笔為你收集整理的基于Android5.1的双屏异显分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

国产日韩欧美视频 | www久| 欧美性色19p | 久久久亚洲网站 | 98涩涩国产露脸精品国产网 | 麻豆精品国产传媒 | 97人人超| www国产亚洲精品久久网站 | 麻豆传媒视频在线播放 | av一区二区三区在线观看 | 欧洲亚洲国产视频 | 国产亚洲精品久久久久久网站 | 国产亚洲精品久久久久久网站 | 国产精品成人a免费观看 | 成年人毛片在线观看 | 西西人体www444 | 91中文字幕在线播放 | 日韩av中文在线 | 久久人人做 | 精品欧美乱码久久久久久 | 91亚洲精品久久久中文字幕 | 日韩理论电影在线观看 | 91传媒激情理伦片 | 欧美大片在线看免费观看 | 蜜臀av性久久久久av蜜臀妖精 | 欧美一二三视频 | 99精品国产免费久久久久久下载 | 亚洲综合欧美激情 | 嫩草伊人久久精品少妇av | 中文字幕频道 | 91看片看淫黄大片 | 在线 国产 亚洲 欧美 | 久久最新网址 | 91视频免费播放 | 午夜久久久久久久久 | 天天天操天天天干 | 欧美激情操| 日韩com | 国产精品18久久久久久久久久久久 | 亚洲天堂激情 | 久久综合九色九九 | 中文网丁香综合网 | 人人爽人人插 | 日韩精品不卡在线观看 | 日本最大色倩网站www | 欧美日韩一区久久 | av免费电影网站 | 日本中文字幕网 | 麻豆91在线观看 | 伊人夜夜 | 久久久久女教师免费一区 | 激情 婷婷 | 青草草在线 | 草樱av| 亚洲最大的av网站 | 久久免费播放 | 欧美精品亚洲精品日韩精品 | 91精品视频播放 | 久久99热这里只有精品国产 | www好男人| 五月婷婷丁香六月 | 超碰人人在线观看 | 17videosex性欧美 | 久久久久久久久久久久亚洲 | 午夜精品福利一区二区 | 亚洲草视频 | 国产高清视频网 | 久久视频免费看 | 欧美综合干 | 亚洲激情在线观看 | 狠狠的操狠狠的干 | 激情欧美一区二区三区免费看 | 中文字幕韩在线第一页 | 亚洲视频久久久 | 国产69精品久久久久久 | 97人人超 | 亚洲久草在线 | 免费毛片aaaaaa | 91免费观看视频网站 | 成人超碰在线 | 伊人影院得得 | 国产福利一区在线观看 | 亚洲欧美成人网 | 在线播放精品一区二区三区 | 韩日av一区二区 | 在线免费观看欧美日韩 | 午夜精品一区二区国产 | 99爱视频| 精品一二三四五区 | 日韩专区在线播放 | 欧美一级电影免费观看 | 婷婷视频在线 | 欧美日韩高清一区 | 丁香九月婷婷 | 综合国产视频 | 欧美午夜理伦三级在线观看 | 九九久久久 | 亚洲成人av在线播放 | 国产精品毛片一区视频播不卡 | 亚洲国产精品推荐 | 久久一区二区三区国产精品 | 天天插天天射 | 区一区二在线 | 国产视频在线观看一区 | 久久丁香网 | 久久理论电影 | 黄色片网站大全 | 91福利影院在线观看 | 久久综合影院 | 国产伦理剧 | 欧美色综合| 国产精品成人品 | 日韩在线视频观看 | 国产精品第三页 | 久久视频精品 | 又黄又爽又湿又无遮挡的在线视频 | 丁香久久五月 | 91av小视频 | 久久手机精品视频 | 999久久久免费视频 午夜国产在线观看 | 丁香久久| 日韩精品一区二区三区在线播放 | 人人看人人艹 | 91禁在线看 | 91看片成人| 色在线视频 | 久久久久久久久爱 | 免费亚洲精品 | 久操免费视频 | www.成人久久 | 国产裸体永久免费视频网站 | 成人免费网站在线观看 | 久久国产视频网 | 91网站观看 | 午夜视频免费 | 久久综合九色99 | 国产成人一区二区三区 | 91九色在线观看视频 | 亚洲国产日韩在线 | 91视频91自拍| 6080yy精品一区二区三区 | 国内精品一区二区 | 91九色性视频 | 国产裸体视频网站 | 久久久久久高潮国产精品视 | 久久综合婷婷国产二区高清 | 欧美一区二区在线免费观看 | 亚洲狠狠| 欧美aaa级片 | 成人av电影在线 | 在线播放一区 | 日韩欧美国产成人 | 国产黄色片免费在线观看 | 色福利网 | 日韩专区av | 日韩精品一区二区三区高清免费 | 狠狠成人 | 久久久久网址 | 97超碰在线资源 | 美女久久 | 久久久久99精品国产片 | 免费的国产精品 | 欧美日韩视频在线播放 | 国产视频在线一区二区 | 99久久99久久精品 | 又黄又爽又色无遮挡免费 | 国产在线探花 | mm1313亚洲精品国产 | 久久久免费毛片 | 中文字幕二区在线观看 | 一区二区三区在线看 | 国产精品久久99综合免费观看尤物 | 五月婷婷黄色 | 国产成人专区 | japanese黑人亚洲人4k | 片网址 | 综合久久精品 | 99产精品成人啪免费网站 | 97免费在线观看视频 | 国产精品一区二区在线播放 | 天堂入口网站 | 成人av一区二区兰花在线播放 | 玖玖精品在线 | 国产1区2区3区精品美女 | 国产一区二区三区在线免费观看 | 色婷婷www| 超碰在线公开免费 | 在线观看不卡的av | 天天拍天天操 | 亚洲视频2 | 精品一区二三区 | 91成年人在线观看 | 激情伊人五月天 | 激情婷婷亚洲 | 久久一区二区免费视频 | 美女视频黄免费网站 | 香蕉久久久久久av成人 | 中文字幕有码在线播放 | 久久精品国产免费 | 麻豆观看 | 国产原创在线 | 国产成人精品一区二区在线观看 | 91中文字幕永久在线 | 国产福利免费在线观看 | 日韩在线小视频 | 91在线视频在线观看 | 99久久99视频| 免费欧美 | 波多野结衣在线播放一区 | 亚洲视频第一页 | 国产精品专区h在线观看 | 欧美一区二区三区免费看 | 亚洲国产偷 | 草在线| 国产综合福利在线 | 免费看片在线观看 | 美女精品网站 | 黄色一二级片 | www色av| 久久69精品久久久久久久电影好 | 中文字幕在线电影 | 最新国产一区二区三区 | 久久精品99国产国产精 | 亚洲高清在线 | 久久成人精品电影 | 久久丁香 | 97视频人人澡人人爽 | 91久久奴性调教 | 人人爽人人爽人人片 | 久久婷婷久久 | 久久中文网 | 日韩欧美在线免费 | 久久精品福利视频 | 人人爽人人干 | 国产无遮挡猛进猛出免费软件 | 99在线精品视频观看 | 国产亚洲精品久久久久久网站 | 一本色道久久综合亚洲二区三区 | 天天狠狠 | 中文字幕亚洲在线观看 | 韩国一区在线 | 亚洲精品毛片一级91精品 | 日韩电影一区二区在线 | 天天干天天操天天干 | 免费在线观看av网址 | www久| 日日干夜夜爱 | 久草网免费 | 国产精品久久亚洲 | 精品自拍网 | 国产成人综合在线观看 | 日日爱网址 | 探花在线观看 | 国内揄拍国内精品 | 99久久精品免费看国产四区 | 又黄又爽的免费高潮视频 | 亚洲日韩中文字幕在线播放 | 国产一区二区三区高清播放 | 激情一区二区三区欧美 | 999国内精品永久免费视频 | 国产亚洲精品xxoo | 狠狠操操操 | 日日夜夜天天 | 久久五月网 | 91观看视频| 五月婷婷中文网 | 国产精品国产三级国产不产一地 | 日本久久电影网 | 黄色a视频 | 天天色天天综合 | 最近中文字幕久久 | 欧美一区在线观看视频 | 视频一区二区在线 | 91麻豆精品国产自产在线游戏 | 天天爱天天插 | 美女黄频在线观看 | 国产精品亚洲精品 | 久久精品福利视频 | 热久久免费视频 | 亚洲综合在线五月 | 亚洲天天综合 | 亚洲精品一区二区三区四区高清 | 欧美国产日韩一区二区三区 | 日韩欧美国产视频 | 人人爽人人香蕉 | 欧美乱码精品一区 | www.看片网站 | 天天色天天综合 | 在线观看完整版免费 | 久久影视一区 | 婷婷视频在线观看 | 国产精品一区二区62 | 亚洲精品福利在线 | 国产高清久久久久 | 在线亚洲欧美日韩 | 国产精品高潮呻吟久久久久 | 日b黄色片 | 婷婷伊人五月天 | 911久久| 国产一级特黄毛片在线毛片 | av在线8 | 亚洲国产精品电影在线观看 | 久久综合影音 | 一级黄色片在线免费观看 | 丁香婷婷色 | 视频国产 | 美国三级黄色大片 | 久久伊人八月婷婷综合激情 | 日韩免费久久 | 久久免费视频8 | 久久69精品 | 久久综合九九 | 国产人成精品一区二区三 | 91成人免费| 黄色三级免费 | 婷婷在线免费 | 国产在线观看免费av | 伊人夜夜 | 丁香网五月天 | 黄a在线看| 久久99精品久久久久婷婷 | 久久福利影视 | 久色小说 | 久草干| 精品久久1 | 国产成人一区二区三区在线观看 | 日韩成片 | 亚洲国产日韩欧美 | 亚洲精品在线观看不卡 | 91成品人影院 | 日韩特黄av | 8x成人免费视频 | 999久久a精品合区久久久 | 亚洲精品视频观看 | 成人久久18免费网站 | 波多野结衣小视频 | 欧美精品在线观看一区 | 欧美日韩国产在线 | 91精品久久久久久久久久入口 | 欧美一区二区三区四区夜夜大片 | 国产在线久久久 | 久久精品国产v日韩v亚洲 | 亚洲日本一区二区在线 | 欧美激情综合网 | 免费日韩 精品中文字幕视频在线 | 免费在线国产 | 久久久久久久久久久影视 | 久在线 | 日本性生活免费看 | 亚洲二区精品 | 在线成人免费av | 深爱激情五月婷婷 | 国内小视频 | 亚洲国产精品免费 | 综合色中色 | 综合激情婷婷 | 91精品高清 | 久久久国产一区二区 | 一区二区三区手机在线观看 | 国产精品原创视频 | 国产亚洲欧洲 | 久久久久久国产精品亚洲78 | 五月av在线 | 中文国产在线观看 | 五月婷社区 | 日本巨乳在线 | a在线观看国产 | 色综合久久久久久久久五月 | 免费a网 | 欧美另类z0zx | 免费黄在线观看 | 又黄又爽的免费高潮视频 | 亚洲一区精品人人爽人人躁 | 狠狠色噜噜狠狠 | 2024av| 国产96在线观看 | 免费观看的av网站 | 成人国产一区二区 | 蜜臀久久99精品久久久久久网站 | 在线观看黄a | 精品视频99 | 国产免费亚洲高清 | a成人v | 98涩涩国产露脸精品国产网 | 中文字幕中文字幕在线中文字幕三区 | 欧美性生爱| 天天综合网天天综合色 | 国产免费人成xvideos视频 | 香蕉视频最新网址 | 麻豆视频成人 | 久草在线官网 | 91精品视频免费观看 | 久久精品男人的天堂 | 亚洲天堂网在线观看视频 | 国产黄色精品视频 | 色婷婷国产精品一区在线观看 | 午夜精品一区二区三区在线观看 | 偷拍精品一区二区三区 | 免费观看版 | 狠狠色丁香婷综合久久 | 婷婷激情综合五月天 | 免费av在 | 国产高清久久久久 | 免费精品久久久 | 黄网站免费久久 | 久久成人精品视频 | 免费视频97 | 成片免费观看视频999 | www久久九| 久久精品国产精品亚洲精品 | 月丁香婷婷 | 亚洲视频久久久久 | 91爱爱免费观看 | 成年人在线观看免费视频 | 黄色h在线观看 | 六月婷婷色| 色综合久久久久 | 成人久久免费视频 | 久久天堂亚洲 | 日韩欧美极品 | 麻豆观看 | 香蕉久久国产 | 亚洲欧美日韩一区二区三区在线观看 | 日韩av一区二区三区在线观看 | 国产在线高清精品 | 午夜视频在线观看一区二区三区 | 热久久国产精品 | 中文资源在线观看 | 五月在线视频 | 久久激情视频网 | 久久综合成人 | 亚洲激情 在线 | 国产99久久久国产精品成人免费 | 性色av免费观看 | 欧美激情精品久久久久久免费 | 在线免费观看视频a | 欧美日韩另类视频 | 国产91成人在在线播放 | 天堂入口网站 | 97精品伊人 | 亚洲精品国产精品国自产观看浪潮 | 人人揉人人揉人人揉人人揉97 | 丁香六月在线观看 | 免费av成人在线 | 婷婷网站天天婷婷网站 | 久久综合九色欧美综合狠狠 | 激情网色 | 91黄色视屏 | 国产香蕉97碰碰久久人人 | 成人免费在线电影 | 国产免费亚洲高清 | 国产伦精品一区二区三区无广告 | 中文字幕中文中文字幕 | 久久久久久久久久伊人 | 国产五月色婷婷六月丁香视频 | 狠狠的干狠狠的操 | 99视频免费 | 国产精品日韩在线播放 | 丝袜护士aⅴ在线白丝护士 天天综合精品 | 成人黄色在线看 | 激情中文在线 | 奇米影视在线99精品 | 欧美成人aa | 九色porny真实丨国产18 | 麻豆影视在线播放 | 外国av网| 国产精品九九久久久久久久 | 蜜桃av综合网| 亚洲视频专区在线 | 亚洲国产精品一区二区尤物区 | 国产精品国产三级国产不产一地 | 久久精品国产精品 | 成人9ⅰ免费影视网站 | 韩国精品一区二区三区六区色诱 | 亚洲视频 中文字幕 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 欧美一级特黄aaaaaa大片在线观看 | 夜夜摸夜夜爽 | 国产99精品| 日韩中文在线播放 | 亚洲天天综合 | 天天色天天操天天爽 | 欧美美女视频在线观看 | 成人高清av在线 | 亚洲午夜精品久久久久久久久 | 欧美日韩国产一区二区三区 | 久久久久久久久国产 | 在线91播放 | 国产麻豆剧传媒免费观看 | 最近中文字幕国语免费高清6 | 色综合久久久久综合 | 国产成人福利在线观看 | 99视频在线观看一区三区 | 久久成人免费 | 久草在线中文888 | 久草在线电影网 | 在线观看欧美成人 | 天天操天天干天天操天天干 | 狠狠操电影网 | 日本少妇高清做爰视频 | 天天操天天射天天爽 | 久久久久欠精品国产毛片国产毛生 | 狠狠网站| 欧美日韩视频在线观看一区二区 | 久久久久国产精品视频 | 久久调教视频 | av网站在线免费观看 | 精品久久毛片 | 手机在线免费av | 免费观看91视频大全 | 久久久国产精品人人片99精片欧美一 | 国产成人黄色片 | 永久黄网站色视频免费观看w | 精品一区二区三区香蕉蜜桃 | 亚洲欧美一区二区三区孕妇写真 | 亚洲国产中文在线 | 99在线视频精品 | 免费在线中文字幕 | 久久久免费观看完整版 | 亚洲伦理中文字幕 | 久久国产精品99久久久久久老狼 | 2019中文在线观看 | 国产淫片免费看 | 欧美日韩视频一区二区三区 | a级国产乱理论片在线观看 特级毛片在线观看 | 亚洲精品国偷自产在线99热 | 日韩欧美一级二级 | 国产精品免费视频一区二区 | 五月天婷婷在线观看视频 | www亚洲视频 | 久久噜噜少妇网站 | 亚洲精品在线播放视频 | 99综合久久 | 成人午夜电影网 | 日韩a在线观看 | 97精品国产91久久久久久久 | 日日日干 | 婷婷新五月| 欧美久久电影 | 在线观看日本高清mv视频 | 狠狠操狠狠干2017 | 日韩v在线91成人自拍 | 成人免费视频网 | 久草在线观看视频免费 | 在线视频 一区二区 | 97超碰资源网 | 日韩av在线网站 | 亚洲人片在线观看 | 91探花国产综合在线精品 | 黄色.com| 欧美极品xxxx | 成人羞羞免费 | 欧美性脚交 | av三级在线免费观看 | 久久久综合 | 香蕉视频日本 | 免费看一及片 | 激情五月婷婷激情 | 精品国产一区二区三区久久久蜜月 | 久久亚洲专区 | 一级精品视频在线观看宜春院 | 97人人精品 | 狠狠干夜夜爽 | 成人av电影网址 | 这里有精品在线视频 | 成人福利在线 | 天天操夜夜摸 | 最近中文字幕mv | 欧美调教网站 | 91理论电影 | 国产色秀视频 | 日韩国产精品一区 | 精品国产乱码久久久久久1区二区 | 最近中文字幕高清字幕在线视频 | 日韩高清成人在线 | 久久亚洲精品国产亚洲老地址 | 国产精品99久久久久人中文网介绍 | 在线观看久久久久久 | 日韩欧美视频在线观看免费 | 亚洲精品久久久久www | 蜜臀av网址 | 欧美在线18 | 日本最新一区二区三区 | 六月丁香激情网 | 欧美日韩视频在线观看免费 | 色天天综合网 | 国产成人精品一区二区三区免费 | 亚洲婷婷综合色高清在线 | 日韩理论在线播放 | 99精品视频在线播放观看 | 96av视频 | 久久99影院 | 国产视频在线观看一区 | 免费视频久久久久 | 成人在线黄色 | 婷婷国产视频 | 亚洲精品资源 | 欧美日韩精品网站 | 激情视频在线观看网址 | 中文在线字幕观看电影 | 亚洲欧美日韩不卡 | 欧美一区日韩一区 | 亚洲午夜精品久久久久久久久久久久 | 日韩区视频 | 99免费在线视频观看 | 97色综合| 久久国产成人午夜av影院潦草 | 午夜成人免费影院 | 九九九热精品免费视频观看网站 | 91在线播放视频 | 日韩黄色av网站 | 99精品偷拍视频一区二区三区 | 69av视频在线观看 | 国产精品大尺度 | 91在线操| 久久黄色a级片 | 国产成人高清在线 | 亚洲欧美日韩不卡 | 天天综合网~永久入口 | 中文字幕有码在线观看 | 麻豆精品视频在线观看免费 | 伊人成人精品 | 成人av视屏 | 国产一二三在线视频 | 亚洲欧美日韩不卡 | 99免费看片 | 麻豆一区在线观看 | 91黄色影视 | 久久专区 | av电影中文 | 成人午夜av电影 | 午夜视频在线观看网站 | 国产精品成人a免费观看 | 亚洲精品日韩av | 国产精品国产三级国产aⅴ无密码 | 中中文字幕av在线 | 亚洲成年人av | se视频网址 | av日韩在线网站 | 精品国产伦一区二区三区观看说明 | 亚洲欧洲日韩在线观看 | 成年人在线观看视频免费 | 美女久久| 中文在线中文资源 | 欧美久草在线 | 岛国av在线不卡 | 免费在线观看成年人视频 | 色播六月天 | 91视频免费视频 | 91精品国产92久久久久 | 天天搞天天 | 日韩免费在线观看网站 | 在线看v片 | 亚洲人成在线电影 | 免费看的黄色录像 | 精品亚洲一区二区 | 色婷婷色 | 久久久精选 | 黄色大片日本免费大片 | 日韩字幕 | 久久91久久久久麻豆精品 | 911精品视频 | 三级黄色在线 | 日本精a在线观看 | 国产日韩视频在线 | 亚洲色图av | 午夜国产在线 | av网站免费看 | 一级α片 | 色噜噜狠狠狠狠色综合久不 | 国产亚洲精品福利 | 精品久久久免费 | 成人影片在线免费观看 | 91精品电影 | 精品在线免费视频 | 天天干天天干天天色 | 四虎影视国产精品免费久久 | 成人亚洲网| 97电影网站| 精品一区久久 | 天天艹天天爽 | 成人cosplay福利网站 | 日韩一区二区三区观看 | av一区在线 | 成人一区二区在线观看 | av成人免费网站 | 日韩av成人免费看 | 永久免费视频国产 | 精品国产1区 | 精品国产理论 | 日韩精品一区电影 | 狠狠躁日日躁狂躁夜夜躁av | 国产精品免费看久久久8精臀av | 午夜国产福利在线观看 | h网站免费在线观看 | 国产 一区二区三区 在线 | 久久99免费 | 丁香在线观看完整电影视频 | 亚洲国产成人久久 | 久久综合久久鬼 | 精精国产xxxx视频在线播放 | 国产免费久久久久 | 免费高清在线观看成人 | 免费精品 | 国产美女免费 | 亚洲电影一区二区 | 国产无遮挡又黄又爽馒头漫画 | 在线有码中文字幕 | 亚洲美女视频在线观看 | 97香蕉超级碰碰久久免费软件 | 久九视频| 人人射人人爱 | 国产成人精品日本亚洲999 | 高清精品在线 | 四虎在线免费视频 | 色香天天 | 日本精品在线视频 | 久久久久久久久福利 | 伊人宗合网| 天天干天天做 | 久久天天躁狠狠躁夜夜不卡公司 | 又爽又黄又无遮挡网站动态图 | 亚洲成人在线免费 | 亚洲狠狠婷婷综合久久久 | 欧美激精品 | 精品国产成人av | 中文字幕一区二区三区在线播放 | .国产精品成人自产拍在线观看6 | 在线有码中文字幕 | 狠狠狠狠狠色综合 | 天天操夜夜想 | 成人在线免费av | 欧美久久99| 91探花在线 | 亚洲精品在线资源 | 在线黄频 | 久久精品超碰 | 最新成人av | 日本黄色免费观看 | 午夜aaaa | 午夜精品久久久久久 | 成人a级黄色片 | 五月天九九 | 国产一区二区久久久 | 国产a国产a国产a | 成人综合婷婷国产精品久久免费 | 亚洲少妇天堂 | 亚洲天堂网在线视频观看 | 亚洲成色777777在线观看影院 | 一区二区日韩av | 一本色道久久综合亚洲二区三区 | 97人人精品 | 国产拍揄自揄精品视频麻豆 | 99精品免费久久久久久久久日本 | 黄色国产在线 | 久久国产精品区 | av电影在线不卡 | 欧美日一级片 | 国产精品国产三级国产不产一地 | 麻豆国产精品一区二区三区 | 国产91精品久久久久 | 91视频免费视频 | 五月婷婷视频在线 | 青青河边草手机免费 | 天天干天天干天天干 | 欧美精品亚洲精品日韩精品 | 国产裸体永久免费视频网站 | 天天操导航 | 久久精品国产精品亚洲精品 | 亚洲欧美久久 | 人人干免费 | 亚洲激情 欧美激情 | 97视频在线免费观看 | 色在线中文字幕 | 色综合天天综合 | 久久久99国产精品免费 | 欧美男同网站 | 69国产成人综合久久精品欧美 | 午夜999| 99在线热播精品免费 | 日日夜色 | 五月天最新网址 | 伊人亚洲综合网 | av黄色在线| 99热9 | 天天做日日爱夜夜爽 | 东方av在线免费观看 | 天天在线操 | 成人性生交视频 | 国产高清在线免费视频 | 天天射狠狠干 | 色综合久久久久网 | 麻豆成人在线观看 | 中文字幕在线观看一区二区 | 91精品国产99久久久久久红楼 | 国产一级二级三级在线观看 | 亚洲黄色在线免费观看 | 国产成人精品一区二区在线观看 | 久久久久久高潮国产精品视 | 中文av网 | 9999毛片| 免费福利视频网站 | 永久免费毛片在线观看 | 中文字幕在线看视频国产中文版 | 亚洲激情精品 | 狠狠色丁香九九婷婷综合五月 | 亚洲综合视频在线观看 | av夜夜操 | 一区二区三区精品久久久 | 特级毛片爽www免费版 | 成人在线免费小视频 | 伊人午夜视频 | 中文永久免费观看 | 免费网站观看www在线观看 | 五月色婷 | 免费久久久久久久 | 国产你懂的在线 | 色综合久久中文字幕综合网 | 亚洲午夜精品久久久 | 91免费在线视频 | 看片网站黄| 国产少妇在线观看 | 91在线看黄 | 98超碰在线 | 久久久精品欧美 | 国内精品久久久精品电影院 | 久久99久久99精品中文字幕 | 免费高清男女打扑克视频 | 久久福利国产 | 精品专区一区二区 | 伊人影院99 | 午夜久草| 激情五月播播久久久精品 | 久久伦理影院 | 欧美激情视频在线免费观看 | 天天婷婷| 久久观看 | 91在线看网站 | 国产成人精品久久久 | 国产精品美女久久久久久久久 | 日本成人中文字幕在线观看 | 欧美午夜精品久久久久久孕妇 | 亚洲精品乱码久久久一二三 | 免费在线观看av网站 | 美女久久一区 | 狠狠色狠狠色综合日日92 | 国产极品尤物在线 | 亚洲高清久久久 | 一区二区不卡在线观看 | 激情网五月婷婷 | 日本女人的性生活视频 | 久久av伊人 | 久久免视频 | 91高清免费在线观看 | 狠狠狠色| 亚洲精品中文字幕在线 | 香蕉网在线播放 | 亚洲最新在线视频 | 色多多污污在线观看 | 免费黄色激情视频 | 成年人免费在线观看网站 | 久久免费试看 | a色网站 | 亚洲精品视频网址 | 97理论电影 | 久久婷婷丁香 | 日本 在线 视频 中文 有码 | av一区二区在线观看中文字幕 | 欧美热久久| 黄色三级免费片 | 国产午夜视频在线观看 | 免费在线观看一级片 | 综合精品久久 | 国产精品国产自产拍高清av | 九九热在线观看视频 | 久久热首页 | 成年免费在线视频 | 中文字幕在线免费看 | 国产亚洲成av人片在线观看桃 | 欧美男女爱爱视频 | 91一区啪爱嗯打偷拍欧美 | 色资源网在线观看 | 夜夜操天天 | 色婷婷一| 亚在线播放中文视频 | 91干干干 | 天天操天天射天天插 | 免费亚洲一区二区 | 91成人看片 | 国内精品亚洲 | 免费亚洲黄色 | 一区 在线观看 | 国产资源在线视频 | 在线观看中文字幕一区二区 | 国产精品久久久久久久久大全 | 国产黄色理论片 | 超碰在线cao| 欧美日韩一区二区三区视频 | 国产成人免费网站 | 亚洲综合视频在线播放 | 天天做日日做天天爽视频免费 | 天天色综合三 | 亚洲人成精品久久久久 | 天天艹天天操 | www免费 | 久久 精品一区 | 天天干天天在线 | 久久精品香蕉 | 久久精品一区 | 手机在线中文字幕 | 丁香婷婷在线 | 这里只有精品视频在线观看 | 日韩精品一区在线播放 | 三级黄色在线 | 精品国产一区二 | 日韩高清免费电影 | 日本精品一区二区三区在线观看 | 国产专区视频 | 最新高清无码专区 | 亚洲精品高清在线 | 精品国产一区二区三区久久久蜜臀 | 粉嫩aⅴ一区二区三区 | 亚洲伊人成综合网 | 天天干天天操天天入 | 成人啊 v | 亚洲高清在线视频 | 天天操天天谢 | 国产成人精品一区二区在线 | 日本韩国精品在线 | 一二区av| 日韩免费在线观看视频 | 91视频国产高清 | 日韩av一区二区三区在线观看 | 六月色 | 91成人免费在线 | a级片网站 | 黄色片网站| 免费日韩视 | 久草久热| 久久经典视频 | 最新中文在线视频 | 狠狠88综合久久久久综合网 | 欧美日韩在线电影 | 久草综合在线 | 久久婷婷影视 | 91丨九色丨国产丨porny精品 | 最新av电影网站 | 色网站在线 | 人人讲下载 | 中文字幕在线免费看线人 | 蜜臀av性久久久久av蜜臀三区 | 狠狠的日 | 亚洲精品无| 欧美极品xxxxx | 日日成人网 | 伊人国产女 | 国产亚洲无| 久久精品国产久精国产 | 国产精品免费在线播放 | 国产一二三精品 | 久久久免费国产 | 狠狠狠色丁香综合久久天下网 | 中文一二区| 狠狠色丁香| 日韩中文字幕在线 | 999视频在线播放 | 国产无套精品久久久久久 | 日韩中字在线观看 | 欧美日韩激情视频8区 | 在线观看www. | 午夜国产影院 | 亚洲污视频 | 精品日韩视频 | 亚洲天堂精品视频 | 在线观看 国产 | 欧美精品被 | 热久久视久久精品18亚洲精品 | 日韩av区 | 国产精品一区二区免费在线观看 | 欧美久久久久 | 中文字幕一区二区三区四区 | 中文字幕美女免费在线 | 亚洲精品麻豆视频 | 亚洲三级在线播放 | 国产精品99久久久精品免费观看 | 91色亚洲 | 久久99爱视频 | 日韩xxxx视频 | 特级西西444www大精品视频免费看 | 97电院网手机版 | 国产玖玖视频 | 国产69久久精品成人看 | a级国产乱理论片在线观看 特级毛片在线观看 | 97超在线视频 | 在线观看不卡视频 | 超碰日韩 | 国产成人免费观看久久久 | 国产在线精品一区二区三区 |