精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

你的debug包在Android 14變卡了嗎

開發 前端
DeoptimizeBootImage 將bootImage中AOT代碼方法轉換為java可調試。重新初始化方法入口點,走到解釋執行,而不使用AOT代碼。

一、背景

我的App怎么這么卡,誰在代碼里下毒了!

有一天突然發現debug包運行變的特別卡頓,經過下面的簡單測試發現debug包在Android 14上出了問題。 

圖片圖片

二、問題排查紀錄

常規手段排查

使用了systrace以及內部的debug包 trace工具dutrace進行排查。

結論:CPU空閑,主線程無明顯阻塞,看上去就是純方法執行耗時。

發現懷疑點

第一步排查過程中沒有特別大的收獲,但是我用dutrace工具排查時發現了一個異常現象。這里簡單介紹一下dutrace的實現原理:

dutrace是利用inline hook在artmethod的執行前后加上atrace的點再通過perfetto ui工具展示。有以下優點:

    1. 支持線下分析函數執行流程,函數耗時。

    2. 在分析函數調用流程下:

        a. 可以查看整個過程的函數調用(包括framework函數);

        b. 能夠指定監控的函數和線程有效過濾無用trace;

        c. 動態配置不需要重新打包。

    3. 可使用現成的UI分析工具,有系統關鍵線程的函數調用,例如渲染耗時、線程鎖,GC 耗時等,還有 I/O 操作、CPU 負載等事件。

流程圖流程圖

在對artmethod執行前后進行hook時 這里涉及到處理art方法解釋執行的三種情況。

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。

圖片圖片

圖片圖片

圖片圖片

排查懷疑點

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

圖片圖片

圖片圖片

isJavaDebuggable 是runtime.cc中的 RuntimeDebugState runtime_debug_state_ 中控制的。我們可以找到runtime的實例然后通過偏移量修改過runtime_debug_state_屬性,看了下源碼還可以通過_ZN3art7Runtime20SetRuntimeDebugStateENS0_17RuntimeDebugStateE 進行設置。 

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,變得稍微卡了點。于是我推翻了自己解釋執行方式導致卡頓的猜想。 

排查native耗時

懷疑nativie方法執行耗時, 再次嘗試用simpleperf定位問題。

結論:基本都是解釋執行代碼中的堆棧耗時,沒有其他特殊堆棧。

圖片圖片

定位到DEBUG_JAVA_DEBUGGABLE

那就想著從debuggable的源頭入手,逐步縮小范圍定位影響變量。

AndroidManifest中的debuggable影響系統system進程啟動我們進程中的一個runtimeFlags。

frameworks/base/core/java/android/os/Process.java 中的start方法 其中第6個參數就是runtimeFlags而如果是debuggableFlag runtimeFlags會被添加以下一些flag 那就先縮小標簽范圍。

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去做一些參數修改。

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這個變量引起的。

定位到DeoptimizeBootImage

繼續源碼觀察DEBUG_JAVA_DEBUGGABLE帶來的影響。

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方法,然后復現了!

原因分析

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

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

圖片圖片

我用Android 13 debugable true的包進行測試先hook CanRuntimeUseNterp return false,然后再執行DeoptimizeBootImage,復現卡頓 。

初步定位:bootimage中的方法 Android 13走的nterp而Android 14走的switch  bootimage里面的方法特別基礎和零碎所以導致方法switch執行耗時嚴重。

驗證是系統問題

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

1反饋問題

在issuetracker上已經有人反饋android 14 debug包慢了 https://issuetracker.google.com/issues/311251587。但是還沒有結果,于是我補上了我定位到的問題。

圖片圖片

順便也提了個issue https://issuetracker.google.com/issues/328477628

三、臨時解決

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

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);
}

按照上面的思路嘗試了一波,果然變得流暢很多!!!

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

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");


}

四、最后

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

如果大家需要臨時解決debugable包的卡頓的問題也可以通過上述方式解決。 

參考文章:

[1] https://juejin.cn/post/7353106089296789556

責任編輯:武曉燕 來源: 得物技術
相關推薦

2021-10-10 20:36:49

Android Root權限

2024-05-30 12:50:54

2023-10-26 12:00:28

Python答題卡識別

2021-12-30 09:39:28

Android 12App開發者

2020-03-20 19:10:37

支付寶新版移動應用

2011-08-15 13:48:52

大話ITiOSAndroid

2023-05-09 09:04:29

代碼設計語言

2022-04-22 17:07:02

源代碼開源代碼泄漏

2009-03-26 18:09:06

2012-01-13 13:05:41

Scale Out網絡

2023-10-28 09:41:12

Next.js函數配置選項

2020-09-18 11:00:18

IT預算IT支出領導人

2014-02-17 10:54:13

PostgreSQL數據庫

2022-07-08 09:27:48

CSSIFC模型

2022-04-07 11:15:22

PulseEventAPI函數

2024-02-02 11:03:11

React數據Ref

2015-05-18 10:48:23

InforERP

2022-11-08 08:45:30

Prettier代碼格式化工具

2012-09-03 17:21:02

大數據
點贊
收藏

51CTO技術棧公眾號

国产日本在线| 一级黄色大片免费| 欧美精品第一区| 欧美亚洲综合久久| 熟女视频一区二区三区| 香蕉av在线播放| 精品一区免费av| 68精品国产免费久久久久久婷婷 | 欧美三级电影网址| 亚洲午夜电影在线| 日韩久久久久久久| 女人18毛片一区二区三区| 日本强好片久久久久久aaa| 欧美极品在线播放| 疯狂撞击丝袜人妻| 久久不见久久见免费视频7| 日韩欧美精品在线| 天天干天天爽天天射| 黄色在线网站噜噜噜| 国产精品国产三级国产有无不卡| 久久久久免费网| 国产成人三级一区二区在线观看一| 亚洲综合三区| 欧美精品电影免费在线观看| 日本成人精品视频| 精品日韩欧美一区| 日韩禁在线播放| 韩国三级在线看| 狂野欧美性猛交xxxx| 色综合久久中文字幕综合网| 99在线观看视频免费| 欧美日韩视频在线播放| 国产欧美一区二区三区在线看蜜臀| 国产精品一区视频| 亚洲综合免费视频| 免费在线一区观看| 国产精品第100页| 国产在线观看黄色| 一本色道久久综合亚洲精品高清 | 色撸撸在线观看| 国产黄色片在线观看| 99久久久国产精品| 国产精品日韩高清| 国产 欧美 精品| 国产91精品欧美| 99九九视频| 精品国产伦一区二区三区| 久久er99热精品一区二区| 国产精品入口免费视频一| 免费视频网站在线观看入口| 天堂成人国产精品一区| 国产成一区二区| 老熟妇一区二区三区| 日韩精品三区四区| 国产精品久久久精品| 特级西西444www高清大视频| 免费人成精品欧美精品| 国产精品久久久av| 97超碰人人模人人人爽人人爱| 免费在线观看视频一区| 成人有码在线播放| www.xxx国产| 成a人片亚洲日本久久| 久久久久久亚洲精品不卡4k岛国| 青草久久伊人| 国产精品丝袜一区| 中文字幕日韩精品一区二区| 成年人网站在线| 一区二区不卡在线视频 午夜欧美不卡在| 欧美少妇一区二区三区| 欧美v亚洲v| 欧美日韩亚洲一区二| 少妇性l交大片| 欧美一级做a| 日韩欧美高清一区| 日韩 中文字幕| 欧美日韩有码| 欧美黑人性视频| 日韩特级黄色片| 秋霞成人午夜伦在线观看| 国产在线精品播放| 东京干手机福利视频| 91在线视频18| 亚洲日本一区二区三区在线不卡| 国产精品一卡二卡三卡| 亚洲国产视频一区| 日韩欧美xxxx| 国产在线视频欧美一区| 亚洲成人中文字幕| 国产精品av久久久久久无| 亚洲一区二区| 奇米成人av国产一区二区三区| 伊人成人在线观看| 播五月开心婷婷综合| 日韩资源av在线| 直接在线观看的三级网址| 欧美性20hd另类| 美女被艹视频网站| 自拍偷拍一区| 欧美日韩第一视频| 亚洲高清在线看| 高清成人免费视频| 亚洲欧美电影在线观看| caoporn-草棚在线视频最| 欧美丝袜第三区| 捆绑裸体绳奴bdsm亚洲| 五月天久久久| 国产精品高清在线观看| 四虎在线视频免费观看| 亚洲人妖av一区二区| 中文字幕日本最新乱码视频| 免费一区二区三区在线视频| 国产亚洲精品va在线观看| 国产在线综合网| 狠狠色丁香婷婷综合久久片| 欧美激情论坛| 97人澡人人添人人爽欧美| 欧美电影在线免费观看| 在线免费看黄视频| 一本不卡影院| 国产伦精品一区二区三| 成年视频在线观看| 欧美精品日韩精品| 我不卡一区二区| 欧美亚洲一区二区三区| 国产伦视频一区二区三区| 91香蕉在线观看| 51午夜精品国产| 能直接看的av| 日韩激情视频网站| 欧美视频观看一区| 中文字幕乱码中文乱码51精品 | 男人天堂资源在线| 婷婷激情综合网| 国产一级免费片| 合欧美一区二区三区| 97视频热人人精品| 中文字幕在线观看网站| 在线成人免费视频| 秋霞欧美一区二区三区视频免费| 喷白浆一区二区| 台湾成人av| 欧美jizz18| 日韩亚洲欧美中文在线| 97人妻精品视频一区| 国产喷白浆一区二区三区| 国产免费视频传媒| 欧美色图激情小说| 国产精品视频免费在线观看| 在线视频婷婷| 91麻豆精品国产自产在线观看一区| 午夜国产福利视频| 国产一区在线观看麻豆| 强伦女教师2:伦理在线观看| 精品国产一区二区三区2021| 久久99久久久久久久噜噜| а√天堂资源在线| 亚洲大尺度视频在线观看| 涩视频在线观看| 在线午夜精品| 日产精品一线二线三线芒果| av成人在线播放| 久久综合免费视频影院| www.欧美国产| 富二代精品短视频| 久久久久久国产免费a片| 久久精品99国产精品| 好色先生视频污| 黄色欧美在线| 国产精品精品一区二区三区午夜版| av电影在线网| 日韩欧美一二区| 日本三级一区二区| 国产日韩欧美麻豆| ass极品水嫩小美女ass| 亚洲日本黄色| 小说区图片区图片区另类灬| 欧美区一区二区| 欧美亚洲国产另类| 黄网页在线观看| 精品精品国产高清一毛片一天堂| 五月婷婷色丁香| 亚洲色图视频免费播放| 最近日本中文字幕| 麻豆一区二区三| 欧美精品久久久久久久自慰| 欧洲毛片在线视频免费观看| 亚洲专区在线视频| 色综合亚洲图丝熟| 久久久999精品免费| 亚州av在线播放| 欧美精品久久99久久在免费线| 欧美三日本三级少妇99| 成人免费小视频| 色无极影院亚洲| 国产经典欧美精品| 日本爱爱免费视频| 在线国产精品一区| 一区二区不卡在线| 日韩精品亚洲aⅴ在线影院| 国产中文字幕91| 成人爱爱网址| 国模吧一区二区三区| 日本中文字幕在线播放| 精品一区电影国产| 性生交生活影碟片| 欧美日韩高清一区| 丁香六月婷婷综合| 亚洲一区免费视频| 日韩成人短视频| 日本一区二区三区四区| 欧美大片免费播放器| 国产美女精品一区二区三区| 狠狠热免费视频| 一区二区三区精品视频在线观看| 成人在线免费高清视频| 日韩在线视频精品| 日本不卡免费新一二三区| 精品三级av| 成人高清在线观看| 国产欧美日韩电影| 成人免费在线视频网站| 成人在线黄色| 日韩美女激情视频| 韩国美女久久| 91成品人片a无限观看| 丁香花电影在线观看完整版| 欧美日韩电影在线观看| 69xxx在线| 免费99精品国产自在在线| 欧美13一16娇小xxxx| 中文国产亚洲喷潮| 自拍视频在线播放| 欲色天天网综合久久| 福利片在线看| 亚洲图片欧美午夜| 男女视频在线观看| 亚洲男人的天堂在线| 深夜福利在线观看直播| 亚洲精品久久久久中文字幕欢迎你 | 好吊妞视频一区二区三区| 性久久久久久久| 国产欧美日韩另类| 欧美日韩亚洲成人| 六月丁香婷婷综合| 91精品福利在线| www.久久网| 欧美日韩亚州综合| 一级黄色免费看| 日韩视频免费观看高清完整版在线观看| 国产精品高潮呻吟av| 91精品国产欧美一区二区18| 国产日韩欧美中文字幕 | 天天爱天天干天天操| 日韩精品视频免费在线观看| 四虎电影院在线观看| 亚洲成人性视频| 欧美日韩视频精品二区| 一本色道久久88精品综合| √天堂资源地址在线官网| 日韩在线中文字幕| 中文在线观看免费| 98精品国产自产在线观看| 美女100%一区| 国产精品视频999| 欧美激情精品| 精品不卡在线| 成人看的视频| 亚洲色图都市激情| 99精品视频免费观看视频| 日韩手机在线观看视频| 久久91精品国产91久久小草| 亚洲黄色小说在线观看| 91热门视频在线观看| 91社区视频在线观看| 亚洲免费视频中文字幕| 日韩精品手机在线| 欧美日韩亚洲综合一区二区三区| 99精品在线视频观看| 日韩理论片久久| caoporn97在线视频| 欧美亚洲国产日韩2020| 96视频在线观看欧美| 狠狠色综合一区二区| 不卡在线一区| 人人干视频在线| 久久精品国产77777蜜臀| 成人区人妻精品一区二| 国产精品卡一卡二卡三| 日韩激情一区二区三区| 欧美日韩国产成人在线91| 婷婷开心激情网| 久久精品久久久久电影| 中文字幕在线高清| 91九色视频在线观看| 精品国产乱码久久久久久1区2匹| 国产 欧美 日本| 奇米777欧美一区二区| 国产二级一片内射视频播放| 国产精品国产精品国产专区不蜜 | 欧美日韩视频在线观看一区二区三区 | 日日夜夜天天综合| 国产chinese精品一区二区| 日韩在线理论| 亚洲中文字幕久久精品无码喷水| 成人免费视频国产在线观看| 亚洲一区 欧美| 好吊成人免视频| 丰满肉肉bbwwbbww| 久久久91精品国产| 天然素人一区二区视频| 精品视频一区二区| 欧美日本一区二区视频在线观看| 婷婷丁香激情网| 91视频免费看| 亚洲精品在线观看av| 欧美一卡2卡三卡4卡5免费| a黄色在线观看| 日韩av色在线| 天天躁日日躁成人字幕aⅴ| 免费看日b视频| 国产在线精品一区二区夜色| 日本在线观看网址| 在线观看网站黄不卡| 欧美高清成人| 欧美野外猛男的大粗鳮| 精品国产乱子伦一区二区| 久久久久福利视频| 国产老妇另类xxxxx| 国产精品免费久久久| 国产精品揄拍100视频| 丝袜美腿av在线| 亚洲少妇中文在线| 韩国成人二区| 国产区日韩欧美| 欧美午夜在线| 国产吃瓜黑料一区二区| 亚洲视频一区在线| 国产又粗又猛又色又| 日韩在线免费av| 欧洲亚洲精品久久久久| 一级日韩一区在线观看| 蜜乳av一区二区| 欧美成人久久久免费播放| 欧美亚洲一区三区| 国产永久av在线| 国产精品av免费在线观看| 国产免费播放一区二区| 999精品视频在线| 国产精品色噜噜| 自拍偷拍精品视频| 色综合亚洲精品激情狠狠| 4438五月综合| 8x8ⅹ国产精品一区二区二区| 国产传媒欧美日韩成人| 国产一卡二卡在线播放| 亚洲精品国产综合久久| 在线最新版中文在线| 日韩欧美一区二区视频在线播放| 日韩有码一区二区三区| 日本在线观看网址| 欧美一区二区三区四区高清| 香蕉成人app免费看片| 国产一区二区精品免费| 亚洲欧美清纯在线制服| 91精品国自产在线| 91精品一区二区三区在线观看| 中文字幕在线三区| 精品亚洲一区二区三区四区五区高| 久久av在线| 神马久久精品综合| 亚洲精品一线二线三线| 亚洲成av在线| 色乱码一区二区三区熟女| 成人教育av在线| 欧美日韩综合一区二区三区| www.欧美精品一二三区| av在线亚洲色图| 88av.com| 亚洲主播在线观看| 国外av在线| 99re视频| 视频一区免费在线观看| 黄色一级大片在线免费观看| 亚洲高清不卡av| 成人国产激情在线| 日韩黄色短视频| 亚洲国产精品成人综合 | 欧美日韩成人一区二区三区| 麻豆国产精品一区二区三区| 久久久久久福利| 国产亚洲欧美日韩美女| 日韩在线网址| 91av俱乐部| 亚洲高清中文字幕| 在线观看黄av| 看高清中日韩色视频| 国产在线不卡一卡二卡三卡四卡| 在线观看亚洲欧美| 欧美床上激情在线观看|