日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

你的debug包在Android 14變卡了嗎

來源: 責編: 時間:2024-04-16 08:33:16 281觀看
導讀一、背景我的App怎么這么卡,誰在代碼里下毒了!有一天突然發現debug包運行變的特別卡頓,經過下面的簡單測試發現debug包在Android 14上出了問題。 圖片二、問題排查紀錄常規手段排查使用了systrace以及內部的debug包 trac

一、背景

我的App怎么這么卡,誰在代碼里下毒了!BFG28資訊網——每日最新資訊28at.com

有一天突然發現debug包運行變的特別卡頓,經過下面的簡單測試發現debug包在Android 14上出了問題。 BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

二、問題排查紀錄

BFG28資訊網——每日最新資訊28at.com

常規手段排查

BFG28資訊網——每日最新資訊28at.com

使用了systrace以及內部的debug包 trace工具dutrace進行排查。BFG28資訊網——每日最新資訊28at.com

結論:CPU空閑,主線程無明顯阻塞,看上去就是純方法執行耗時。BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

發現懷疑點

BFG28資訊網——每日最新資訊28at.com

第一步排查過程中沒有特別大的收獲,但是我用dutrace工具排查時發現了一個異常現象。這里簡單介紹一下dutrace的實現原理:BFG28資訊網——每日最新資訊28at.com

dutrace是利用inline hook在artmethod的執行前后加上atrace的點再通過perfetto ui工具展示。有以下優點:BFG28資訊網——每日最新資訊28at.com

    1. 支持線下分析函數執行流程,函數耗時。BFG28資訊網——每日最新資訊28at.com

    2. 在分析函數調用流程下:BFG28資訊網——每日最新資訊28at.com

        a. 可以查看整個過程的函數調用(包括framework函數);BFG28資訊網——每日最新資訊28at.com

        b. 能夠指定監控的函數和線程有效過濾無用trace;BFG28資訊網——每日最新資訊28at.com

        c. 動態配置不需要重新打包。BFG28資訊網——每日最新資訊28at.com

    3. 可使用現成的UI分析工具,有系統關鍵線程的函數調用,例如渲染耗時、線程鎖,GC 耗時等,還有 I/O 操作、CPU 負載等事件。BFG28資訊網——每日最新資訊28at.com

流程圖流程圖BFG28資訊網——每日最新資訊28at.com

在對artmethod執行前后進行hook時 這里涉及到處理art方法解釋執行的三種情況。BFG28資訊網——每日最新資訊28at.com

ART Runtime 解釋器

  1. The C++ interpreter,也就是傳統的基于switch結構的解釋器,一般僅在調試環境、方法跟蹤、指令不支持或者在字節碼發生異常情況下(例如failed structured-locking verification)才走該分支。
  2. The mterp fast interpreter,核心是引入了handler table做指令映射,并通過手寫匯編以實現指令間的快速切換,提高了解釋器性能。
  3. Nterp是Mterp的再次優化。Nterp省去了managed code stacks的維護,采用了和Native方法一樣的棧幀結構,并且譯碼和翻譯執行全程都由匯編代碼實現,進一步拉進解釋器和compiled code的性能差距。

在這邊我發現了一個異常現象,就是Android 14的解釋執行居然都用的switch解釋執行方式。我又重新去測試了幾個Android 版本的解釋執行方式。Android 12走的mterp,Android 13走的是nterp,當進行調試的時候才會走到switch, 理論上Android 14應該也走nterp才對,怎么會走了最慢的switch呢。以下按順序是12、13、14版本的方法執行backtrace。BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

排查懷疑點

BFG28資訊網——每日最新資訊28at.com

開始懷疑是解釋執行導致的卡頓了,翻了下源碼 art/runtime/interpreter/mterp/nterp.cc 中確實有變動 如果是javaDebuggable 就不走nterp了。接下來嘗試去證明是是這個問題導致的。BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

isJavaDebuggable 是runtime.cc中的 RuntimeDebugState runtime_debug_state_ 中控制的。我們可以找到runtime的實例然后通過偏移量修改過runtime_debug_state_屬性,看了下源碼還可以通過_ZN3art7Runtime20SetRuntimeDebugStateENS0_17RuntimeDebugStateE 進行設置。 BFG28資訊網——每日最新資訊28at.com

void Runtime::SetRuntimeDebugState(RuntimeDebugState state) {  if (state != RuntimeDebugState::kJavaDebuggableAtInit) {    // We never change the state if we started as a debuggable runtime.    DCHECK(runtime_debug_state_ != RuntimeDebugState::kJavaDebuggableAtInit);  }  runtime_debug_state_ = state;}

我通過上述方式去進行嘗試驗證 把測試包的 isJavaDebuggable 設置為false 依然卡頓,把生產包的isJavaDebuggable設置為true,變得稍微卡了點。于是我推翻了自己解釋執行方式導致卡頓的猜想。 BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

排查native耗時

BFG28資訊網——每日最新資訊28at.com

懷疑nativie方法執行耗時, 再次嘗試用simpleperf定位問題。BFG28資訊網——每日最新資訊28at.com

結論:基本都是解釋執行代碼中的堆棧耗時,沒有其他特殊堆棧。BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

定位到DEBUG_JAVA_DEBUGGABLE

BFG28資訊網——每日最新資訊28at.com

那就想著從debuggable的源頭入手,逐步縮小范圍定位影響變量。BFG28資訊網——每日最新資訊28at.com

AndroidManifest中的debuggable影響系統system進程啟動我們進程中的一個runtimeFlags。BFG28資訊網——每日最新資訊28at.com

frameworks/base/core/java/android/os/Process.java 中的start方法 其中第6個參數就是runtimeFlags而如果是debuggableFlag runtimeFlags會被添加以下一些flag 那就先縮小標簽范圍。BFG28資訊網——每日最新資訊28at.com

if (debuggableFlag) {                runtimeFlags |= Zygote.DEBUG_ENABLE_JDWP;                runtimeFlags |= Zygote.DEBUG_ENABLE_PTRACE;                runtimeFlags |= Zygote.DEBUG_JAVA_DEBUGGABLE;                // Also turn on CheckJNI for debuggable apps. It's quite                // awkward to turn on otherwise.                runtimeFlags |= Zygote.DEBUG_ENABLE_CHECKJNI;                // Check if the developer does not want ART verification                if (android.provider.Settings.Global.getInt(mService.mContext.getContentResolver(),                        android.provider.Settings.Global.ART_VERIFIER_VERIFY_DEBUGGABLE, 1) == 0) {                    runtimeFlags |= Zygote.DISABLE_VERIFIER;                    Slog.w(TAG_PROCESSES, app + ": ART verification disabled");                }            }

需要修改我們進程的啟動參數。那就需要去hook system進程了。這邊涉及到手機root,安裝hook框架的一些操作,然后通過hook Process的start去做一些參數修改。BFG28資訊網——每日最新資訊28at.com

hookAllMethods(        Process.class,        "start",        new XC_MethodHook() {            @Override            protected void beforeHookedMethod(MethodHookParam param) throws Throwable {                final String niceName = (String) param.args[1];                final int uid = (int) param.args[2];                final int runtimeFlags = (int) param.args[5];                XposedBridge.log("process_xx " + runtimeFlags);                if (isDebuggable(niceName, user)) {                    param.args[5] = runtimeFlags&~DEBUG_JAVA_DEBUGGABLE;                    XposedBridge.log("process_xx " + param.args[5]);                }            }        });

這次還是有一些明顯的結果的。測試包 runtimeflags 移除DEBUG_JAVA_DEBUGGABLE后不卡了。而生產包包括應用市場上的應用加上DEBUG_JAVA_DEBUGGABLE標記后全部都變卡了。那就可以證明是DEBUG_JAVA_DEBUGGABLE這個變量引起的。BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

定位到DeoptimizeBootImage

BFG28資訊網——每日最新資訊28at.com

繼續源碼觀察DEBUG_JAVA_DEBUGGABLE帶來的影響。BFG28資訊網——每日最新資訊28at.com

if ((runtime_flags & DEBUG_JAVA_DEBUGGABLE) != 0) {    runtime->AddCompilerOption("--debuggable");    runtime_flags |= DEBUG_GENERATE_MINI_DEBUG_INFO;    runtime->SetRuntimeDebugState(Runtime::RuntimeDebugState::kJavaDebuggableAtInit);    {      // Deoptimize the boot image as it may be non-debuggable.      ScopedSuspendAll ssa(__FUNCTION__);      runtime->DeoptimizeBootImage();    }    runtime_flags &= ~DEBUG_JAVA_DEBUGGABLE;    needs_non_debuggable_classes = true;  }

這里有邏輯是DEBUG_JAVA_DEBUGGABLE帶來的影響點,SetRuntimeDebugState之前已經測試過了。也不是DEBUG_GENERATE_MINI_DEBUG_INFO帶來的影響,那是runtime->DeoptimizeBootImage()?于是我用debugable為false的包通過_ZN3art7Runtime19DeoptimizeBootImageEv主動去調用了DeoptimizeBootImage方法,然后復現了!BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

原因分析

BFG28資訊網——每日最新資訊28at.com

DeoptimizeBootImage 將bootImage中AOT代碼方法轉換為java可調試。重新初始化方法入口點,走到解釋執行,而不使用AOT代碼。追溯到Instrumentation::InitializeMethodsCode方法,還是到了CanUseNterp(method) CanRuntimeUseNterp這個點。也是Android 13可以用nterp,android 14只能走switch了。BFG28資訊網——每日最新資訊28at.com

我再次hook代碼,讓CanRuntimeUseNterp 直接return true, 但是還是卡。我發現即使我hook了。下面的這些方法還是走到了switch解釋執行。反過來想一想是因為我hook已經滯后了DeoptimizeBootImage已經執行了,當調用到基礎方法的時候都是switch執行了。BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

我用Android 13 debugable true的包進行測試先hook CanRuntimeUseNterp return false,然后再執行DeoptimizeBootImage,復現卡頓 。BFG28資訊網——每日最新資訊28at.com

初步定位:bootimage中的方法 Android 13走的nterp而Android 14走的switch  bootimage里面的方法特別基礎和零碎所以導致方法switch執行耗時嚴重。BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

驗證是系統問題

BFG28資訊網——每日最新資訊28at.com

如果是系統問題,那大家都應該遇到的,不只我們App有這個問題, 于是我找到了幾個小伙伴幫忙驗證debug包這個問題。果然都有這個問題,同一個包安裝在Android 14 和 Android 13上體驗完全不一致。BFG28資訊網——每日最新資訊28at.com

1反饋問題

BFG28資訊網——每日最新資訊28at.com

在issuetracker上已經有人反饋android 14 debug包慢了 https://issuetracker.google.com/issues/311251587。但是還沒有結果,于是我補上了我定位到的問題。BFG28資訊網——每日最新資訊28at.com

圖片圖片BFG28資訊網——每日最新資訊28at.com

順便也提了個issue https://issuetracker.google.com/issues/328477628BFG28資訊網——每日最新資訊28at.com

三、臨時解決

在等Google回復的同時,也同時在思考App層可以有什么辦法去規避這個問題,讓debug包的體驗也回歸絲滑,比如如何去重新optimize bootimage中的方法。抱著這個想法又去學習了一下art的代碼,發現Android 14新增了一個UpdateEntrypointsForDebuggable方法,這個方法會去按照規則重新設置方法的執行方式比如aot和nterp,那我在這之前把CanRuntimeUseNterp hook了返回true 再去調用UpdateEntrypointsForDebuggable不就會重新走到nterp了嗎。  BFG28資訊網——每日最新資訊28at.com

void Instrumentation::UpdateEntrypointsForDebuggable() {  Runtime* runtime = Runtime::Current();  // If we are transitioning from non-debuggable to debuggable, we patch  // entry points of methods to remove any aot / JITed entry points.  InstallStubsClassVisitor visitor(this);  runtime->GetClassLinker()->VisitClasses(&visitor);}

按照上面的思路嘗試了一波,果然變得流暢很多!!!BFG28資訊網——每日最新資訊28at.com

其實上面的解決方案還有遺留問題。對比debugable為false的包還是有些卡頓。我也發現了bootImage中的方法已經走到nterp上了,但是apk中的大部分代碼還是走到了switch解釋執行上,于是我改變思路。我在調用UpdateEntrypointsForDebuggable前先把RuntimeDebugState設置成非debugable,調用之后再把RuntimeDebugState設置會debugable不就行了嗎。最后的代碼如下,hook框架使用了https://github.com/bytedance/android-inline-hook。BFG28資訊網——每日最新資訊28at.com

Java_test_ArtMethodTrace_bootImageNterp(JNIEnv *env,                                                      jclass clazz) {    void *handler = shadowhook_dlopen("libart.so");    instance_ = static_cast<void **>(shadowhook_dlsym(handler, "_ZN3art7Runtime9instance_E"));    jobject    (*getSystemThreadGroup)(void *runtime) =(jobject (*)(void *runtime)) shadowhook_dlsym(handler,                                                                                          "_ZNK3art7Runtime20GetSystemThreadGroupEv");    void    (*UpdateEntrypointsForDebuggable)(void *instrumentation) = (void (*)(void *i)) shadowhook_dlsym(            handler,            "_ZN3art15instrumentation15Instrumentation30UpdateEntrypointsForDebuggableEv");    if (getSystemThreadGroup == nullptr || UpdateEntrypointsForDebuggable == nullptr) {        LOGE("getSystemThreadGroup  failed ");        shadowhook_dlclose(handler);        return;    }    jobject thread_group = getSystemThreadGroup(*instance_);    int vm_offset = findOffset(*instance_, 0, 4000, thread_group);    if (vm_offset < 0) {        LOGE("vm_offset not found ");        shadowhook_dlclose(handler);        return;    }    void (*setRuntimeDebugState)(void *instance_, int r) =(void (*)(void *runtime,                                                                    int r)) shadowhook_dlsym(            handler, "_ZN3art7Runtime20SetRuntimeDebugStateENS0_17RuntimeDebugStateE");    if (setRuntimeDebugState != nullptr) {        setRuntimeDebugState(*instance_, 0);    }    void *instrumentation = reinterpret_cast<void *>(reinterpret_cast<char *>(*instance_) +                                                     vm_offset - 368 );    UpdateEntrypointsForDebuggable(instrumentation);    setRuntimeDebugState(*instance_, 2);    shadowhook_dlclose(handler);    LOGE("bootImageNterp success");}

BFG28資訊網——每日最新資訊28at.com

四、最后

最近在社區上也看到了高通工程師的一篇文章,他在我定位到的問題的基礎上做了更詳細的分析,確認了Google會在Android 15上修復這個問題,如果是海外版本的Android 14設備,Google計劃通過com.android.artapex模塊的更新來修復這個問題。但是國內由于網絡的問題,Google的推送無法工作,因此需要各個手機廠家來主動合入這兩筆改動。[1]BFG28資訊網——每日最新資訊28at.com

如果大家需要臨時解決debugable包的卡頓的問題也可以通過上述方式解決。 BFG28資訊網——每日最新資訊28at.com

BFG28資訊網——每日最新資訊28at.com

參考文章:BFG28資訊網——每日最新資訊28at.com

[1] https://juejin.cn/post/7353106089296789556BFG28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-83784-0.html你的debug包在Android 14變卡了嗎

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 詳解@Stomp/Stompjs在Vue3中的應用與實踐

下一篇: 通過JS獲取你當前的網絡狀況?建議大家學一學~

標簽:
  • 熱門焦點
  • 5月iOS設備性能榜:M1 M2依舊是榜單前五

    和上個月一樣,沒有新品發布的iOS設備性能榜的上榜設備并沒有什么更替,僅僅只有跑分變化而產生的排名變動,剛剛開始的蘋果WWDC2023,推出的產品也依舊是新款Mac Pro、新款Mac Stu
  • 太卷!Redmi MAX 100英寸電視便宜了:12999元買Redmi史上最大屏

    8月5日消息,從小米商城了解到,Redmi MAX 100英寸巨屏電視日前迎來官方優惠,到手價12999元,比發布價便宜了7000元,在大屏電視市場開卷。據了解,Redmi MAX 100
  • 六大權益!華為8月服務日開啟:手機免費貼膜、維修免人工費

    8月5日消息,一年一度的華為開發者大會2023(Together)日前在松山湖拉開帷幕,與此同時,華為8月服務日也式開啟,到店可享六大專屬權益。華為用戶可在華為商城Ap
  • 2023 年的 Node.js 生態系統

    隨著技術的不斷演進和創新,Node.js 在 2023 年達到了一個新的高度。Node.js 擁有一個龐大的生態系統,可以幫助開發人員更快地實現復雜的應用。本文就來看看 Node.js 最新的生
  • K8S | Service服務發現

    一、背景在微服務架構中,這里以開發環境「Dev」為基礎來描述,在K8S集群中通常會開放:路由網關、注冊中心、配置中心等相關服務,可以被集群外部訪問;圖片對于測試「Tes」環境或者
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態LT(ID:LingTai_LT)2023年,出海市場戰況空前,中國創業者在海外紛紛摩拳擦掌,以期能夠把中國的商業模式、創業理念、戰略打法輸出海外,他們依
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 2021中國國際消費電子博覽會與青島國際軟件融合創新博覽會新聞發布會隆重舉行

    9月18日,2021中國國際消費電子博覽會與青島國際軟件融合創新博覽會新聞發布會在青島國際新聞中心隆重舉行。發布會上青島市政府領導聯袂出席,對本次雙展會情
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲激情六月丁香| 国产精品亚洲网站| 欧美成人免费va影院高清| 麻豆av福利av久久av| 欧美精品123区| 国产精品视区| 亚洲成人影音| 亚洲天堂免费在线观看视频| 欧美一级欧美一级在线播放| 麻豆久久婷婷| 欧美日韩91| 国产日产欧美精品| 亚洲经典自拍| 亚洲免费一在线| 米奇777超碰欧美日韩亚洲| 欧美日韩国产丝袜另类| 国产麻豆午夜三级精品| 91久久极品少妇xxxxⅹ软件| 亚洲欧美bt| 久久中文字幕一区| 国产精品免费视频xxxx| 亚洲国产成人av| 午夜国产精品影院在线观看| 欧美aaaaaaaa牛牛影院| 国产精品揄拍500视频| 亚洲国产婷婷| 亚欧美中日韩视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品久久久久久久久久久久| 伊人久久大香线| 亚洲愉拍自拍另类高清精品| 欧美成人小视频| 国产一区二区在线免费观看| 一区二区国产精品| 久久综合网络一区二区| 国产精品永久免费在线| 夜夜狂射影院欧美极品| 狂野欧美性猛交xxxx巴西| 国产精品免费在线| 日韩天堂在线观看| 久热精品在线视频| 国产亚洲a∨片在线观看| 宅男精品视频| 欧美激情精品久久久久久变态| 国产日韩欧美综合在线| 亚洲天堂成人在线观看| 欧美日本一区二区三区| 亚洲第一黄网| 欧美自拍偷拍| 国产精品国产三级国产专播精品人| 亚洲国产裸拍裸体视频在线观看乱了| 欧美专区中文字幕| 国产精品私人影院| 亚洲视频图片小说| 欧美日韩一卡二卡| 亚洲精品乱码久久久久久黑人| 久久久亚洲一区| 国产午夜亚洲精品理论片色戒| 亚洲一区二区影院| 欧美日韩午夜激情| 亚洲精品日产精品乱码不卡| 久久综合久久综合这里只有精品| 国产香蕉97碰碰久久人人| 午夜精品久久久久久99热软件| 欧美日韩三级视频| 亚洲精品日日夜夜| 美女免费视频一区| 在线看片成人| 久久男人资源视频| 国产主播喷水一区二区| 欧美一二三区精品| 国产乱码精品1区2区3区| 亚洲性视频网址| 国产精品99免费看 | 亚洲精品久久久久| 久久午夜视频| 一区二区在线观看av| 久久久午夜精品| 国内自拍一区| 久久亚洲美女| 在线观看视频日韩| 欧美11—12娇小xxxx| 亚洲国产精品123| 男女视频一区二区| 亚洲激情一区| 欧美全黄视频| 亚洲天堂av电影| 国产精品久久久久一区二区| 亚洲你懂的在线视频| 国产精品系列在线| 欧美在线视频观看免费网站| 国产一区二区三区在线观看视频| 性感少妇一区| 国产一区欧美日韩| 免费成人高清视频| 亚洲精品国产无天堂网2021| 欧美日韩另类国产亚洲欧美一级| 一区二区三区精密机械公司 | 亚洲黄色免费网站| 欧美精品免费看| 一区二区三区免费在线观看| 欧美午夜在线| 欧美在线亚洲一区| 在线看一区二区| 欧美精品情趣视频| 亚洲女同在线| 在线播放不卡| 欧美精品精品一区| 亚洲一区二区三区在线视频| 国产一区二区三区四区五区美女| 久久亚洲欧洲| 日韩一级裸体免费视频| 国产精品盗摄久久久| 性色av一区二区三区在线观看| 狠狠做深爱婷婷久久综合一区 | 中文欧美字幕免费| 国产香蕉97碰碰久久人人| 麻豆精品一区二区综合av | 欧美在线免费| 91久久久久久久久久久久久| 欧美日韩综合在线| 欧美一区二区在线| 亚洲国产精品毛片| 国产精品成av人在线视午夜片| 欧美中文字幕视频| 亚洲国产天堂久久国产91| 欧美午夜一区二区三区免费大片| 欧美在线资源| 亚洲人成网站影音先锋播放| 国产精品久久久| 久久久中精品2020中文| 日韩一级大片在线| 国内精品一区二区三区| 欧美日韩精品免费 | 欧美日韩成人激情| 欧美一级午夜免费电影| 91久久极品少妇xxxxⅹ软件| 国产精品视频免费| 蜜臀久久99精品久久久久久9| aa日韩免费精品视频一| 国产综合色在线| 欧美日韩免费观看一区二区三区 | 久久久久国产精品一区二区| 在线视频精品一| 在线播放视频一区| 国产精品日韩欧美综合| 欧美成人午夜视频| 性色av一区二区三区| 日韩一级精品视频在线观看| 一区二区三区在线免费播放| 国产精品黄页免费高清在线观看| 久久婷婷蜜乳一本欲蜜臀| 亚洲午夜黄色| 亚洲精品久久久久久久久久久| 国产亚洲aⅴaaaaaa毛片| 欧美日韩日韩| 免费亚洲视频| 久久国产88| 亚洲在线观看免费视频| 亚洲精品少妇| 一区视频在线播放| 国产精品综合| 欧美日韩精品一区二区天天拍小说| 久久久久久伊人| 午夜精品亚洲| 一区二区三区日韩精品视频| 亚洲国产精品电影在线观看| 国产亚洲一区二区精品| 国产精品劲爆视频| 欧美日韩国内| 欧美xxxx在线观看| 久久久999精品免费| 亚洲在线网站| 中文在线资源观看视频网站免费不卡| 亚洲欧洲日韩综合二区| 伊人色综合久久天天| 狠狠久久五月精品中文字幕| 国产欧美日韩精品一区| 国产精品久久二区| 欧美在线观看一区二区三区| 亚洲视频一区在线观看| 日韩视频三区| 亚洲麻豆一区| 91久久久精品| 亚洲国语精品自产拍在线观看| 在线欧美福利| 在线观看欧美日韩国产| 狠狠爱综合网| 狠狠色丁香久久婷婷综合丁香 | 亚洲日本aⅴ片在线观看香蕉| 1000部国产精品成人观看| 国内视频精品| 国模大胆一区二区三区| 国产一区二区视频在线观看| 国产欧美一区二区三区久久人妖| 国产精品日日摸夜夜摸av| 国产精品久久久久久久久婷婷| 国产精品久久久久久久电影| 国产精品久久久久77777| 国产精品久久久久久户外露出| 国产精品卡一卡二| 国产精品色一区二区三区| 国产美女高潮久久白浆| 国产日韩精品一区二区三区|