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

OpenHarmony 源碼解析之DFX子系統-Hiview(上)

開發 開發工具
DFX(Design for X)子系統是為了提升軟件質量設計的工具集,目前包含的內容主要有:DFR(Design for Reliability,可靠性)和DFT(Design for Testability,可測試性)特性。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

1 簡介

DFX(Design for X)子系統是為了提升軟件質量設計的工具集,目前包含的內容主要有:DFR(Design for Reliability,可靠性)和DFT(Design for Testability,可測試性)特性。

已實現以下功能:

  • HiLog:流水日志。
  • HiSysEvent:系統事件記錄接口。
  • HiView:插件平臺。
  • FaultLoggerd:應用故障訂閱和收集。
  • HiAppEvent: js應用事件記錄接口。

1.1 OpenHarmony架構圖

OpenHarmony 源碼解析之DFX子系統-Hiview(上)-鴻蒙HarmonyOS技術社區

1.2 Hiview簡介

Hiview是一個跨平臺的終端設備維測服務集。目前開源部分僅包含插件管理平臺和系統事件源。

Hiview架構圖如下:

OpenHarmony 源碼解析之DFX子系統-Hiview(上)-鴻蒙HarmonyOS技術社區

Hiview由框架和插件組成,分別為:

  • 操作系統適配層(adapter),對使用的系統服務的接口進行適配。
  • Hiview基礎定義(hiview base),包括插件基類、管道的定義,事件、事件隊列定義以及一些工具類。
  • Hiview的核心模塊(hiview core),包括插件配置,插件管理以及事件源。
  • Hiview服務(hiview services),目前僅包括hiview運行信息dump功能。
  • Hiview插件(plugins),為獨立功能的業務模塊。
  • Hiview維測服務是由事件驅動的,其核心為分布在系統各處的HiSysEvent樁點。

格式化的事件通過HiSysEvent API上報至hiview進行處理,如下圖:

OpenHarmony 源碼解析之DFX子系統-Hiview(上)-鴻蒙HarmonyOS技術社區
  • 應用框架、系統服務使用HiSysEvent組件上報系統事件。
  • Hiview中SysEventSource獲取消息,解析并組裝成管道事件分發給插件處理。

1.3 Hiview代碼目錄

  1. /base/hiviewdfx/hiview. 
  2. ├── adapter             #平臺適配 
  3. │   ├── service        #服務適配 
  4. │   └── system_service #系統接口適配 
  5. ├── base                #模塊定義,工具類 
  6. │   └── utility 
  7. ├── build               #編譯腳本 
  8. ├── core                #插件管理核心代碼 
  9. ├── include             #公共定義 
  10. ├── plugins             #插件 
  11. ├── service             #HiviewService服務 
  12. └── utility             #工具類 

2 源碼分析

本文主要分析hiview插件管理平臺的初始化,和事件處理流程。

hiview是個常駐服務,在開機階段啟動。

base/hiviewdfx/hiview/service/config/hiview.cfg定義如下

  1.     "jobs" : [{ 
  2.             "name" : "post-fs-data"
  3.             "cmds" : [ 
  4.                 "mkdir /data/log/ 0770 system log"
  5.                 "mkdir /data/log/faultlog/ 0770 system system"
  6.                 "mkdir /data/log/faultlog/temp/ 0770 system system"
  7.                 "mkdir /data/log/faultlog/faultlogger/ 0770 system system"
  8.                 "start hiview" 
  9.             ] 
  10.         } 
  11.     ], 
  12.     "services" : [{ 
  13.             "name" : "hiview"
  14.             "path" : ["/system/bin/hiview"], 
  15.             "uid" : "system"
  16.             "gid" : ["system""log"], 
  17.             "writepid" : [ 
  18.                 "/dev/cpuset/system-background/tasks" 
  19.             ], 
  20.             "socket" : [ 
  21.                 "hisysevent dgram 0666 root system passcred" 
  22.             ] 
  23.         } 
  24.     ] 

2.1 初始化

hiview的入口函數定義在base/hiviewdfx/hiview/main.cpp中

  1. int main(int argc __UNUSED, char* argv[] __UNUSED) 
  2.     auto& hiview = OHOS::HiviewDFX::HiviewPlatform::GetInstance(); 
  3.     // process cmdline 
  4.     hiview.ProcessArgsRequest(argc, argv); 
  5.  
  6.     // 初始化環境,主要解析配置文件,加載插件 
  7.     if (!hiview.InitEnvironment()) { 
  8.         HIVIEW_LOGW("Fail to init plugin environment. exit"); 
  9.         return -1; 
  10.     } 
  11.  
  12.     // 啟動HiviewService服務,該服務提供了hiview運行信息dump功能 
  13.     auto hiviewService = std::make_unique<OHOS::HiviewDFX::HiviewService>(); 
  14.     hiviewService->StartService(); 
  15.     return 0; 

 HiviewPlatform::InitEnvironment()函數實現如下:

  1. bool HiviewPlatform::InitEnvironment(const std::string& defaultDir, const std::string& cloudUpdateDir, 
  2.                                      const std::string& workDir, const std::string& persistDir) 
  3.     // 創建工作目錄,目前目錄名使用了默認的空字符串,所以并未實際創建工作目錄 
  4.     ValidateAndCreateDirectories(defaultDir, cloudUpdateDir, workDir, persistDir); 
  5.  
  6.     // update beta config 
  7.     UpdateBetaConfigIfNeed(); 
  8.  
  9.     // check whether hiview is already started 
  10.     ExitHiviewIfNeed(); 
  11.  
  12.     // 解析"/system/etc/hiview/plugin_config"插件配置文件 
  13.     std::string cfgPath = GetPluginConfigPath(); 
  14.     PluginConfig config(cfgPath); 
  15.     if (!config.StartParse()) { //...........注[1] 
  16.         HIVIEW_LOGE("Fail to parse plugin config. exit!"); 
  17.         return false
  18.     } 
  19.     // 啟動插件管理平臺消息隊列 
  20.     StartPlatformDispatchQueue(); 
  21.  
  22.     // init global context helper, remove in the future 
  23.     HiviewGlobal::CreateInstance(static_cast<HiviewContext&>(*this)); 
  24.     //加載插件 
  25.     LoadBusinessPlugin(config); 
  26.  
  27.     isReady_ = true
  28.     NotifyPluginReady(); 
  29.     return true

注[1]處PluginConfig::StartParse()函數會按照特定規則去解析插件配置文件:

  1. if (field == "plugins") { 
  2.        ParsePlugin(strTmp); 
  3.    } else if (field == "pipelines") { 
  4.        ParsePipeline(strTmp); 
  5.    } else if (field == "pipelinegroups") { 
  6.        ParsePipelineGroup(strTmp); 
  7.    } 

 目前使用的插件配置文件/system/etc/hiview/plugin_config內容如下:

  1. plugins:3 
  2. SysEventSource[thread:sysevent_source]:0 static 
  3. Faultlogger[]:0 static 
  4. SysEventService[thread:sysevent_service]:0 static 
  5. pipelines:1 
  6. SysEventPipeline:SysEventService Faultlogger 
  7. pipelinegroups:1 
  8. SysEventSource:SysEventPipeline 

 注:base/hiviewdfx/hiview/plugins 下有eventlogger eventservice faultlogger freeze_detector hicollie_collector五個插件目錄,而目前插件配置文件里實際只用到了Faultlogger和SysEventService。

PluginConfig::StartParse()解析完之后會把相關信息保存到列表中。類圖如下:

OpenHarmony 源碼解析之DFX子系統-Hiview(上)-鴻蒙HarmonyOS技術社區

PluginConfig::ParsePipelineGroup()代碼如下

  1. void PluginConfig::ParsePipelineGroup(const std::string& pipelineGroup) 
  2.     std::smatch result; 
  3.     // EventSourceExample:FromTwo2Three FromThree2Two 
  4.     if (!regex_search(pipelineGroup, result, std::regex("(\\S+)\\s*:(.+)"))) { 
  5.         HIVIEW_LOGW("Fail to match pipeline group expression."); 
  6.         return
  7.     } 
  8.  
  9.     const int pipelineGroupNameField = 1; 
  10.     const int pipelineNameListField = 2; 
  11.     std::string eventSourceName = StringUtil::TrimStr(result.str(pipelineGroupNameField)); 
  12.     auto ret = std::find_if(pluginInfoList_.begin(), pluginInfoList_.end(), [&](PluginInfo& info) { 
  13.         if (info.name == eventSourceName) { 
  14.             info.isEventSource = true
  15.             info.pipelineNameList = StringUtil::SplitStr(result.str(pipelineNameListField)); 
  16.             return true
  17.         } 
  18.         return false
  19.     }); 
  20.     if (ret != std::end(pluginInfoList_)) { 
  21.         HIVIEW_LOGD("%s is an event source.", eventSourceName.c_str()); 
  22.     } 

說明:

  • 在解析pipelinegroups時,如果發現pipelineGroupName和pluginInfoList中某個插件的name一致,則把該插件PluginInfo.isEventSource置為true并且把pipelineNameList賦值給PluginInfo.pipelineNameList。
  • 結合/system/etc/hiview/plugin_config配置文件,可以看到SysEventSource插件是帶管道(SysEventPipeline)的,插件SysEventService和Faultlogger隸屬于管道SysEventPipeline,用于處理SysEventSource扔給管道的事件。

解析完插件配置信息之后會調用HiviewPlatform::LoadBusinessPlugin(const PluginConfig& config)去裝載插件和管道。

代碼如下

  1. void HiviewPlatform::LoadBusinessPlugin(const PluginConfig& config) 
  2.     // start to load plugin 
  3.     // 1. 遍歷pluginInfoList,根據插件名創建插件。因為目前配置的插件加載延時(loadDelay)為0,所以直接走[2],調用CreatePlugin()創建插件并添加到pluginMap_中。 
  4.     auto const& pluginInfoList = config.GetPluginInfoList(); 
  5.     for (auto const& pluginInfo : pluginInfoList) { 
  6.         HIVIEW_LOGI("Start to create plugin %{public}s delay:%{public}d", pluginInfo.name.c_str(), 
  7.                     pluginInfo.loadDelay); 
  8.         if (pluginInfo.loadDelay > 0) { //.............[1] 
  9.             auto task = std::bind(&HiviewPlatform::ScheduleCreateAndInitPlugin, this, pluginInfo); 
  10.             sharedWorkLoop_->AddTimerEvent(nullptr, nullptr, task, pluginInfo.loadDelay, false); 
  11.         } else {       //...............[2] 
  12.             CreatePlugin(pluginInfo); 
  13.         } 
  14.     } 
  15.     // 2. 遍歷pipelineInfoList,調用CreatePipeline()創建管道并添加到pipelines_中。 
  16.     auto const& pipelineInfoList = config.GetPipelineInfoList(); 
  17.     for (auto const& pipelineInfo : pipelineInfoList) { 
  18.         HIVIEW_LOGI("Start to create pipeline %{public}s", pipelineInfo.name.c_str()); 
  19.         CreatePipeline(pipelineInfo); 
  20.     } 
  21.  
  22.     // 3. 遍歷pluginInfoList,調用InitPlugin()初始化插件 
  23.     for (auto const& pluginInfo : pluginInfoList) { 
  24.         HIVIEW_LOGI("Start to Load plugin %{public}s", pluginInfo.name.c_str()); 
  25.         InitPlugin(config, pluginInfo); //............注[1] 
  26.     } 
  27.  
  28.     CleanupUnusedResources(); 

說明:

注[1]InitPlugin()這一步中,如果插件的workHandlerType為thread,則綁定工作線程EventLoop。如果插件是EventSource類型,則綁定管道Pipeline,并且調用StartEventSource開啟消息監聽。代碼如下:

  1. void HiviewPlatform::InitPlugin(const PluginConfig& config __UNUSED, const PluginConfig::PluginInfo& pluginInfo) 
  2.     auto& plugin = pluginMap_[pluginInfo.name]; 
  3.     if (plugin == nullptr) { 
  4.         return
  5.     } 
  6.     // 如果插件的workHandlerType為thread,則綁定工作線程EventLoop。 
  7.     if (pluginInfo.workHandlerType == "thread") { 
  8.         auto workLoop = GetAvaliableWorkLoop(pluginInfo.workHandlerName); 
  9.         plugin->BindWorkLoop(workLoop); 
  10.     } 
  11.  
  12.     auto begin = TimeUtil::GenerateTimestamp(); 
  13.     plugin->OnLoad(); 
  14.     // 如果插件是EventSource類型,則添加管道Pipeline,并且調用StartEventSource開啟消息監聽 
  15.     if (pluginInfo.isEventSource) { 
  16.         auto sharedSource = std::static_pointer_cast<EventSource>(plugin); 
  17.         if (sharedSource == nullptr) { 
  18.             HIVIEW_LOGE("Fail to cast plugin to event source!"); 
  19.             return
  20.         } 
  21.         for (auto& pipelineName : pluginInfo.pipelineNameList) { 
  22.             sharedSource->AddPipeline(pipelines_[pipelineName]); 
  23.         } 
  24.         StartEventSource(sharedSource); 
  25.     } 
  26.     auto end = TimeUtil::GenerateTimestamp(); 
  27.     HIVIEW_LOGI("Plugin %{public}s loadtime:%{public}" PRIu64 ".", pluginInfo.name.c_str(), end - begin); 

至此,插件管理平臺初始化工作已完成。

2.2 事件處理流程

結合插件配置文件,目前實際使用的插件類圖如下:

OpenHarmony 源碼解析之DFX子系統-Hiview(上)-鴻蒙HarmonyOS技術社區

說明:

  • 前文最后的代碼段提到,如果插件是EventSource類型,則綁定管道,并且調用StartEventSource開啟消息監聽。結合類圖,只有SysEventSource是EventSource類型的插件,所以只有SysEventSource持有管道。
  • EventSource類型的插件會監聽HiSysEvent接口發來的消息,解析并組裝成管道事件,分發給管道中的插件處理。

SysEventSource::StartEventSource()函數實現如下。

  1. void SysEventSource::StartEventSource() 
  2.     HIVIEW_LOGI("SysEventSource start"); 
  3.     std::shared_ptr<EventReceiver> sysEventReceiver = std::make_shared<SysEventReceiver>(*this); 
  4.     eventServer.AddReceiver(sysEventReceiver); 
  5.  
  6.     eventServer.Start(); 

SysEventSource有個成員變量eventServer,EventServer會開啟socketserver端用于接收HiSysEvent接口發來的socket消息。

類圖如下:

OpenHarmony 源碼解析之DFX子系統-Hiview(上)-鴻蒙HarmonyOS技術社區
OpenHarmony 源碼解析之DFX子系統-Hiview(上)-鴻蒙HarmonyOS技術社區

說明:

1.SysEventSource::StartEventSource()中把SysEventReceiver對象加入到EventServer的receivers_容器中。

2.EventServer收到socket消息之后,調用SysEventReceiver::HandlerEvent(const std::string& rawMsg)方法處理接收到的消息。

3.SysEventReceiver::HandlerEvent()方法中會調用SysEventParser::Parser(const std::string& rawMsg)方法解析消息并組裝成SysEvent對象,然后調用EventSource::PublishPipelineEvent(std::shared_ptr event)方法把管道事件發布出去。

EventSource::PublishPipelineEvent()代碼如下:

  1. bool EventSource::PublishPipelineEvent(std::shared_ptr<PipelineEvent> event) 
  2.     HIVIEW_LOGD("EventSource PublishPipelineEvent"); 
  3.     if (event == nullptr) { 
  4.         return false
  5.     } 
  6.  
  7.     if (Audit::IsEnabled()) { 
  8.         auto digest = GetPluginInfo() + Audit::DOMAIN_DELIMITER + event->GetEventInfo(); 
  9.         Audit::WriteAuditEvent(Audit::StatsEvent::PIPELINE_EVENT_CREATE, event->createTime_, digest); 
  10.     } 
  11.  
  12.     for (auto& pipeline : listeners_) { 
  13.         if ((pipeline != nullptr) && (pipeline->CanProcessEvent(event))) { 
  14.             // one event can only be processed by one pipeline 
  15.             pipeline->ProcessEvent(event); 
  16.             return true
  17.         } 
  18.     } 
  19.     return false

結合上面的類圖,EventSource持有管道列表對象listeners_,EventSource::PublishPipelineEvent()函數中會遍歷該列表,調用Pipeline::ProcessEvent(std::shared_ptr event)函數去處理管道事件。(Pipeline對象是在HiviewPlatform::InitPlugin()函數中被加入到EventSource.listeners_中的。)

Pipeline類型有個成員變量std::list

在插件平臺初始化的時候,HiviewPlatform::CreatePipeline()函數中已經把Plugin插件對象加入到了processors_列表中。

接下來分析Pipeline::ProcessEvent()函數做了什么。

  1. void Pipeline::ProcessEvent(std::shared_ptr<PipelineEvent> event) 
  2.     event->SetPipelineInfo(name_, processors_); 
  3.     event->OnContinue(); 

 把Pipeline的processors_對象賦給了PipelineEvent的processors_對象,然后調用

PipelineEvent::OnContinue()函數。

接下來分析PipelineEvent::OnContinue()函數:

  1. bool PipelineEvent::OnContinue() 
  2.     // 判斷hasFinish_標志位和processors_列表是否已經為空,如已為空,結束本次事件傳遞 
  3.     if ((!hasFinish_) && processors_.empty()) { 
  4.         return OnFinish(); 
  5.     } 
  6.  
  7.     // once the event start delivering 
  8.     // the call OnContinue means one has done the processing of the event 
  9.     // this may be called by upstream event processor or the framework 
  10.     if (Audit::IsEnabled() && startDeliver_) { 
  11.         Audit::WriteAuditEvent(Audit::StatsEvent::PIPELINE_EVENT_HANDLE_OUT, 
  12.             createTime_, std::to_string(Thread::GetTid())); 
  13.     } 
  14.  
  15.     // the framework will call OnContinue when the event is assigned to a pipeline 
  16.     if (!startDeliver_) { 
  17.         startDeliver_ = true
  18.     } 
  19.  
  20.     // 取出processors_列表中第一個Plugin元素,并從列表彈出 
  21.     std::weak_ptr<Plugin> plugin = processors_.front(); 
  22.     processors_.pop_front(); 
  23.     if (auto pluginPtr = plugin.lock()) { 
  24.         if (!pluginPtr->CanProcessMoreEvents()) { 
  25.             handler_->PauseDispatch(plugin); 
  26.         } 
  27.  
  28.         if (Audit::IsEnabled()) { 
  29.             Audit::WriteAuditEvent(Audit::StatsEvent::PIPELINE_EVENT_HANDLE_IN, createTime_, 
  30.                                    pluginPtr->GetHandlerInfo()); 
  31.         } 
  32.         // 判斷當前Plugin是否開啟了事件工作隊列,如有則加入事件隊列處理,如沒有直接調用OnEventProxy 
  33.         if (auto workLoop = pluginPtr->GetWorkLoop()) { 
  34.             workLoop->AddEvent(pluginPtr, shared_from_this()); //............[1] 
  35.         } else { 
  36.             pluginPtr->OnEventProxy(shared_from_this()); //..........[2] 
  37.         } 
  38.     } else { 
  39.         return OnContinue(); 
  40.     } 
  41.     return true

不管插件是否使用了事件隊列,最終都會調用到Plugin::OnEventProxy()函數來處理管道事件。

Plugin::OnEventProxy()函數實現如下:

  1. bool Plugin::OnEventProxy(std::shared_ptr<Event> event) 
  2.     if (event == nullptr) { 
  3.  
  4.         return false
  5.     } 
  6.  
  7.     std::shared_ptr<Event> dupEvent = event; 
  8.     auto processorSize = dupEvent->GetPendingProcessorSize(); 
  9.     dupEvent->ResetPendingStatus(); 
  10.     bool ret = OnEvent(dupEvent); //..............注[1] 
  11.  
  12.     if (!dupEvent->IsPipelineEvent()) { 
  13.         if (Audit::IsEnabled()) { 
  14.             Audit::WriteAuditEvent(Audit::StatsEvent::QUEUE_EVENT_OUT, dupEvent->createTime_, 
  15.                 std::to_string(Thread::GetTid())); 
  16.         } 
  17.     } else { 
  18.         if ((!dupEvent->HasFinish() && !dupEvent->HasPending()) && 
  19.             (processorSize == dupEvent->GetPendingProcessorSize())) { 
  20.             dupEvent->OnContinue();//.............注[2] 
  21.         } 
  22.     } 
  23.     return ret; 

先調用注[1]OnEvent()函數處理事件,再判斷管道事件傳遞是否已結束,如未結束則調用注[2]PipelineEvent::OnContinue()函數繼續把管道事件傳遞給后面的

插件處理。

結合目前的插件配置文件,整個插件管理平臺的消息處理流程大致如下:

EventServer接收到HiSysEvent組件接口發來的消息 --> SysEventReceiver::HandlerEvent() --> SysEventParser::Parser() --> EventSource::PublishPipelineEvent() --> Pipeline::ProcessEvent() --> PipelineEvent::OnContinue() --> SysEventService::OnEventProxy --> SysEventService::OnEvent --> PipelineEvent::OnContinue() --> Faultlogger::OnEventProxy --> Faultlogger::OnEvent --> 結束

至此,事件處理流程已分析完。

3 總結

以上內容首先分析了hiview插件管理平臺的初始化,然后對事件的處理流程做了分析。后續會詳細講解base/hiviewdfx/hiview/plugins目錄下每個插件的源碼。

想了解更多內容,請訪問:

51CTO和華為官方合作共建的鴻蒙技術社區

https://harmonyos.51cto.com

 

責任編輯:jianghua 來源: 鴻蒙社區
相關推薦

2021-11-08 15:04:47

鴻蒙HarmonyOS應用

2022-01-13 10:11:59

鴻蒙HarmonyOS應用

2021-12-17 16:42:09

鴻蒙HarmonyOS應用

2022-02-17 20:57:07

OpenHarmon操作系統鴻蒙

2022-01-06 16:17:58

鴻蒙HarmonyOS應用

2021-09-18 14:40:37

鴻蒙HarmonyOS應用

2023-04-12 15:31:11

系統服務管理鴻蒙

2022-05-10 11:17:27

電話子系統數據服務模塊

2021-11-18 10:28:03

鴻蒙HarmonyOS應用

2022-05-24 15:46:51

Wi-FiSTA模式

2021-09-13 15:15:18

鴻蒙HarmonyOS應用

2023-04-06 09:14:11

多模輸入子系統鴻蒙

2023-06-28 15:00:02

開源鴻蒙輸入系統架構

2021-09-17 14:38:58

鴻蒙HarmonyOS應用

2022-02-14 14:47:11

SystemUIOpenHarmon鴻蒙

2022-01-20 14:33:29

openharmonwayland協議鴻蒙

2022-03-18 16:07:04

Graphic子系統鴻蒙

2022-05-17 10:42:36

reboot源碼解析

2022-06-13 14:18:39

電源管理子系統耗電量服務

2021-09-16 15:08:08

鴻蒙HarmonyOS應用
點贊
收藏

51CTO技術棧公眾號

国产精品视频不卡| 欧美精品一区二区在线播放| 日韩精品一区二区三区丰满| 在线播放亚洲精品| 这里只有精品在线| 国产视频精品久久久| 三级a三级三级三级a十八发禁止| 国产黄大片在线观看画质优化| 国产精品888| 欧美激情性做爰免费视频| 精品一区二区视频在线观看| 岛国精品在线| 香蕉成人伊视频在线观看| 水蜜桃一区二区三区| 一级黄色片网站| 99在线|亚洲一区二区| 日韩有码在线视频| 无码成人精品区在线观看| 欧美日韩精品一区二区三区视频| 亚洲免费色视频| 国产一区国产精品| 国产一区二区三区三州| 国产精品尤物| 久久69精品久久久久久久电影好| 性猛交ⅹxxx富婆video| 国产精品宾馆| 欧美日韩免费观看一区三区| 国产伦精品一区二区三区四区视频_ | 91成人性视频| 亚洲欧美精品aaaaaa片| 久久爱www成人| 精品国精品国产尤物美女| 视频在线观看免费高清| 日韩免费小视频| 偷拍亚洲欧洲综合| 激情五月六月婷婷| 精品51国产黑色丝袜高跟鞋| 日本一区二区视频在线| 久久99精品久久久久子伦| 成人精品在线播放| 国内精品伊人久久久久影院对白| 国产精品成人一区二区| 中国一级免费毛片| 最新日韩在线| 久久琪琪电影院| 久草免费在线视频观看| 国产喷水福利在线视频| 黄色视屏在线免费观看| 亚洲综合色网站| 日本老太婆做爰视频| 国产在线激情视频| 中文字幕亚洲区| 相泽南亚洲一区二区在线播放| 国产视频精选在线| 久久无码av三级| 久久久com| 亚洲 精品 综合 精品 自拍| 99国产精品久| 欧美大陆一区二区| 天堂成人在线| 久久久影视传媒| 欧美亚洲一级二级| 国产在线黄色| 国产精品乱码人人做人人爱 | 国内国产精品天干天干| 国精品产品一区| 欧美精品一卡二卡| 日本一二三区在线| a级日韩大片| 亚洲韩国日本中文字幕| 中文字幕免费在线播放| 亚洲精品国产动漫| 国产亚洲综合久久| 少妇视频一区二区| 综合视频在线| 久久久亚洲影院你懂的| 国产一区二区三区影院| 国产精品一国产精品k频道56| 日本精品久久久久影院| 中文在线免费观看| 国产福利91精品一区二区三区| 成人黄色片视频网站| 污污视频在线免费看| 91蝌蚪porny成人天涯| 亚洲精品二区| 亚洲性图自拍| 色综合天天综合| 日韩在线不卡一区| 91国内精品| 亚洲欧美中文另类| 久久99久久99精品免费看小说| 欧美+日本+国产+在线a∨观看| 国语自产在线不卡| 中文字幕一区二区人妻| 国产成人午夜精品5599| 欧美日韩一区二区视频在线观看| 视频三区在线| 欧美日韩国产一中文字不卡 | 久久久久久免费观看| 亚洲一卡久久| 91免费视频网站| 日韩a级作爱片一二三区免费观看| 国产精品天干天干在线综合| www.亚洲视频.com| 免费一区二区三区四区| 精品福利av导航| 婷婷综合在线视频| 国产一区二区三区的电影| 国产美女主播一区| 少妇喷水在线观看| 亚洲人成在线观看一区二区| av丝袜天堂网| 国产成人福利av| 久久精品一本久久99精品| 日日噜噜噜噜人人爽亚洲精品| 国产最新精品免费| 日本一区二区三区视频在线播放| 国精产品一区一区三区mba下载| 欧美亚洲日本国产| www.超碰97| 欧美日本中文| 国产中文字幕亚洲| 九色蝌蚪在线| 欧美日韩精品在线| 精品无码人妻少妇久久久久久| 日韩精品久久久久久久电影99爱| 91国内免费在线视频| 99在线观看精品视频| 国产嫩草影院久久久久| 18禁男女爽爽爽午夜网站免费| 97se亚洲| 欧美夫妻性视频| 国产精品福利电影| 国产精品电影一区二区| 宅男噜噜噜66国产免费观看| 外国成人在线视频| 97视频免费观看| 国产成人自拍一区| 夜色激情一区二区| 男插女视频网站| 在线成人激情| 91久久精品美女高潮| 1024视频在线| 欧美日韩一区国产| 欧美三级视频网站| 日本成人超碰在线观看| 日本成人黄色| 成人在线爆射| 一区二区欧美久久| 成年人晚上看的视频| 国产视频在线观看一区二区三区| 欧美综合在线观看视频| 国产精品亚洲二区| 国产成人aa精品一区在线播放 | 最近中文字幕日韩精品| 中文字幕日韩经典| 国产精品女主播av| 中文字幕一区久久| 自拍偷拍欧美| 国产日韩亚洲精品| 理论不卡电影大全神| 日韩精品免费一线在线观看| 久久精品无码av| 国产日韩成人精品| 杨幂毛片午夜性生毛片| 我不卡神马影院| 91嫩草免费看| 蜜桃在线视频| 一本色道久久综合亚洲精品小说 | 久久久久久视频| 国产精品中文字幕日韩精品 | 一区二区国产在线观看| 欧美日韩一区二区三区在线视频| 91精品xxx在线观看| 日韩亚洲在线观看| 亚洲大尺度视频| 精品高清美女精品国产区| 免费在线观看你懂的| 蜜臀av性久久久久蜜臀aⅴ流畅| 中文字幕欧美日韩一区二区三区 | 成人三级小说| 亚洲欧美第一页| 亚洲天堂网在线观看视频| 一区二区免费在线播放| 中文字幕一区二区久久人妻网站| 日本欧美一区二区三区乱码| 欧美日韩亚洲国产成人| 欧美交a欧美精品喷水| 国产精品久久久久一区二区| av网站免费在线观看| 亚洲国产欧美一区| 亚洲香蕉在线视频| 亚洲国产精品久久久久婷婷884 | 教室别恋欧美无删减版| 成人天堂噜噜噜| 国产区美女在线| 中文字幕精品久久| 日本黄色不卡视频| 欧美精品久久久久久久多人混战 | 91久久久久久久久久| 18aaaa精品欧美大片h| 中文字幕av一区中文字幕天堂| 国产av无码专区亚洲a∨毛片| 色综合天天综合在线视频| 337p亚洲精品色噜噜狠狠p| 国产视频二区在线观看| 精品日产卡一卡二卡麻豆| 欧美成人一区二区三区四区| 亚洲激情网站免费观看| 天堂在线中文视频| 成人国产精品免费观看视频| 久久成年人网站| 久久一综合视频| 欧美一级欧美一级| 国产精品国内免费一区二区三区| 欧美久久久久久久| 手机看片福利视频| 亚洲五月婷婷| 好色先生视频污| 国产亚洲一区二区三区不卡| 国产欧美日韩一区二区三区| 91成人精品观看| 国产精品第一第二| 在线手机中文字幕| 久久久久亚洲精品国产| av免费网站在线| 中文字幕在线视频日韩| 国产资源在线看| 亚洲精品美女久久久久| 粉嫩小泬无遮挡久久久久久| 91精品国产综合久久久蜜臀粉嫩 | 一区二区精品免费| av男人天堂一区| 亚洲最大视频网| 国产一区二区三区日韩| 一区二区免费av| 青青草97国产精品免费观看无弹窗版| 国产h视频在线播放| 一区久久精品| 国产精品视频网站在线观看| 欧美福利专区| 强开小嫩苞一区二区三区网站| 久久精品国产99久久| 日韩欧美亚洲精品| 国产亚洲一区二区三区啪| 久久另类ts人妖一区二区| 麻豆精品av| 狠狠色综合一区二区| 国产精品传媒| 精品综合在线| 伊人成综合网伊人222| 欧美精品欧美精品| 国产欧美日韩| 亚洲国产精品一区在线观看不卡 | 99国产精品白浆在线观看免费| 亚洲最大黄网| 欧美精品在欧美一区二区| 午夜欧美精品| 国产freexxxx性播放麻豆| 精品动漫一区| 六月丁香婷婷在线| 日韩精品一级二级 | 欧美亚洲人成在线| 成人欧美一区二区三区在线湿哒哒 | 伊人成人免费视频| 国产精品一区二区三区乱码| 91精产国品一二三| 99久久精品国产观看| 中国毛片在线观看| 国产精品入口麻豆原神| 日韩女优一区二区| 五月天丁香久久| 波多野结衣不卡| 欧美精选午夜久久久乱码6080| 99久久精品无免国产免费| 精品国产一区二区三区不卡| 天天操天天干天天| 中文日韩在线视频| 日本电影在线观看| 国产999精品久久久| gogo大尺度成人免费视频| 国产精品中出一区二区三区| 九九久久婷婷| 中国老女人av| 免费一区视频| 伊人国产精品视频| 91麻豆123| 538精品在线视频| 福利一区福利二区微拍刺激| 亚洲综合精品在线| 亚洲а∨天堂久久精品喷水| av午夜在线| 久久久久久欧美| 成人影院在线免费观看| 岛国视频一区| 日韩精品首页| 黄色国产一级视频| 精品一区二区三区欧美| 少妇被狂c下部羞羞漫画| 国产精品你懂的| 日韩毛片在线视频| 宅男噜噜噜66一区二区66| 亚洲色图 校园春色| 麻豆国产精品va在线观看不卡| 在线观看欧美日韩电影| 91麻豆蜜桃| 成人3d动漫在线观看| 成熟了的熟妇毛茸茸| 韩国成人福利片在线播放| 国产ts丝袜人妖系列视频| 亚洲黄色片在线观看| 日韩国产亚洲欧美| 亚洲国内精品视频| 调教一区二区| 成人精品aaaa网站| 精品久久久久中文字幕小说| 色欲色香天天天综合网www| 九九国产精品视频| 国内精品卡一卡二卡三| 五月婷婷综合激情| 国产夫妻在线观看| 日日摸夜夜添一区| 欧美成人精品三级网站| 国产综合欧美在线看| 亚洲欧美综合国产精品一区| 99re精彩视频| 国产欧美一区二区精品秋霞影院| 你懂的国产视频| 亚洲大胆人体视频| 另类视频在线| av资源站久久亚洲| 亚洲色图二区| 不卡中文字幕在线观看| 欧美国产激情一区二区三区蜜月| 国产精品久久久久久人| 亚洲精品电影网| 黄色软件视频在线观看| 国产综合av一区二区三区| 伊人成人在线| 精品人妻伦一二三区久| 亚洲成人在线观看视频| 日韩一区二区三区在线观看视频 | 91视频综合网| 91精品麻豆日日躁夜夜躁| 日本高清中文字幕在线| 国产日韩精品在线播放| 国产精品88久久久久久| 超碰超碰在线观看| 国产精品久久久久久久久动漫| 伊人精品一区二区三区| 色偷偷91综合久久噜噜| 色综合视频一区二区三区日韩| 一区二区精品在线| 国产综合色产在线精品| 欧美做爰爽爽爽爽爽爽| 日韩欧美国产系列| 免费在线中文字幕| 国内精品久久久久久久果冻传媒| 亚洲精品乱码| 欧美bbbbb性bbbbb视频| 欧美性猛交xxxx乱大交蜜桃| 人人九九精品| 国产精品久久久久久搜索| 欧美亚洲国产激情| 爽爽爽在线观看| 一片黄亚洲嫩模| 三级在线观看网站| 欧美在线激情网| 日韩欧美视频在线播放| 日本亚洲一区二区三区| 亚洲观看高清完整版在线观看 | aaa欧美日韩| 精品久久久久久久久久久久久久久久 | 亚洲国产日韩一级| 欧美孕妇孕交xxⅹ孕妇交| 国产精品视频白浆免费视频| 欧美成人tv| 波多野结衣办公室33分钟| 欧美亚洲尤物久久| 青春草在线视频| 免费一区二区三区在在线视频| 日韩av在线播放中文字幕| 欧美日韩在线国产| 亚洲精品网站在线播放gif| **国产精品| 国产伦精品一区二区三区四区视频_| 国产亚洲欧美日韩俺去了| 国产精品一区二区免费视频| 午夜精品久久久久久久99黑人| 视频一区中文| 伊人av在线播放| 欧美性xxxx| 国产剧情在线| 久久免费视频1| 国产综合色在线| 天天爽夜夜爽人人爽| 欧美黑人性猛交| 欧美日韩在线网站| 少妇精品无码一区二区三区| 欧美日韩国产免费|