999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

基于應用描述的Android代碼自動生成

2016-12-26 08:14:42江逸舟沈立煒趙文耘
計算機應用與軟件 2016年11期
關鍵詞:定義界面模型

江逸舟 沈立煒 彭 鑫 趙文耘

(復旦大學軟件學院 上海 201203)(上海市數據科學重點實驗室(復旦大學) 上海 201203)

?

基于應用描述的Android代碼自動生成

江逸舟 沈立煒 彭 鑫 趙文耘

(復旦大學軟件學院 上海 201203)(上海市數據科學重點實驗室(復旦大學) 上海 201203)

在移動開發領域,安卓應用的開發吸引著廣大移動終端廠商和開發者的加入。目前,開發者大多采用傳統的方式,基于集成開發環境為安卓應用的每一項組成部分進行設置或編碼,這些工作可能花費開發者較多的時間。然而,與應用框架相關的部分代碼與配置文件具有類似的模式,通過復用及定制的方式可以有效提高應用的整體開發效率。為了實現這一目標,提出一套借鑒MDA(Model-Driven Architecture)思想的方法,基于安卓應用的描述來完成安卓代碼框架部分的自動生成。該方法包括一種描述安卓應用基本元素及其關聯關系的元模型,以及一套可復用且支持定制的應用代碼模版。基于元模型標準的特定安卓應用的描述可以驅動基于模版的安卓框架代碼的自動生成。在該方法基礎上,開發Android應用框架自動生成工具,并以一個實例展示了方法與工具的可用性。

Android 模型驅動架構 代碼自動生成 元模型

0 引 言

當前,智能終端的普及使得移動應用的需求量不斷增長。安卓作為免費、開源的手機平臺受到廣大開發人員及用戶的青睞。安卓應用開發者大多采用傳統的方式(由設計至編碼),基于集成開發環境(例如Eclipse、Android Studio、Visual Studio等)完成應用的開發工作。在這些工具中,開發者需要為安卓應用的每一項組成部分進行設置或編碼,包括應用界面的設計(編寫layout文件,或直接通過可視化開發方式進行設計)、核心配置文件的定義(填充Androidmanifest.xml文件)、組成應用的構件的開發(Activity、Service等代碼的編寫)、構件間跳轉關系的實現(Intent代碼的編寫)等。這些工作可能花費開發者較多的時間。然而,與應用框架相關的部分代碼與配置文件具有類似的模式,我們認為這部分的開發工作可以通過復用及定制的方式從而提高應用的開發效率。

針對以上目標,本文提出一套借鑒MDA思想的方法,基于安卓應用的描述來完成安卓代碼框架部分的自動生成。MDA指首先建立抽象的、與具體技術無關的模型,隨后從抽象模型自動生成應用程序的過程[1]。遵循該過程,本文首先提出一種描述安卓應用的元模型,元模型定義了組成安卓應用的各類元素及其依賴關系。特定安卓應用的模型基于元模型標準,定義了應用的架構,包括名稱、屬性以及約束關系等。同時,本文方法還提出了一套應用代碼模版,其中內嵌了與特定應用相關的可變、可定制的代碼部分。在描述應用的模型以及代碼模板的基礎上本方法涵蓋了從元模型所描述元素到代碼模版中可變部分的映射過程,支持通過代碼生成器自動生成安卓應用的框架,隨后開發者可將精力投入在應用業務邏輯的代碼編寫上。基于本方法,我們實現了安卓應用框架自動生成工具,工具采用GMF[2]圖形框架支持用戶以可視化的方式設計應用框架,Apache Freemarker[3]代碼生成器負責定制模版,生成應用代碼框架。

1 相關工作

近年來,針對基于MDA的代碼自動生成技術的研究主要包括UML模型的代碼自動生成、模型驅動的安卓界面(Graphical user interface)自動生成、基于DSL(Domain Specific Language)元模型以及采用BPMN模型的代碼自動生成。

為了提高GUI的開發效率,Silva等[4-10]提出了面向安卓界面自動生成的模型。他們為安卓應用的控件、窗口、事件監聽器等建立抽象模型,再將模型轉換為代碼,自動生成安卓應用界面的代碼。本文的研究重點在于創建描述安卓應用的模型,自動生成應用的代碼框架,而界面自動生成并非本文考慮的重點。本文僅通過配置實現了簡單的線性布局。

在基于UML模型驅動的代碼自動生成方面,Parada等[11]采用了UML類圖和順序圖為安卓應用建立模型,并建立類圖與順序圖的對應關系,然后結合兩者自動生成安卓應用代碼框架。Kraemer等[12,13]采用UML活動圖描述安卓應用,將活動圖轉換為可執行的狀態機,再自動生成安卓應用的代碼。由于安卓應用的領域特征,UML統一建模語言不能很好地描述安卓應用,因此本文采用了領域特定的元模型定義組成安卓應用的各類元素。

在DSL的元模型的模型驅動技術方面,Lachga等[6-10]借鑒MDA思想,提出了DSL的建模語言,并開發了安卓界面代碼自動生成工具。Madari等[8]為應用的GUI和頁面跳轉做詳細設計,建立了應用整體與不同頁面的模型,再將頁面之間的跳轉通過CR模型(UML活動圖)聯系起來。本文的元模型定義了組成安卓應用的各類元素,如Activity、Service、BroadcastReceiver等,并通過描述應用的模型為安卓應用的框架建模。

其他研究人員采用BPMN建模語言為應用建模,例如Solis-Martinez等采用BPMN建模語言來描述業務流程,然后生成跨平臺的應用[14,15]。模型通過XML格式定義流程模型,經過一定步驟的配置后,實現了與平臺無關的應用(Android、IOS)。但他們并沒有對具體的應用開發做出詳細闡述,僅提出了平臺無關的模型。

此外,一些知名公司開發了圖形化工具為開發人員帶來便利。例如,谷歌與MIT聯合開發的一款安卓快速開發工具App Inventor[16],該工具可以使用戶通過基于瀏覽器的工具開發手機應用。用戶可以方便地拖放代碼塊,通過mushup的方式將它們放在一起,產生一個應用程序。由于是由特定的模塊組成的,所以具有一定限制性。IBM公司的Rational Rhapsody[17]提供了用于安卓代碼框架生成的Eclipse插件,該工具采用UML類圖、順序圖為應用建模。但是,該工具的模型配置比較復雜,與代碼開發幾乎是一一對應的。相比而言,本文提出了領域特定的元模型,并通過描述應用的模型為安卓應用建模,建模過程更加簡單直觀。

2 描述安卓應用框架的元模型

2.1 元模型適用范圍

由于安卓四大組件包括Activity、Service、BroadcastReceiver和Contentprovider[18],每種組件都具有自己的生命周期,承擔不同的職責。對于多數應用開發層的應用而言,都由以上四大組件構成,例如業務信息類應用、社交軟件、新聞應用等。本文提出的元模型將安卓組件設計為元模型的元素,可適用于多數安卓應用開發程序。而本文提出的元模型對于諸如框架開發類應用(基于安卓操作平臺做定制化開發)、底層開發類(驅動開發、JNI)等尚不適用。具體來說,本文提出的元模型可適用于具有以下特征的應用:

(1) 安卓應用包含許多Activity。Activity主要用于顯示界面、與用戶交互;應用需要實現導航功能,導航指Activity之間的跳轉。

(2) 安卓應用需啟動后臺服務。Activity是安卓應用的主線程,為了保證用戶交互流暢,Service可以用于完成長時間執行的后臺服務,例如下載文件、播放背景音樂等。

(3) 安卓應用需要監聽全局廣播。例如,應用需要監聽系統廣播,如檢測WiFi、開機啟動、sms消息等。

(4) 安卓應用需要實現組件間通信,我們可以通過綁定服務、動態廣播實現組件間的通信功能。

2.2 元模型定義

描述安卓應用的元模型定義了描述安卓應用框架的各個元素及其依賴關系,如圖1所示。

圖1 描述安卓應用的元模型(類圖)

表1給出了具體的元模型的定義,我們將元模型元素按照類別分為組件類、Widget類、事件監聽器類、關聯類和權限類。

表1 元模型定義表

2.3 元模型依賴關系定義

元模型的依賴關系主要分為以下五個方面:

(1) Transition與EventListener、Intent依賴關系定義

安卓應用組件之間的轉移是由事件驅動并由Intent負責傳遞消息,因此Transition與Intent、EventListener具有關聯關系。

(2) Component轉移依賴關系定義

我們把Component元素之間的依賴關系定義為Transition元素。Activity元素可以跳轉到多個其他的Activity;Activity可以啟動多個Service;Component元素可以向多個廣播發送通知。Transition必須設置好相應廣播的action屬性,否則廣播將接收不到通知。

(3) Activity、Widget、EventListener依賴關系定義

Activity可以包含多個Widget組件,所以Activity與Widget具有一對多的聚合關系。同樣,Widget組件可以觸發不同的事件,因此Widget與EventListener也具有一對多聚合關系。

(4) Activity與BroadcastReceiver依賴關系定義

動態廣播是安卓應用開發中實現跨進程通信的常用技術。在Activity中可以動態注冊BroadcastReceiver。Activity元素與動態的BroadcastReceiver元素具有一對多聚合關系。

(5) Widget與相應的常用事件監聽器依賴關系定義

每種安卓控件都具有與常用事件監聽器。

3 基于模版的框架代碼生成

3.1 基于Freemarker的代碼模板

本文采用Freemarker模板引擎自動生成安卓應用的代碼模板。Freemarker遵循MVC(model view controller)模式,是一款輕量級的代碼生成引擎。Freemarker模板引擎的語法規則類似于腳本語言,本身也具有一些編程能力,例如條件判斷、循環嵌套、集合等概念類似于其他編程語言。例如,${}指令表示可以替換為某個變量的值,if/elseif/else表示條件判斷,list指令表示循環遍歷對象集合,include指令表示嵌套子模板等。本文按照Freemarker的語法規則定義了源代碼、布局、配置模板。其中,源代碼模板包含了Activity模板、Service模板、BroadcastReceiver模板。在這些模板中,還可以設置內嵌子模板,例如控件模板、Intent模板、bindService模板等。圖2展示了上述模板和各個模板之間的依賴關系。

圖2 模板類圖

本文定義的模板類型非常多,由于篇幅的限制,我們僅展示了其中的一個模板。圖3展示了Activity模板,Activity模板主要用于生成Activity類的代碼框架,包括引入包、繼承Android.app.Activity類、重寫Activity的生命周期方法。同時,在onCreate方法中設置該Activity的布局文件、注冊動態廣播。在onDestory方法中,釋放綁定的Service,并且取消注冊動態廣播。圖中的高亮區域顯示了代碼模板的可變部分。Activity模板中可以包含多個widget、動態廣播,還可以綁定多個Service。我們將這部分可嵌套的模板定義為子模板,實現了模板之間的包含關系。例如,在onCreate方法中調用<#include "/Button.ftl">可以在Activity模板中嵌套Button模板。此外,在事件中還可以嵌套Intent模板從而實現Component元素之間的關聯關系。

圖3 Activity模板

3.2 基于描述模型的代碼模板定制

在前文所提出的元模型與代碼模板的基礎上,我們按照以下轉換過程實現框架代碼的自動生成,如圖4所示。首先,創建基于元模型標準的描述應用的模型,得到模型的XML描述文件。基于Freemarker的模板規則定義一組代碼模板,包括安卓應用的源代碼、布局、配置文件、子模板等。接著,將XML描述文件和代碼模板作為代碼生成器的輸入。隨后,將描述應用的模型映射到代碼模板的可變部分,最后生成應用的代碼框架。

圖4 描述應用的模型到應用代碼框架轉換圖

其中,應用的源代碼是應用程序的主體,根據模型和代碼映射規則生成的源代碼包括用戶定制的Activity類、Service類、 BroadcastReceiver類。AndroidManifest.xml配置文件可以定義用戶所配置的版本,注冊Activity、Service、BroadcastReceiver、Permission等。Layout布局文件是安卓應用程序的界面。我們的工具會根據模型和屬性配置,自動為Activity生成相應的布局文件。 圖5展示了一個簡單的示例,形象地展示了從特定模型到模板中可變部分的映射過程。

圖5 Activity綁定Service元模型與模板映射過程圖

由于模型的XML定義文件是XML DOM樹形式的,我們引入了Dom4j API解析該模型的定義文件,遍歷讀取該定義文件中的各個節點、屬性。同時,為其中的節點建立了Java模型與之一一對應。通過遍歷該XML文件,可以得到模型所創建的所有節點。根據Node節點的類型分類,將每個Node節點獨立作為一個源文件的輸出。例如,XML文件中包含BroadcastReceiver元素,將它注入BroadcastReceiver對象,然后生成對應的java源文件。對于類型是Activity的元素,生成它所包含的組件、事件監聽器、布局文件以及生命周期等。如果元素的類型是Service,那么根據他的啟動類型,判斷是否要綁定Service。對于BroadcastReceiver,判斷它是否是靜態等還是動態的。如果是靜態的廣播,那么需生成獨立的BroadcastReceiver文件,并在配置文件中注冊,否則在代碼中動態注冊。

4 工具實現與實驗

基于上述元模型,實現了Android應用框架自動生成工具。本節首先介紹了工具的架構設計。接著,我們使用該工具實現了一個具體的安卓應用“EBook”,并且展示了運行效果。

4.1 Android應用框架自動生成工具

Android應用框架自動生成工具的主要任務是開發一套能為安卓應用創建描述應用的模型的圖形編輯器和自動生成應用代碼框架的功能。工具架構主要分為五層,分別為Eclipse Platform、Platform Runtime、Tool Framework、工具層和應用層,如圖6所示。

圖6 Android應用框架自動生成工具架構圖

最底層的Eclipse Platform層代表Eclipse運行時環境。Eclipse是一個開源的平臺,可以使各種功能以插件的形式自由組裝的IDE,例如GMF、Draw2D、AndroidADT等。Android ADT[19]為開發安卓項目提供了運行時環境。工具框架層提供了圖形工具框架、Dom4j XML API、Android SDK所提供的API、代碼生成器。本文采用了Apache Freemarker代碼生成技術定制代碼模板,并且在運行時動態輸入數據模型自動生成不同的代碼。工具層包括了圖形編輯器,該圖形編輯器是在GMF的基礎上生成的,可以利用該編輯器創建描述安卓應用的模型。工具層還包括我們定義的代碼模板、元模型所描述元素到代碼模板中可變部分的映射過程、Android工程。我們首先通過EMF[20]創建描述應用的EMF元模型,為了使工具建模更加方便、形象,在元模型的基礎上加入了描述流程的節點如Process、Node、Start、End、Edge、Permissions。我們會在模型映射到代碼模板的定制過程中,從中提取出符合元模型定義的元素,再將模型轉換為最終的代碼。然后利用GMF圖形框架自動生成描述安卓應用的編輯器。隨后,按照Freemarker的模板語法規則定義好安卓應用的代碼框架、布局、配置文件。接著,將特定的模型與代碼模板的可變部分做映射,完成模型到代碼的轉換。工具架構圖的最上層是應用層,通過該工具,可以快速為安卓應用建模。

4.2 實驗案例

EBook是一個簡易的電子書應用,提供書籍列表、下載書籍、我的書籍、查看書籍內容的功能。EBook的架構包括手機客戶端和服務器端。用戶可以在手機客戶端下載、翻閱電子書。服務器端則為客戶端提供書籍的下載。

我們將使用Android應用框架自動生成工具生成應用的基本框架,再手動編寫具體的業務邏輯代碼以及服務器代碼等。應用包括三個界面BookListActivity、MyBookActivity、BookContentActivity。BookListActivity頁面提供許多未下載的書籍,通過列表的形式列出,用戶可以點擊列表中的書進行下載。進入MyBookActivity可以查看已下載的書籍列表。點擊已下載的書籍列表可以查看書籍的內容和信息。

4.3 實 驗

實例應用需將BookListActivity設置為起始界面,在BookListActivity中實現Button、List、Menu、TextView以及動態廣播。然后,為Button、List加入點擊事件監聽器。在點擊List時啟動一個后臺的DownLoadService來完成下載書籍的工作。下載完成之后發送Intent到動態廣播,告知用戶下載已完成。在點擊該Button之后跳轉到MyBookActivity界面。MyBookActivity包括一個TextView和一個List。List列出了所有已下載的書籍,點擊List可以進入第三個界面BookContentActivity。此外,我們還為實例應用添加了安卓應用的常用權限存儲卡訪問權限、震動權限、Internet訪問權限。存儲卡訪問權限用于保存、讀取已下載的書籍。Internet訪問權限主要用于下載書籍時訪問互聯網。震動權限用于發送消息給用戶時震動提示用戶下載完成。

使用Android應用框架自動生成工具生成實例需要創建一個新的Android工程,并在工程目錄下創建應用的模型文件。然后拖拽右側工具欄的模型元素,定義應用的模型節點和關聯關系,例如設置組件之間的跳轉,以何種方式啟動Service,實現發送廣播等。隨后,在屬性視圖完成每個節點的屬性定義。最后,使用代碼自動生成功能將模型轉換為代碼,從而得到應用的代碼框架,如圖7所示。

圖7 Android應用框架自動生成工具模型編輯界面

在完成了上述配置后,通過代碼自動生成功能可以得到工具自動生成的應用代碼框架。我們在該框架的基礎上手動添加了業務邏輯代碼并且美化了界面。圖8顯示了EBook的運行效果,圖中展示了應用的界面,包括書籍列表、我的書籍、查看書籍內容和版本信息界面。查看書籍內容界面則顯示了某一本圖書的內容。

圖8 示例應用運行圖

5 結 語

本文借鑒MDA思想提出了描述應用的元模型。同時,我們定義了代碼框架模板并且提出了從元模型所描述元素到代碼模板中可變部分的映射方法。基于本文提出的元模型,實現了Android應用框架自動生成工具。該工具可以為安卓應用創建描述應用的模型,生成應用程序的框架,包括源代碼、配置文件、布局文件。實驗部分通過一個實例演示了Android應用框架自動生成工具的功能。通過實驗,體現了Android應用框架自動生成工具可以為開發人員快速構建應用模型,自動生成應用的代碼框架。在此框架的基礎上繼續開發能夠有效提高應用開發效率。

在未來的工作中準備為元模型加入ContentProvider元素,使元模型更加完善。其次,本文將Widget與EventListener定義為抽象類型以便后續擴展。因此,可以為Android應用框架自動生成工具添加更多的控件使工具提供更強大的功能。

[1] Kleppe A,Warmer J,Bast W.解析MDA[M].人民郵電出版社,2004.

[2] The Eclipse Foundation.Graphical Modeling Project(GMP)[EB/OL].http://www.eclipse.org/modeling/gmp/.

[3] The Apache Software Foundation.Apache Freemarker[EB/OL].http://fre-emarker.incubator.apache.org/.

[4] Silva L P D,Fernando B E A.Model-Driven GUI Generation and Navigation for Android BIS Apps[C]//Model-Driven Engineering and Software Development (MODELSWARD),2014:400-407.

[5] Sabraoui A,Koutbi M E,Khriss I.GUI code generation for Android applications using a MDA approach[C]//Morocco Complex Systems (ICCS),2012:1-6.

[6] Lachgar M,Abdali A.Generating Android graphical user interfaces using an MDA approach[C]//Information Science and Technology (CIST),2014:80-85.

[7] Sabraoui A,Koutbi M E,Khriss I.A MDA-Based Model-Driven Approach to Generate GUI for Mobile Applications[J].International Review on Computers & Software,2013,8(3):844-852.

[8] Mannadiar R,Vangheluwe H.Modular Synthesis of Mobile Device Applications from Domain-Specific Models[C]//Automated Software Engineering(ASE),2010:21-28.

[9] Madari I,Lengyel L,Levendovszky T.Modeling the User Interface of Mobile Devices with DSLs[C]//8th International Symposium of Hungarian Researchers on Computational Intelligence and Informatics,2007:583-589.

[10] Lachgar M,Abdali A.Modeling and Generating the User Interface of Mobile Devices and Web Development with DSL[J].Journal of Theoretical and Applied Information Technology,2015,72(1):124-132.

[11] Parada A G,Brisolara L B D.A Model Driven Approach for Android Applications Development[C]//Computing System Engineering (SBESC),2012:192-197.

[12] Kraemer F A.Engineering Android Applications Based on UML Activities[M].Model Driven Engineering Languages and Systems,2011,6981:183-197.

[13] Le Goaer O,Barbier F,Cariou E,et al.Android Executable Modeling:Beyond Android Programming[C]//Future Internet of Things and Cloud (FiCloud),2014:411-414.

[14] Solis-Martinez J,Garcia-Menendez N,Bustelo C P G,et al.BPLOM:BPM Level-Oriented Methodology for Incremental Business Process Modeling and Code Generation on Mobile Platforms[J].International Journal of Interactive Multimedia and Artificial Intelligence,2013,2(2):13-27.

[15] SolisMartinez J,Espada J P,GarciaMenendez N,et al.VGPM:Using Business Process Modeling for Videogame Modeling and Code Generation in Multiple Platforms[J].Computer Standards & Interfaces,2015,42:42-52.

[16] AppInventor[EB/OL].http://code.google.com/p/app-invento r-releases/.

[17] RationalRhapsody[EB/OL].http://www.ibm.com/ developerworks/cn/ra-tional/model-driven-development-speed-delivery/index.html.

[18] Application Fundamentals Quickview[EB/OL].http://developer. android.com.

[19] Android Development Tools(ADT) Plugin[EB/OL].http://web.mit.edu/hychenj/MacData/afs/sipb/project/android/docs/tools/sdk/eclipse-adt.html.

[20] Eclipse Modeling Framework(EMF)[EB/OL].http://www.eclipse.rg/mo-deling/emf/o.

ANDROID CODE AUTOMATIC GENERATION BASED ON APPLICATION DESCRIPTION

Jiang Yizhou Shen Liwei Peng Xin Zhao Wenyun

(SchoolofSoftwareEngineering,FudanUniversity,Shanghai201203,China)(ShanghaiKeyLaboratoryofDataScience,FudanUniversity,Shanghai201203,China)

In the field of mobile development, Android application development has attracted many mobile manufacturers and developers. At present, most of the developers use a traditional way to code and configure for each part of the Android application based on the integrated development environments, which takes much time. However, part of the code and configuration files related to application framework may have a similar pattern, and software reuse and customizing can effectively improve the overall development efficiency of application. In order to achieve this goal, this paper puts forward a collection of method making reference to the thought of MDA (Model-Driven Architecture). Within this method, automatically generating android code framework is based on the description of the Android application. The method includes a meta-model which describes elements and associated relationships of Android applications as well as a set of reusable and customization supported code template. Based on the standard of the meta-model, description of a specific android application can drive the android framework to generate automatically based on the code template. Based on the method, this paper developed Android code framework automatic generation tool, and an example is carried out to show the availability of the method and tool.

Android MDA(Model-Driven Architecture) Automatic code generation Meta-model

2016-05-09。國家自然科學基金項目(61402113);國家高技術研究發展計劃項目(2013AA01A605)。江逸舟,碩士生,主研領域:軟件工程。沈立煒,副教授。彭鑫,教授。趙文耘,教授。

TP311.5

A

10.3969/j.issn.1000-386x.2016.11.040

猜你喜歡
定義界面模型
一半模型
重要模型『一線三等角』
國企黨委前置研究的“四個界面”
當代陜西(2020年13期)2020-08-24 08:22:02
重尾非線性自回歸模型自加權M-估計的漸近分布
基于FANUC PICTURE的虛擬軸坐標顯示界面開發方法研究
人機交互界面發展趨勢研究
3D打印中的模型分割與打包
成功的定義
山東青年(2016年1期)2016-02-28 14:25:25
手機界面中圖形符號的發展趨向
新聞傳播(2015年11期)2015-07-18 11:15:04
修辭學的重大定義
當代修辭學(2014年3期)2014-01-21 02:30:44
主站蜘蛛池模板: 国产丝袜91| 91成人在线观看视频| 国产成人禁片在线观看| 欧美a在线视频| 在线欧美a| 亚洲欧美一区二区三区蜜芽| 91精品啪在线观看国产| 18黑白丝水手服自慰喷水网站| 91精品久久久无码中文字幕vr| 国产精品va| 一级做a爰片久久免费| 欧美日韩免费观看| 蜜芽一区二区国产精品| 欧美a级在线| 免费又爽又刺激高潮网址| 福利一区在线| 一本大道香蕉中文日本不卡高清二区 | 国产高清自拍视频| 亚洲中文字幕无码爆乳| 国产成人夜色91| 精品国产黑色丝袜高跟鞋| 91欧美在线| 免费网站成人亚洲| 久久精品中文无码资源站| 精品无码人妻一区二区| 亚洲成aⅴ人片在线影院八| 一本色道久久88亚洲综合| 日韩黄色在线| 香蕉精品在线| 亚洲Aⅴ无码专区在线观看q| 91精品国产一区| 不卡无码网| 怡红院美国分院一区二区| 国产91全国探花系列在线播放| 亚洲成人福利网站| 欧美一级特黄aaaaaa在线看片| 久久综合丝袜长腿丝袜| 2020精品极品国产色在线观看 | 乱人伦视频中文字幕在线| 一本综合久久| 一级一级特黄女人精品毛片| 国产精品视频3p| 成人字幕网视频在线观看| 国产精品成人一区二区不卡| 国产丝袜第一页| 永久免费无码成人网站| 一区二区三区精品视频在线观看| 91国内视频在线观看| 午夜a视频| 精品综合久久久久久97超人| 欧美激情第一区| 香蕉久久国产超碰青草| 狠狠色香婷婷久久亚洲精品| 狠狠亚洲五月天| 无码网站免费观看| 国产性生大片免费观看性欧美| 免费看av在线网站网址| 玖玖精品在线| 国产精品护士| 亚洲精品不卡午夜精品| 亚洲一级毛片在线播放| 欧美va亚洲va香蕉在线| 国产香蕉在线视频| 成年免费在线观看| 国产美女精品在线| 亚洲AV无码一二区三区在线播放| 久久精品免费国产大片| 国产乱人伦偷精品视频AAA| 日韩免费毛片视频| 波多野结衣无码AV在线| 毛片在线播放a| 98精品全国免费观看视频| 一本大道AV人久久综合| 国产精品第三页在线看| 日韩精品无码不卡无码| 欧美色伊人| 久久99国产精品成人欧美| 色爽网免费视频| 国产精品视频导航| 伊人激情久久综合中文字幕| 青青青伊人色综合久久| 国产99视频精品免费视频7 |