成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

搞不懂 HarmonyOS 原子化服務?各位開發者看這里

開發 項目管理 OpenHarmony
日常生活中,我們已經習慣了應用的概念。傳統的應用是以設備為中心,使用前必須手動安裝應用,這樣導致應用像生了根一樣,牢牢的固定在某個設備上。

而在萬物互聯的時代,人均持有設備量不斷攀升,設備和場景的多樣性,每個設備都需要獨立開發一個應用,先安裝后使用、不同設備的能力不兼容等傳統應用的短板逐步暴露出來。在此背景下,應用提供方和用戶都迫切需要一種新的服務提供方式,使應用開發更簡單、服務(如聽音樂、打車等)的獲取和使用更便捷?;诖耍琀armonyOS提供了原子化服務。

一、原子化服務是什么?

相信很多開發者小伙伴聽說過“原子化服務”,又或者是“元服務”。其實,元服務就是原子化服務。那么原子化服務到底是什么呢?接下來就帶開發者詳細了解下。

原子化服務是HarmonyOS提供的一種面向未來的服務方式,是有獨立入口的(用戶可通過點擊方式直接觸發)、免安裝的(無需顯式安裝,由系統后臺安裝后即可使用)、可為用戶提供一個或多個便捷服務的用戶應用程序形態。

例如:傳統方式的購物應用,在按照原子化服務理念調整設計后,可以由多個服務直達、免安裝的原子化服務實現,比如“商品瀏覽”、“購物車”、“支付”等。

二、如何體驗原子化服務?

為了幫助開發者更好地了解原子化服務到底是什么,下面就和開發者小伙伴們一起體驗一下原子化服務。

2.1多種入口

我們可以通過多種方式發現原子化服務:

  1. 一種為NFC標簽,另一種為多功能碼。NFC標簽為物理打印標簽,支持手機碰一碰使用相應服務。多功能碼可以為物理打印的標簽,支持手機碰一碰及掃一掃使用相應服務,也可以為屏幕上呈現的電子標簽,支持掃一掃。多功能碼有兩種樣式,分別用于跨設備體驗和三方服務。
  2. 用戶也可以在設備的服務中心、桌面等地方發現并管理原子化服務。
  3. 原子化服務可以基于合適場景被主動推薦給用戶使用;用戶也可以在服務中心和小藝建議中發現系統推薦的服務。

說明:“小藝”是語音助手在華為設備中的名字。小藝可以回答用戶的問題、控制家居設備、執行用戶的日常任務等;而且,小藝可以通過不同設備感知用戶的使用場景,推薦用戶可能需要的服務

2.2服務卡片

與傳統應用不同,原子化服務在設備桌面沒有應用圖標,是通過服務卡片的形式將重要信息展示在服務中心或者桌面。用戶點擊服務卡片,即可進入原子化服務的服務界面。
服務卡片的核心理念在于提供用戶容易使用且一目了然的信息內容,將智慧化能力融入到服務卡片的體驗中供用戶選擇使用,同時滿足在不同終端設備上的展示和自適應。

值得注意的是,原子化服務和HarmonyOS應用都支持服務卡片。對于原子化服務,服務卡片是必選的,每個原子化服務至少有一個服務卡片。而對于HarmonyOS應用,服務卡片是可選配置。
說明:HarmonyOS應用,即運行在HarmonyOS系統上且具備HarmonyOS特性的應用。

2.3服務流轉

原子化服務支持運行在1+8+N設備上。

  • “1”代表手機
  • “8”代表平板、智慧屏、音箱、眼鏡、手表、車機、耳機、PC
  • “N”代表運動健康、智能家居、智慧出行、智慧辦公、影音娛樂等場景延伸的泛IoT設備。

原子化服務的流轉能力打破設備界限,多設備聯動,使原子化服務可分可合、可流轉,實現如郵件跨設備編輯、多設備協同健身、多屏游戲等分布式業務。原子化服務的流轉觸發方式有兩種:系統推薦流轉和用戶手動流轉。

①系統推薦流轉:用戶使用原子化服務時,如果所處環境中存在使用體驗更優的可選設備,則系統自動為用戶推薦該設備,用戶可確認是否啟動流轉。

②用戶手動流轉:用戶可以手動選擇合適的設備進行流轉。用戶點擊圖標后,會調起系統提供的流轉面板。面板中會展示出原子化服務的信息及可流轉的設備,引導用戶進行后續的流轉操作。

2.4服務分享

原子化服務所提供的便捷服務,可以通過接入華為分享實現近距離快速分享,使便捷服務可以精準快速的推送至接收方,降低用戶觸達服務的成本,提升用戶體驗。相比于傳統的社交軟件分享,分享雙方無需建立好友關系,接收方無需提前安裝承載服務的安裝包,即可享受原生的服務體驗。

用戶可在原子化服務內選擇分享,打開“華為分享”開關后,將原子化服務分享給附近同樣打開了“華為分享”開關的好友,好友點擊確認后直接啟動服務。下圖是通過“華為分享”分享購物類原子化服務的典型場景。

三、原子化服務的優勢在哪里?

3.1 一次開發,多端部署

對于開發者而言,原子化服務只需開發一次,便可以部署在各種HarmonyOS終端上,大大降低了開發成本。

對于傳統的APP軟件開發者來說,一個繞不開的煩惱就是同一個APP需要分別針對不同的設備進行適配。比如程序員在手機上開發了一款應用,針對手表需要重新適配、發布到手表的應用市場;針對大屏適配后,再發布到大屏的應用市場,嚴重影響了應用的開發效率和變現能力。

HarmonyOS在架構設計之初,就提出了一次構建支持多端部署的架構設計原則。HarmonyOS通過提供用戶程序框架、Ability框架以及UI框架,能夠保證開發的應用在多終端運行時保證一致性。多終端軟件平臺API具備一致性,確保用戶程序的運行兼容性。

如此一來,開發者僅需為不同形態的設備配置不同參數,IDE就能夠自動生成支持多設備分發的APP包。APP包上架應用市場后,應用市場會自動按照設備類型進行HAP包的拆分、組裝和分發,進而端到端實現了一次開發,支持多端部署的設計。

具體流程如下:

  • 開發階段,IDE基于包格式編譯打包支持多設備的應用包。
  • 上架到應用市場。
  • 在云側對App進行拆包,部署到CDN(Content Delivery Network,內容分發網絡),包信息同步到服務分發中心。
  • 端側運行過程中,根據自身設備類型獲取相應的HAP及整體摘要信息。

3.2 免安裝,秒級打開

消費者不感知安裝過程和卸載過程,體驗全新升級。

HarmonyOS 原子化服務是輕量化服務的新物種,它提供了全新的服務和交互方式。用戶在使用原子化服務時,如果服務未部署,系統將通過云端自動部署服務,部署成功后即可使用對應服務。例如,在服務中心點擊服務卡片,原子化服務通過免安裝能力完成部署和運行,實現服務直達的業務體驗。無須用戶跳轉到傳統的應用分發市場,搜索下載目標應用,使得在設備上部署應用更加快速。

隨著分布式場景生態的豐富,原子化服務要始終以人為中心,在不同設備間流轉。當用戶走到大屏設備前,手機上的視頻電話可以流轉到大屏溝通,當用戶走到電腦前,手機和電腦可以協同辦公,原子化服務能夠在不干擾用戶的情況下完成了自動部署,同時,系統會智能地清理已部署的低頻服務。

這就是原子化服務的免安裝能力,一方面提升開發者上架應用的分發效率和轉化率,一方面提升消費者的服務體驗,減少安裝過程對用戶的干擾。

3.3以人為中心,分布式流轉

分布式流轉是實現原子化服務以人為中心的核心技術。

隨著5G和IoT設備的發展,個人擁有了多個智能設備也逐步成為主流場景。手機、筆記本、平板、電視、運動手表、耳機、冰箱、抽油煙機、智能門鎖等這類智能設備在搭載HarmonyOS系統后,通過分布式軟總線連接起來,就可以形成一個超級的終端。不同的設備之間,通過重新業務組合,可以形成新的用戶體驗。

例如:用戶坐在書桌前用手機觀看視頻,又希望轉移到客廳,坐在沙發上用大屏繼續視頻的觀看。業界大多采用投屏的方案實現,如DLNA、Cast+等。而原子化服務采用的分布式組件流轉的技術,簡單來講,就是HarmonyOS系統管理著原子化服務進程實體的上下文環境(打開的文件句柄,硬件,運行狀態),并對上下文數據進行跨設備的備份、傳輸和恢復。如下圖示意:

對于用戶來說,流轉操作應當是便捷的,高效的,無副作用的。用戶可以進行反復流轉,應用實體能夠始終維持其狀態。為了保證用戶交互的一致性,流轉的入口由系統統一提供。對于應用程序的一致性,由開發者維護。例如:當應用從手機遷移到大屏之后,其控件、樣式、布局等方面應當盡可能保持一致。但“一致”不意味著“一樣”:針對手機,平板電腦或者大屏各自屏幕的特征,其用戶界面應當做好相應的適配。

3.4對比App Clips和小程序,有什么優勢?

App Clips和小程序本質上都是針對服務線上化、交易閉環的場景在定義產品,天然追求隨處可及和服務直達的特性。原子化服務與之相比,有以下優勢:

原子化服務是面向未來超級終端的服務形態,覆蓋更廣泛的IoT設備,具備1+8+N設備兼容的API接口,這也是原子化服務相比APP Clips和小程序更具競爭力的根基。
原子化服務是基于分布式全場景體驗目標而設計的,也是與App Clips和小程序在設計理念上的最大不同。HarmonyOS提供了超強的分布式能力,能夠讓開發者快速實現一個分布式業務。
原子化服務有服務中心、碰一碰、掃一掃、卡片分享、流轉業務觸發等相比App Clips和小程序更為豐富的入口, 支持服務快速直達。

四、如何開發原子化服務?

便捷的原子化服務如何開發?這應該是開發者小伙伴更關注的問題,下面就來詳細介紹。

4.1總體開發要求

  1. 原子化服務的所有HAP包均需要滿足免安裝要求。
  2. 免安裝的HAP包不能超過10MB。
  3. 原子化服務升級時,新版本也要保持免安裝屬性。
  4. 目前支持免安裝的HAP的設備類型有:手機、平板、智慧屏、智能穿戴,版本均需要在HarmonyOS 2版本及以上。
  5. 原子化服務如果要在服務中心露出,則需要滿足:
  • 該服務對應的HAP包需要包含FA,且指定唯一的一個“MainAbility”作為用戶操作入口。
  • 需要配置一個小尺寸服務卡片(2*2規格),以及配置基礎信息:如圖標、名稱、描述、快照等。

原子化服務的詳細設計說明,可以參考官網:
https://developer.harmonyos.com/cn/docs/design/des-guides/service-overview-0000001139795693

4.2開發工具

HUAWEI DevEco Studio(以下簡稱DevEco Studio)是基于IntelliJ IDEA Community開源版本打造,面向華為終端全場景多設備的一站式集成開發環境(IDE),為開發者提供工程模板創建、開發、編譯、調試、發布等E2E的HarmonyOS應用開發服務。

DevEco Studio下載鏈接:https://developer.harmonyos.com/cn/develop/deveco-studio#download

我們使用DevEco Studio工具來開發原子化服務。該工具的詳細使用說明,可以參考官網:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/tools_overview-0000001053582387

4.3開發過程及注意點

創建工程

  1. 運行DevEco Studio工具,在菜單欄選擇File > New > New Project。
  2. 根據工程創建向導,選擇需要的Ability工程模板,然后點擊Next。
  3. 配置工程的基本信息。

  • Project Name:工程的名稱,可以自定義。
  • Project Type:工程的類型,Service表示原子化服務,Application表示傳統方式的需要安裝的應用。因為要創建原子化服務工程,這里選擇Service。
  • Device Type:根據需要選擇該工程支持的設備類型。支持多選。注:如果勾選了TV,則下面的“Show in Service Center”會消失。
  • Show in Service Center:是否在服務中心露出。開啟此開關,則默認創建一張小尺寸(2x2)服務卡片和快照。

點擊Finish,工具會自動生成示例代碼和相關資源,等待工程創建完成。

工程配置

  1. config.json配置文件

每個HAP的根目錄下都存在一個config.json配置文件,文件內容主要涵蓋以下三個方面:

  • 應用的全局配置信息,包含應用的包名、生產廠商、版本號等基本信息。
  • 應用在具體設備上的配置信息,包含應用的備份恢復、網絡安全等能力。
  • HAP包的配置信息,包含每個Ability必須定義的基本屬性(如包名、類名、類型以及Ability提供的能力),以及應用訪問系統或其他應用受保護部分所需的權限等。

工程創建完成之后,config.json文件默認包含以下配置內容。

① 免安裝配置信息

  1. "distro": { "deliveryWithInstall": true, "moduleName": "entry", "moduleType": "entry", "installationFree": true } 

installationFree為true表示該HAP是免安裝的。

② 服務卡片配置信息
由于創建工程時開啟了Show in Service Center開關,所以默認配置了此信息。

  1. "abilities": [ 
  2. "skills": [ 
  3. ... 
  4. ], 
  5. "name": "com.example.atomicservicedemo.MainAbility", 
  6. "icon": "$media:icon", 
  7. "description": "$string:mainability_description", 
  8. "formsEnabled": true, 
  9. "label": "$string:app_name", 
  10. "type": "page", 
  11. "forms": [ 
  12. "jsComponentName": "widget", 
  13. "isDefault": true, 
  14. "scheduledUpdateTime": "10:30", 
  15. "defaultDimension": "2*2", 
  16. "name": "widget", 
  17. "description": "$string:widget_description", 
  18. "colorMode": "auto", 
  19. "type": "JS", 
  20. "supportDimensions": [ 
  21. "2*2" 
  22. ], 
  23. "updateEnabled": true, 
  24. "updateDuration": 1 
  25. ], 
  26. "launchType": "standard" 

config.json文件的詳細說明,可以參考官網:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/basic-config-file-elements-0000000000034463

  1. 快照

創建工程時,如果開啟了Show in Service Center開關,工程創建完成后會在工程目錄下自動生成快照(EntryCard)文件夾。如下圖所示:

此文件夾下默認生成了一張2x2(小尺寸)的快照(一張png格式的圖片)。開發者可以將其替換為事先設計好的2x2快照,樣式上應與對應的服務卡片保持一致:將新的快照拷貝到上圖目錄下,刪除默認圖片,新圖片命名遵循格式“服務卡片名-2x2.png”。

說明:“服務卡片名”可以查看config.json文件的forms數組中的“name”字段。

開發原子化服務

我們重點介紹一下如何將原子化服務接入到華為分享。

以JAVA工程為例,開發步驟如下:

① 新建兩個idl文件,用于和華為分享進行跨進程通信。

IHwShareCallback.idl文件:

  1. interface com.huawei.hwshare.third.IHwShareCallback { 
  2. [oneway] void notifyState([in] int state); 


IHwShareService.idl文件:

  1. sequenceable ohos.interwork.utils.PacMapEx; 
  2. interface com.huawei.hwshare.third.IHwShareCallback; 
  3.  
  4. interface com.huawei.hwshare.third.IHwShareService { 
  5. int startAuth([in] String appId, [in] IHwShareCallback callback); 
  6. int shareFaInfo([in] PacMapEx pacMapEx); 

開發者只需將.idl文件保存至DevEco Studio項目的src/目錄內,工具則會在構建應用時,在項目的generated/目錄中生成IRemoteObject接口文件、Stub文件、Proxy文件。IHwShareCallback.idl文件和IHwShareService.idl文件會生成對應的IHwShareCallback.java和IHwShareService.java。


② 新建一個管理類“ShareAtomicServiceManager.java”,用于管理與華為分享的跨進程通信。這里對外暴露一個接口:

  1. public void shareFaInfo(String appId, PacMapEx pacMap) { 
  2. if (mContext == null) { 
  3. return; 
  4. mAppId = appId
  5. mSharePacMap = pacMap
  6. mHandler.removeTask(mTask); 
  7. shareFaInfo(); 
  8. bindShareService(); 
  • appId是應用在應用市場的唯一標識,在創建項目時生成。
  • pacMap是需要傳遞給華為分享的信息。
  • shareFaInfo()用于分享FA信息到華為分享應用中,代碼如下:
  1. private void shareFaInfo() { 
  2. if (mShareService == null) { 
  3. return; 
  4. if (mHasPermission) { 
  5. HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "start shareFaInfo."); 
  6. try { 
  7. mShareService.shareFaInfo(mSharePacMap); 
  8. mSharePacMap = null
  9. } catch (RemoteException e) { 
  10. HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "shareFaInfo error."); 
  11. // 不使用時斷開 
  12. mHandler.postTask(mTask, UNBIND_TIME); 

其中,mTask用于執行斷連的操作:

  1. private final Runnable mTask = () -> { 
  2. if (mContext != null && mShareService != null) { 
  3. mContext.disconnectAbility(mConnection); 
  4. mHasPermission = false
  5. mShareService = null
  6. }; 


另外,綁定華為分享服務的代碼如下:

  1. private void bindShareService() { 
  2. if (mShareService != null) { 
  3. // 保證僅連一次。 
  4. return; 
  5. HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "start bindShareService."); 
  6. Operation operation = new Intent.OperationBuilder().withBundleName(SHARE_PKG_NAME) 
  7. .withAction(SHARE_ACTION).withFlags(Intent.FLAG_NOT_OHOS_COMPONENT).build(); 
  8. Intent intent = new Intent(); 
  9. intent.setOperation(operation); 
  10. mContext.connectAbility(intent, mConnection); 

其中,mConnection的定義如下:
 

  1. // 管理與華為分享的連接 
  2. private final IAbilityConnection mConnection = new IAbilityConnection() { @Override public void onAbilityConnectDone(ElementName elementName, IRemoteObject iRemoteObject, int i) { HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityConnectDone success."); mHandler.postTask(()->mShareService = new HwShareServiceProxy(iRemoteObject); try { mShareService.startAuth(mAppId, mFaCallback); } catch (RemoteException e) { HiLog.error(LABEL_LOG, LOG_FORMAT, TAG, "startAuth error."); } }); } @Override public void onAbilityDisconnectDone(ElementName elementName, int i) { HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "onAbilityDisconnectDone."); mHandler.postTask(()->mShareService = nullmHasPermission = false; }); } }; 

mShareService.startAuth(mAppId, mFaCallback)是對appId進行驗證,驗證成功之后會通過mFaCallback回調。mFaCallback的代碼如下:

  1. private final HwShareCallbackStub mFaCallback = new HwShareCallbackStub("HwShareCallbackStub") { 
  2. @Override 
  3. public void notifyState(int state) throws RemoteException { 
  4. mHandler.postTask(()->
  5. HiLog.info(LABEL_LOG, LOG_FORMAT, TAG, "notifyState: " + state); 
  6. if (state == 0) { 
  7. mHasPermission = true
  8. if (mSharePacMap != null) { 
  9. shareFaInfo(); 
  10. }); 
  11. }; 

state為0時表示認證通過,可以進行分享。

③ 在MainAbilitySlice.java中,調用連接華為分享的接口:

  1. ShareAtomicServiceManager.getInstance(this).shareFaInfo("629005930163350400", getPacMap()); 

"629005930163350400"是appId,每個應用不一樣,需要替換成應用自己的appId。getPacMap是獲取需要分享的內容封裝方法。

  1. private PacMapEx getPacMap() { 
  2. PacMapEx pacMap = new PacMapEx(); 
  3. pacMap.putObjectValue(ShareAtomicServiceManager.SHARING_FA_TYPE, 0); 
  4. pacMap.putObjectValue(ShareAtomicServiceManager.HM_BUNDLE_NAME, getBundleName()); 
  5. pacMap.putObjectValue(ShareAtomicServiceManager.SHARING_EXTRA_INFO, "原子化服務分享額外內容"); 
  6. pacMap.putObjectValue(ShareAtomicServiceManager.HM_ABILITY_NAME, MainAbility.class.getName()); 
  7. pacMap.putObjectValue(ShareAtomicServiceManager.SHARING_CONTENT_INFO, "原子化服務通過華為分享的內容"); 
  8. byte[] sharedContentImg = getResourceBytes(ResourceTable.Media_share_conteng_img); 
  9. pacMap.putObjectValue(ShareAtomicServiceManager.SHARING_THUMB_DATA, sharedContentImg); 
  10. byte[] iconImg = getResourceBytes(ResourceTable.Media_icon); 
  11. pacMap.putObjectValue(ShareAtomicServiceManager.HM_FA_ICON, iconImg); 
  12. pacMap.putObjectValue(ShareAtomicServiceManager.HM_FA_NAME, getString(ResourceTable.String_app_name)); 
  13. return pacMap; 


其中,常量的定義如下:

  1. public static final String HM_FA_ICON = "ohos_fa_icon"
  2. public static final String HM_FA_NAME = "ohos_fa_name"
  3. public static final String HM_ABILITY_NAME = "ohos_ability_name"
  4. public static final String HM_BUNDLE_NAME = "ohos_bundle_name"
  5. public static final String SHARING_FA_TYPE = "sharing_fa_type"
  6. public static final String SHARING_THUMB_DATA = "sharing_fa_thumb_data"
  7. public static final String SHARING_CONTENT_INFO = "sharing_fa_content_info"
  8. public static final String SHARING_EXTRA_INFO = "sharing_fa_extra_info"

常量含義說明如下:

 

對于圖片資源的解析可以參考如下:

  1. private byte[] getResourceBytes(int resId) { 
  2. InputStream resource = null
  3. ByteArrayOutputStream outStream = null
  4. try { 
  5. resource = getResourceManager().getResource(resId); 
  6. outStream = new ByteArrayOutputStream(); 
  7. byte[] buffer = new byte[1024]; 
  8. int len; 
  9. while ((len = resource.read(buffer)) != -1) { 
  10. outStream.write(buffer, 0, len); 
  11. outStream.close(); 
  12. resource.close(); 
  13. return outStream.toByteArray(); 
  14. } catch (IOException e) { 
  15. HiLog.error(TAG, "get resource occurs io exception!"); 
  16. } catch (NotExistException e) { 
  17. HiLog.error(TAG, "it dose not exist!"); 
  18. } finally { 
  19. if (resource != null) { 
  20. try { 
  21. resource.close(); 
  22. } catch (IOException e) { 
  23. HiLog.error(TAG, "close input stream occurs io exception!"); 
  24. if (outStream != null) { 
  25. try { 
  26. resource.close(); 
  27. } catch (IOException e) { 
  28. HiLog.error(TAG, "close output stream occurs io exception!"); 
  29. return null; 


大家也可以參考官網上接入華為分享的開發指導:
https://developer.harmonyos.com/cn/docs/documentation/doc-guides/huawei-share-service-sharing-guidelines-0000001141302387

運行工程

在虛擬機或者真機運行創建的工程之后,會顯示原子化服務的主界面(即服務界面)。但是在桌面找不到原子化服務圖標,因為原子化服務在桌面是沒有icon的??梢栽诜罩行耐ㄟ^搜索原子化服務的名稱找到該原子化服務,將其服務卡片添加到桌面。

原子化服務接入華為分享的運行結果,需要準備兩臺HarmonyOS手機,且其系統軟件版本不低于HarmonyOS 2。

以上就是關于 HarmonyOS 原子化服務的介紹了,你學會了嗎?期待更多開發者小伙伴加入原子化服務開發之旅哦~

 

 

責任編輯:黃顯東 來源: 51cto
相關推薦

2021-12-02 14:16:42

Google 開發者大Codelab

2023-07-27 08:59:19

線程同步Python

2022-05-20 16:50:33

區塊鏈Web3加密資產

2022-03-07 16:46:03

HarmonyOS鴻蒙操作系統

2014-05-22 10:28:33

APP臃腫化超級app

2012-06-13 01:23:30

開發者程序員

2020-10-09 09:49:18

HTTPS網絡 HTTP

2013-03-11 11:20:05

2012-03-12 21:51:56

2018-12-15 17:25:31

騰訊云+社區開發者大會騰訊云
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 美日韩精品| 亚洲综合二区 | 精品久久影院 | 九九热在线免费视频 | 黄色成人亚洲 | 天天躁日日躁xxxxaaaa | 亚洲91| 激情欧美一区二区三区 | 中文一区二区视频 | 91色视频在线观看 | 新av在线| 久久这里只有精品首页 | 激情五月综合 | 免费成人高清在线视频 | 国产高清av免费观看 | 亚洲国产二区 | 国产精品久久久久久一区二区三区 | 青青久在线视频 | av免费网址 | 成人午夜| 国产在线精品一区二区三区 | 日韩国产在线观看 | 亚洲 中文 欧美 日韩 在线观看 | 精品日韩一区二区 | 国产高清在线观看 | 黑人巨大精品欧美一区二区一视频 | 99久久视频| 久久这里只有 | 欧美高清视频一区 | 欧美综合一区 | 日韩高清国产一区在线 | 韩日一区| 亚洲成人一二三 | 亚洲高清一区二区三区 | 中文字幕在线精品 | 韩日精品在线观看 | www亚洲一区| 欧美黄在线观看 | 精品久久久久久亚洲精品 | 亚洲人成人网 | 久久九|