久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

解析Android AIDL的實例與原理

瀏覽:9日期:2022-09-17 16:23:52
目錄一、概述二、創建 .aidl 文件三、生成 .java 文件四、傳輸復雜數據五、建立 service六、獲取服務七、分析調用過程一、概述

簡單來說,AIDL 就是定義一個接口,客戶端(調用端)通過 bindService 來與遠程服務端建立一個連接,在該連接建立時會將返回一個 IBinder 對象,該對象是服務端 Binder 的 BinderProxy。在建立連接時,客戶端通過 asInterface 函數將該 BinderProxy 對象包裝成本地的 Proxy,并賦值給Proxy類的 mRemote 字段,本地通過 mRemote 即可調用遠程方法。

二、創建 .aidl 文件

首先打開 Android Studio,new 一個 AIDL file。具體代碼如下 :

interface IMyAidlInterface { /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);}

basicTypes 方法事接口自帶的,不過可以知道,在 aidl 中只能使用這些基本類型參數:int, long, boolean, float,double, String ;

除了basicTypes 方法之外,我們也可以添加自己的方法。因此,可以刪除basicTypes 方法,添加自己的方法。

三、生成 .java 文件

添加完方法之后,選中 .aidl 文件,在彈出的菜單中選擇 Synchronize LocalAIDLS... Service.java,就會會自動幫你生成對應的 java 代碼。

格式化代碼之后,如下所示:

package com.example.databasetest;public interface IMyAidlInterface extends android.os.IInterface { /** * Local-side IPC implementation stub class. */ public static abstract class Stub extends android.os.Binder implements com.example.databasetest.IMyAidlInterface {private static final java.lang.String DESCRIPTOR = 'com.example.databasetest.IMyAidlInterface';/** * Construct the stub at attach it to the interface. */public Stub() { this.attachInterface(this, DESCRIPTOR);}/** * Cast an IBinder object into an com.example.databasetest.IMyAidlInterface interface, * generating a proxy if needed. */public static com.example.databasetest.IMyAidlInterface asInterface(android.os.IBinder obj) { if ((obj == null)) {return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin != null) && (iin instanceof com.example.databasetest.IMyAidlInterface))) {return ((com.example.databasetest.IMyAidlInterface) iin); } return new com.example.databasetest.IMyAidlInterface.Stub.Proxy(obj);}@Overridepublic android.os.IBinder asBinder() { return this;}@Overridepublic boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { switch (code) {case INTERFACE_TRANSACTION: { reply.writeString(DESCRIPTOR); return true;}case TRANSACTION_basicTypes: { data.enforceInterface(DESCRIPTOR); int _arg0; _arg0 = data.readInt(); long _arg1; _arg1 = data.readLong(); boolean _arg2; _arg2 = (0 != data.readInt()); float _arg3; _arg3 = data.readFloat(); double _arg4; _arg4 = data.readDouble(); java.lang.String _arg5; _arg5 = data.readString(); this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); reply.writeNoException(); return true;} } return super.onTransact(code, data, reply, flags);}private static class Proxy implements com.example.databasetest.IMyAidlInterface { private android.os.IBinder mRemote; Proxy(android.os.IBinder remote) {mRemote = remote; } @Override public android.os.IBinder asBinder() {return mRemote; } public java.lang.String getInterfaceDescriptor() {return DESCRIPTOR; } /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ @Override public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException {android.os.Parcel _data = android.os.Parcel.obtain();android.os.Parcel _reply = android.os.Parcel.obtain();try { _data.writeInterfaceToken(DESCRIPTOR); _data.writeInt(anInt); _data.writeLong(aLong); _data.writeInt(((aBoolean) ? (1) : (0))); _data.writeFloat(aFloat); _data.writeDouble(aDouble); _data.writeString(aString);// 這里是重點,proxy 持有引用,這樣就可以進行數據交換,也不會暴露這個對象 mRemote.transact(Stub.TRANSACTION_basicTypes, _data, _reply, 0); _reply.readException();} finally { _reply.recycle(); _data.recycle();} }}static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0); } /** * Demonstrates some basic types that you can use as parameters * and return values in AIDL. */ public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException;}

如果,你需要修改 .aidl 文件,那么修改之后,選擇 build -> make project 即可,會重新生成對應的java文件。

對于生成的這個java 類,很多剛接觸的人會不理解,這里需要解釋下:

IMyAidlInterface :這個是我們自己定義的一個 servier 接口,也就是將你想要有的功能定義在接口中; IBinder:定義了與遠程對象的交互協議,代表一種跨進程傳輸的能力,實現這個接口,就能將這個對象進行跨進程傳遞,但是如果要使用的話,推薦繼承其子類 Binder; Binder:實現了 IBinder 接口,代表的其實就是Binder 本地對象。BinderProxy 類是 Binder 類的一個內部類,它代表遠程進程的 Binder 對象的本地代理;這兩個類都繼承自IBinder, 因而都具有跨進程傳輸的能力;實際上,在跨越進程的時候,Binder 驅動會自動完成這兩個對象的轉換。 Stub: AIDL 的時候,編譯工具會給我們生成一個名為 Stub 的靜態內部抽象類;這個類繼承了 Binder, 說明它是一個 Binder 本地對象,它實現了 IInterface 接口,表明它具有 Server 承諾給 Client 的能力;Stub 是一個抽象類,具體的 IInterface 的相關實現需要開發者自己實現。 IInterface:IInterface 代表的就是 Server 進程對象具備什么樣的能力(能提供哪些方法,其實對應的就是 AIDL 文件中定義的接口) proxy:Stub 的靜態內部類,是一個實現了IMyAidlInterface接口,所以他是一個遠程代理對象,可以用于返回給客戶端用。當 client 調用 proxy的某個方法的時候,會將參數傳到 proxy 中,在通過其持有的遠程實際對象,將方法名和參數等都傳給遠程實際對象,然后就會回調onTransact,對應的方法就會被調用,以此來實現跨進程調用。四、傳輸復雜數據

如果,需要傳遞復雜數據,那么就需要實現Parcelable 接口,可序列化:

public class Info implements Parcelable { private String content; public String getContent() {return content; } public void setContent(String content) {this.content = content; } public Info() { } public Info(Parcel in) {content = in.readString(); } public static final Creator<Info> CREATOR = new Creator<Info>() {@Overridepublic Info createFromParcel(Parcel in) { return new Info(in);}@Overridepublic Info[] newArray(int size) { return new Info[size];} }; @Override public int describeContents() {return 0; } @Override public void writeToParcel(Parcel dest, int flags) {dest.writeString(content); } /** * 參數是一個Parcel,用它來存儲與傳輸數據 * * @param dest */ public void readFromParcel(Parcel dest) {//注意,此處的讀值順序應當是和writeToParcel()方法中一致的content = dest.readString(); } //方便打印數據 @Override public String toString() {return 'content : ' + content; }}

與此同時,也要建一個 info.aidl 文件,表明數據也是可以傳遞的。

package com.viii.aidlclient;//注意:Info.Info.java的包名應當是一樣的//這個文件的作用是引入了一個序列化對象 Info 供其他的AIDL文件使用//注意parcelable是小寫parcelable Info;

這樣就可以使用 info 對象了。 不用在受前面的基本類型變量所控制。

五、建立 service

接下去,新建一個Service負責接收消息,并在AndroidManifest.xml里面注冊 Service:

public class MyService extends Service { private static final String TAG = 'MyService'; // private MyBinder mMyBinder = new MyBinder(); @Nullable @Override public IBinder onBind(Intent intent) {Log.d(TAG, 'onBind: '); // 應該返回 mBinderreturn null; } @Override public void onCreate() {Log.d(TAG, 'onCreate: ');super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) {Log.d(TAG, 'onStartCommand: ');return super.onStartCommand(intent, flags, startId); }// 這里就是服務端的實現,繼承了 stub,想要怎么樣的能力,自己去實現 private final IMyAidlInterface.Stub mBinder = new IMyAidlInterface.Stub() {@Overridepublic void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {// 具體實現過程} };}

這時候,可以basicTypes 方法添加具體函數代碼,實現你想要的功能。

當我們在本地獲取到代理后之后,調用basicTypes 就會觸發服務端的調用。

六、獲取服務

接下去在 mainactivity 中進行綁定。

public class MainActivity extends AppCompatActivity { private static final String TAG = 'MainActivity'; private IMyAidlInterface mService; private boolean mIsBound; private AdditionServiceConnection mServiceConnection; @Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);doBindService() ; }/** * bind service */ private void doBindService() {mServiceConnection = new AdditionServiceConnection();Intent intent = new Intent(this, MyService.class);bindService(intent, mServiceConnection, BIND_AUTO_CREATE); } /** * unbind service */ private void doUnbindService() {if (mIsBound) { unbindService(mServiceConnection); mServiceConnection = null; mIsBound = false;} } /** * ServiceConection */ class AdditionServiceConnection implements ServiceConnection {@Overridepublic void onServiceConnected(ComponentName name, IBinder service) { // 連接的時候獲取本地代理,這樣我們就可以調用 service 中的方法了。 mService = IMyAidlInterface.Stub.asInterface((IBinder) service); mIsBound = true; try {//設置死亡代理service.linkToDeath(mDeathRecipient, 0); } catch (RemoteException e) {e.printStackTrace(); } Log.d(TAG, 'onServiceConnected: ');}@Overridepublic void onServiceDisconnected(ComponentName name) { mService = null; mIsBound = false; Log.d(TAG, 'onServiceDisconnected: ');} } /** * 監聽Binder是否死亡 */ private IBinder.DeathRecipient mDeathRecipient = new IBinder.DeathRecipient() {@Overridepublic void binderDied() { if (mService == null) {return; } mService.asBinder().unlinkToDeath(mDeathRecipient, 0); mService = null; //重新綁定 doBindService();} }; @Override protected void onStop() {super.onStop();doUnbindService(); }}

將遠程服務的 binder 拿到之后,我們就可以調用相關方法實現自己的功能呢。

到這里,一個 AIDL 就被我們實現了。

七、分析調用過程

看看 asInterface 方法,我們在 bind 一個 Service 之后,在 onServiceConnecttion 的回調里面,就是通過這個方法拿到一個遠程的 service 的,這個方法做了什么呢?

/** * Cast an IBinder object into an com.example.databasetest.IMyAidlInterface interface, * generating a proxy if needed. */public static com.example.databasetest.IMyAidlInterface asInterface(android.os.IBinder obj) { if ((obj == null)) {return null; } android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR); if (((iin != null) && (iin instanceof com.example.databasetest.IMyAidlInterface))) {return ((com.example.databasetest.IMyAidlInterface) iin); }  // 實際上,代理對象持有真實對象,同時代理對象會對數據進行處理后,再調用實體對象的方法 return new com.example.databasetest.IMyAidlInterface.Stub.Proxy(obj);}

首先看函數的參數IBinder類型的 obj,這個對象是驅動給我們的,如果是 Binder 本地對象,那么它就是 Binder 類型,如果是 Binder 代理對象,那就是BinderProxy類型;它會試著查找 Binder 本地對象,如果找到,說明 Client 和 Server 都在同一個進程,這個參數直接就是本地對象,直接強制類型轉換然后返回。

如果找不到,說明是遠程對象(處于另外一個進程)那么就需要創建一個 Binder 代理對象,讓這個 Binder 代理實現對于遠程對象的訪問。一般來說,如果是與一個遠程 Service 對象進行通信,那么這里返回的一定是一個 Binder 代理對象,這個 IBinder 參數的實際上是 BinderProxy;

再看看我們對于 aidl 的basicTypes方法的實現;在 Stub 類里面,basicTypes是一個抽象方法,我們需要繼承這個類并實現它;如果 Client 和 Server 在同一個進程,那么直接就是調用這個方法;那么,如果是遠程調用,這中間發生了什么呢?Client 是如何調用到 Server 的方法的?

對于遠程方法的調用,是通過 Binder 代理完成的,在這個例子里面就是Proxy類;Proxy對于basicTypes方法的實現如下:

public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException { android.os.Parcel _data = android.os.Parcel.obtain(); android.os.Parcel _reply = android.os.Parcel.obtain(); try {_data.writeInterfaceToken(DESCRIPTOR);_data.writeInt(anInt);_data.writeLong(aLong);_data.writeInt(((aBoolean) ? (1) : (0)));_data.writeFloat(aFloat);_data.writeDouble(aDouble);_data.writeString(aString);// 這里是重點,調用的是實體對象的方法mRemote.transact(Stub.TRANSACTION_basicTypes, _data, _reply, 0);_reply.readException(); } finally {_reply.recycle();_data.recycle(); }}

它首先用 Parcel 把數據序列化了,然后調用了 transact 方法;這個 transact 到底做了什么呢?這個 Proxy 類在 asInterface 方法里面被創建,前面提到過,如果是 Binder 代理那么說明驅動返回的 IBinder 實際是 BinderProxy,因此我們的 Proxy 類里面的 mRemote 實際類型應該是BinderProxy;我們看看 BinderProxy 的 transact 方法:( Binder.java 的內部類)

public native boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException;

這是一個本地方法;它的實現在 native 層,具體來說在 frameworks/base/core/jni/android_util_Binder.cpp 文件,里面進行了一系列的函數調用,調用鏈實在太長這里就不給出了;要知道的是它最終調用到了talkWithDriver函數;看這個函數的名字就知道,通信過程要交給驅動完成了;這個函數最后通過 ioctl 系統調用,Client 進程陷入內核態,Client 調用 basicTypes 方法的線程掛起等待返回;驅動完成一系列的操作之后喚醒 Server 進程,調用了Server進程本地對象的 onTransact 函數(實際上由 Server 端線程池完成)。我們再看 Binder 本地對象的 onTransact 方法(這里就是 Stub 類里面的此方法):

public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException { switch (code) {case INTERFACE_TRANSACTION: { reply.writeString(DESCRIPTOR); return true;}case TRANSACTION_basicTypes: { data.enforceInterface(DESCRIPTOR); int _arg0; _arg0 = data.readInt(); long _arg1; _arg1 = data.readLong(); boolean _arg2; _arg2 = (0 != data.readInt()); float _arg3; _arg3 = data.readFloat(); double _arg4; _arg4 = data.readDouble(); java.lang.String _arg5; _arg5 = data.readString(); this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5); reply.writeNoException(); return true;} } return super.onTransact(code, data, reply, flags);}

在 Server 進程里面,onTransact 根據調用號(每個 AIDL 函數都有一個編號,在跨進程的時候,不會傳遞函數,而是傳遞編號指明調用哪個函數)調用相關函數。

在這個例子里面,調用了 Binder 本地對象的 basicTypes 方法;這個方法將結果返回給驅動,驅動喚醒掛起的 Client 進程里面的線程并將結果返回。于是一次跨進程調用就完成了。

至此,你應該對 AIDL 這種通信方式里面的各個類以及各個角色有了一定的了解;它總是那么一種固定的模式:一個需要跨進程傳遞的對象一定繼承自 IBinder,如果是 Binder 本地對象,那么一定繼承 Binder 實現 IInterface,如果是代理對象,那么就實現了 IInterface 并持有了 IBinder 引用;

Proxy 與 Stub 不一樣,雖然他們都既是 Binder 又是 IInterface,不同的是 Stub 采用的是繼承(is 關系),Proxy采用的是組合(has 關系)。他們均實現了所有的 IInterface 函數。

不同的是,Stub又使用策略模式調用的是虛函數(待子類實現),而 Proxy 則使用組合模式。為什么Stub采用繼承而 Proxy 采用組合?事實上,Stub 本身 is 一個 IBinder(Binder),它本身就是一個能跨越進程邊界傳輸的對象,所以它得繼承 IBinder 實現 transact 這個函數從而得到跨越進程的能力(這個能力由驅動賦予)。

Proxy 類使用組合,是因為他不關心自己是什么,它也不需要跨越進程傳輸,它只需要擁有這個能力即可,要擁有這個能力,只需要保留一個對 IBinder 的引用。

以上就是解析Android AIDL的實例與原理的詳細內容,更多關于Android AIDL的資料請關注好吧啦網其它相關文章!

標簽: Android
相關文章:
主站蜘蛛池模板: 日韩欧美在线一区二区 | 国产精品美女久久久久久久久久久 | 四虎成人在线视频 | 玖草在线视频 | 久久久精品一区二区 | 亚洲一区二区三区在线播放 | 色玖玖综合 | 黄色在线观看 | 欧美一区二区三区在线 | 久久福利 | 精品电影 | 奇米av| 亚洲经典视频在线观看 | 精品国产31久久久久久 | 九九九九九九精品任你躁 | 亚洲精品粉嫩美女一区 | 91精品在线播放 | 亚洲精品久久久久久久久久久 | 一区二区三区国产好的精 | 亚洲国产91 | 国外成人在线视频 | 日韩精品在线播放 | 日本爽快片毛片 | 99热国产在线观看 | 一级淫片免费 | 免费av片在线 | 91婷婷射 | 亚洲专区在线播放 | 搞黄免费视频 | 久草福利在线视频 | 国产中文视频 | 国产精品日产欧美久久久久 | 精品一区不卡 | 精品久久一二三区 | 一区二区三区四区在线 | 黄色大片免费网站 | 成人在线免费视频 | 色毛片 | 国产欧美久久久久久 | 青青草一区 | 欧美日韩中文 | 不卡视频一区 | 狠狠操麻豆| 97成人在线免费视频 | 免费的污网站 | 特一级毛片 | 欧美一区二区三区在线视频 | 日日爱夜夜爱 | 国产一区中文字幕 | 中文字幕日韩在线 | 亚洲欧美激情精品一区二区 | 97在线观看视频 | 99久久久99久久国产片鸭王 | 一区二区在线不卡 | 中文在线a在线 | 久久久久久久国产 | 九色porny国模私拍av | 中国一级特黄毛片大片 | 热久久这里只有精品 | 国产精品99久久久久久动医院 | 中文字幕乱码一区二区三区 | 品久久久久久久久久96高清 | www视频在线观看 | 国产激情视频网 | 欧美精品在线看 | 国产精品久久久 | 国产成人av一区 | 99热播在线 | 亚洲不卡 | 午夜午夜精品一区二区三区文 | 天天干天天看天天操 | 国产美女自拍视频 | 久久精品一区二区三区四区 | 亚洲国产精品久久久久久久 | 成人久久久精品乱码一区二区三区 | 国产精品久久久久久久午夜片 | 青青草免费在线视频 | 国产一区免费在线观看 | 91视频免费在线看 | 日韩在线视频中文字幕 | 红桃av一区二区 | 免费观看一级特黄欧美大片 | 一级黄免费看 | 人操人人 | 日韩喷潮 | 91麻豆视频 | 国产情侣免费视频 | 中文字幕66页 | www,99热 | 97国产精品 | 91在线播放视频 | 美女久久 | 国产精品二区三区在线观看 | 欧美一级网站 | 国产精品a一区二区三区网址 | 一区二区三区自拍 | 伊人天堂网| 久热精品视频 | 成人激情视频免费观看 | 欧美激情精品久久久久久变态 | 亚洲久久久久久 | 97国产精品视频 | 国产日韩欧美一区二区 | 99re在线| 国产成人福利在线观看 | 午夜激情免费在线观看 | 免费一级毛片 | 欧美福利视频 | 国产1区2区3区 | 亚洲精品1区 | 欧美成年网站 | 成人a在线视频免费观看 | 午夜视频黄 | 国产看片网站 | 久久久久国产一区二区三区 | 性色浪潮| a一级片在线观看 | 久久另类ts人妖一区二区 | 午夜影院免费 | 免费国产一区 | 涩涩导航 | 久久精品| 欧美精品综合在线 | 亚洲视频免费在线 | 秋霞电影院午夜伦 | 日韩有码在线观看 | a久久久 | 一区二区三区四区在线 | 精品国产黄a∨片高清在线 日韩一区二 | 中文字幕av一区 | 久久人体 | 亚色在线| 福利视频三区 | 日韩国产 | 一级毛片一级毛片一级毛片 | 精品国产一区一区二区三亚瑟 | 国产欧美日韩综合精品 | 91视频国产区 | 免费亚洲成人 | 99视频精品| 欧美激情高清 | 久久久久无码国产精品一区 | 谁有毛片 | 久久三级视频 | 在线免费观看日韩视频 | 成人在线欧美 | 日韩啊啊啊 | 日本成人中文字幕 | 日本视频网 | 国产精品99久久久久久大便 | 91免费电影 | 日韩国产在线播放 | 国产中文视频 | 欧美日韩一区二区电影 | 国产成人久久 | aaaaaa黄色片| 丝袜+亚洲+另类+欧美+变态 | 日韩色区 | 日日射天天干 | 国产农村妇女精品一二区 | 亚洲一区二区三区四区在线 | 午夜影院免费视频 | 国产毛片一区二区 | 亚洲人人舔人人 | 午夜影视免费观看 | 亚洲一级视频在线 | 欧美一区二区三区在线观看 | 国产精品亚洲一区二区三区 | 久久久久亚洲精品 | 国产精品久久九九 | 日韩精品一区二区三区四区视频 | 亚洲成人黄色 | 日韩午夜视频在线观看 | 国产婷婷精品av在线 | 亚洲另类视频 | 国产成人精品久久二区二区 | 欧美一区二区三区xxxx监狱 | 亚洲成人一区 | 日韩av免费看| 国产午夜精品福利 | 中文字幕av高清 | 精品亚洲一区二区 | 亚洲成人精品在线观看 | 中文一二区 | 成人涩涩日本国产一区 | 一级一片免费视频 | 亚洲视频在线看 | 在线观看亚洲视频 | 午夜视频网址 | 一级全黄少妇性色生活片毛片 | 成人一级毛片 | av成人毛片 | 一区二区蜜桃 | 国产 欧美 日韩 一区 | 亚洲欧洲日韩在线 | 国产成人精品免费视频大全最热 | 日韩一区二区三区在线 | 欧美日韩黄色一级片 | 91视频在线免费观看 | 国产精品视频免费播放 | a久久免费视频 | 福利视频网址导航 | 精品99在线| 特黄视频 | 中文字幕一区在线观看视频 | 午夜日韩| 国产成人精品一区二区三区视频 | 国产一区二区三区四区五区加勒比 | 国产一区二区三区久久久久久久久 | 国产激情偷乱视频一区二区三区 | 日韩在线不卡 | 欧美aⅴ | 欧美性一区二区三区 | 欧美国产日韩一区 | 一区二区三区四区精品 | 久久久久久久一区 | 欧美日韩大陆 | 国产视频一区在线 | 日韩中文一区 | 欧美综合国产精品久久丁香 | 天天干天天看天天操 | 性视频网站免费 | 欧美精品一二三区 | 在线碰 | 国产女无套免费网站 | 四虎免看黄 | 天堂免费在线 | 91精品国产高清久久久久久久久 | 91精品一二区| 天堂男人在线 | 亚洲精品在 | 日韩欧美精品在线 | 国产中文字幕在线 | 日本黄色免费播放 | 久久精品福利 | 毛片一区二区三区 | 久久久久久亚洲 | 日韩在线成人 | 久久久一 | 爱干在线| 亚洲欧洲在线观看 | 一级黄色影片在线观看 | 久久久久久久久久久久99 | 亚洲91 | 欧美亚洲国产一区二区三区 | a免费在线 | 国产www网站 | 永久黄网站色视频免费 | 日韩精品成人 | 日本在线观看网站 | 亚洲国产一二区 | 久久久精品一区二区 | 黄色免费在线观看网址 | 免费毛片网 | 亚洲欧美成人影院 | 欧美日韩国产一区二区三区 | 久久久久久精 | 久久久国产视频 | 天天干夜夜骑 | 亚洲精品视频在线 | 69免费视频| 精品国产髙清在线看国产毛片 | 欧美日本免费一区二区三区 | 国产精品视频一二三区 | 亚洲精品乱码久久久久久 | 成人亚洲精品 | 国产亚洲精品综合一区91555 | 亚洲精品资源在线观看 | 欧美日韩在线免费观看 | 日韩污视频在线观看 | 91久久久久久久久久久久久久久久 | 毛片a级片| 麻豆一区 | 久久久久高清 | 99re在线精品 | 91视频免费看| 久久成人国产 | 99精品99| 久热免费在线观看 | 亚洲精品国产setv | 能在线观看的黄色网址 | 五月激情综合网 | 久久精品一区二区三区不卡牛牛 | 欧美成人精品一区二区男人看 | 男女中文字幕 | 国产精品久久久久久一级毛片 | 久久久国产精品入口麻豆 | 国产精品免费观看 | 成人亚洲免费视频 | 亚洲精品一区二区网址 | 日韩在线观看一区 | 日韩久久久久久 | 欧美日韩精品一二区 | 91成人在线| 欧美与黑人午夜性猛交久久久 | 国产乱码一区二区三区 | 欧美日韩第一页 | 成人免费在线观看 | 欧美精品一区二区蜜臀亚洲 | 久久激情网站 | 久久精品欧美一区二区三区不卡 | 成人午夜免费网站 | 亚洲黄网在线观看 | 午夜欧美一区二区三区在线播放 | 波多野结衣一区二区三区中文字幕 | 一区二区国产在线观看 | 成人免费一区二区三区视频网站 | 国产精品一二 | 日本一区二区三区免费观看 | 色十八| 国产成人在线一区二区 | 精品欧美一区二区精品久久久 | 成人亚洲 | 妞干网av| 在线观看羞羞 | 一区二区视频 | 国产伦精品久久久一区二区三区 | 国产在视频一区二区三区吞精 | 电影91久久久 | 国产午夜精品久久久久久久 | 在线观看亚洲视频 | 天天干天天爱天天 | 亚洲午夜在线 | 亚洲国产成人av好男人在线观看 | 一级免费毛片 | 美女视频一区 | 91视频国产一区 | 国产精品日韩欧美 | 二区国产| 大胆裸体gogo毛片免费看 | 中文在线一区 | 久久av综合网| 91精品久久久久久久久中文字幕 | 天堂在线一区二区 | 一区二区三区四区日韩 | 久久av资源| 在线一级片 | 久久99精品久久久久久青青日本 | 亚洲日本精品视频 | 在线观看中文字幕 | 色爱区综合五月激情 | 成人高清在线观看 | 亚洲免费在线 | 杨门女将寡妇一级裸片看 | 亚洲人人| 欧美一级网站 | 自拍偷拍在线视频 | 久久e久久 | 国产色| 成人免费看 | 国产精品久久久久一区二区三区 | 亚洲第一av网站 | 男女全黄一级一级高潮免费看 | 亚洲精品视频在线播放 | 亚洲h视频 | 青青草一区二区三区 | 山岸逢花在线观看 | 亚洲精品视频在线观看网站 | 亚洲综合视频 | 免费视频一区二区三区在线观看 | 欧美日韩在线精品 | 一级黄色片日本 | 国产不卡在线视频 | 一区二区在线看 | 日本一本视频 | 男女免费在线观看 | 欧美激情精品一区 | 一级视频黄色 | 日韩欧美网 | 91麻豆视频 | 欧美精品1区 | 久久九九精品久久 | 久久久久久国产视频 | 国产一区二区三区四区在线观看 | 亚洲精品久久久狠狠狠爱 | 亚洲一区不卡在线 | 国产三级自拍 | 国产精品久久久久久久竹霞 | 亚洲一二视频 | 97视频在线 | 日韩精品一区二区三区视频播放 | 一区二区在线视频 | 欧美色性 | 凹凸日日摸日日碰夜夜爽孕妇 | 99爱免费观看国语 | 国产精品a免费一区久久电影 | 国产视频999| 成av人片在线观看www | 久久久久亚洲国产 | 国变精品美女久久久久av爽 | 亚洲一区二区三 | 91免费版在线观看 | 日本黄网站在线观看 | 日产精品久久久一区二区 | 伊人在线 | 久久九| 久久精品一区二区三区四区 | 国产视频久久 | 欧美福利网址 | www.国产91 | 精品国产鲁一鲁一区二区在线观看 | 久久福利电影 | 有码在线 | 国产一二三在线 | 美国黄色毛片 | 国产日韩欧美一区二区 | 久久一区二区三区四区 | 久久99国产精品 | av免费网站在线观看 | 久久中文字幕一区二区三区 | www.久久久.com | av中文字幕第一页 | 免费黄色在线 | 天天干国产 | 天天干狠狠干 | 影音先锋中文字幕在线 | 色网站免费视频 | 久久三区| 依人99| 国产高清一级片 | 视频一区 中文字幕 | 亚洲精品一区二区三区蜜桃下载 | 国产乱人伦av在线a jizz久久久 www.亚洲 | 国产一区二区三区在线 | 538在线精品 | 免费看片一区二区三区 | 欧美午夜视频 | av在线一区二区 | 黄a在线| 国产精品亚洲成在人线 | 欧美亚洲视频 | 成人免费国产 | 夜夜操av | 超碰综合| 日韩性xxx | 精一区二区 | 成人在线网址 | 欧美 亚洲 一区 | 日韩在线大片 | 日本一区二区在线视频 | 国产精品中文字幕在线 | 欧美国产精品久久久 | 黄色一级影视 | 啪一啪操一操 | 男女爱爱免费视频 | 欧美久久综合 | 欧美日韩h| 国产成人精品一区二区三区四区 | 国产精品国产三级国产aⅴ中文 | 日韩在线视频一区 | 午夜精品一区二区三区免费视频 | 日韩成人精品 | 日本高清无卡码一区二区久久 | 日本五月婷婷 | 欧美日韩黄色一级片 | 色婷婷综合网 | 一级毛片国产 | 自拍偷拍99 | concern超碰在线 | 午夜色福利 | 欧美一区二区三区在线视频观看 | 黄网在线免费观看 | 亚洲一区二区国产 | 思九九爱九九 | 狠狠久久伊人中文字幕 | 自拍偷拍欧美 | 一区二区三区高清 | 一本大道久久a久久精二百 国产精品片aa在线观看 | 久久久久国产一级毛片高清版小说 | 四虎成人免费电影 | 国产欧美精品一区二区 | 龙珠z普通话国语版在线观看 | 午夜久久久久 | 欧美日一区二区 | 黄色地址| 国产一区二区在线电影 | 91精品国产91久久久久久吃药 | 日韩一区精品 | 中文字幕亚洲在线 | 国产精品一区在线观看你懂的 | av大全在线 | 亚洲午夜精品视频 | 久久久久黄 | 久久久国产精品 | 亚洲毛片 | 一区免费观看 | 国产中文字幕在线观看 | 狠狠操综合网 | 欧美国产日韩精品 | 天天操网址 | 欧美日韩美女 | 999成人网 | 91影院在线观看 | 一区二区三区久久 | 91视频黄色 | 日韩1区3区4区第一页 | 91日韩欧美| 在线视频中文字幕 | 亚洲精品久久久久久久久久久久久 | 一区二区激情 | 亚洲第一福利视频 | 久久男人天堂 | 99热播在线 | 免费的黄色网 | 亚洲精品久久久久久一区二区 | 亚洲精品一区二区三区蜜桃久 | 热re99久久精品国产99热 | 欧美成年黄网站色视频 | 韩国精品 | 99这里只有精品 | 亚洲精品视频在线播放 | 91丁香婷婷综合久久欧美 | 国产精品18久久久久久首页狼 | 久草视频免费在线播放 | 午夜久久久| 欧美一级二级三级视频 | 国产成人精品一区二区在线 | 综合网视频 | 久久精品中文字幕 | 一区二区免费在线视频 | 国产99久久精品一区二区永久免费 | 精品一区二区在线观看 | 国产免费一区二区三区 | 黄色a级网站 | 日本一级淫片免费看 | 密色视频 | 91视频免费观看 | 国产欧美精品一区二区三区四区 | 精品视频三区 | 日韩无 | 性培育学校羞耻椅子调教h 欧美精品网站 | 午夜视频网站 | 色免费视频 | 91麻豆精品国产91久久久更新资源速度超快 | 成人深夜福利视频 | 亚洲一区中文字幕 | 亚洲成人精品在线观看 | 国产精品国产精品国产专区不片 | 国产精品一区二区三区四区 | 99免费观看| 精品一区二区在线观看 | 久久99精品久久久久久园产越南 | 91嫩草在线 | 亚洲最新中文字幕 | 国产色 | 成人无遮挡毛片免费看 | 成人精品一区二区三区电影黑人 | 国产精品网站在线观看 | 日韩精品一区二区三区第95 | 九九亚洲精品 | 国产精品免费视频一区 | 免费成人在线网站 | www.91av在线| 欧美在线视频三区 | 久久综合一区二区三区 | 岛国一区| 日韩av在线中文字幕 | 成人欧美一区二区三区黑人孕妇 | 一本一道久久a久久精品逆3p | 亚洲一区二区在线播放 | 久久成人一区 | 欧美videosex性欧美黑吊 | 亚洲毛片在线观看 | 在线免费观看一区 | 久久久精品综合 | 亚洲国产精品成人 | 91亚洲国产成人久久精品网站 | 精品视频一区二区 | 日本一区二区三区免费观看 | 国产精品国色综合久久 | 国产在线一级视频 | 国产精品一区一区三区 | 在线国产区 | 成人亚洲精品 | 亚洲一区二区免费看 | 国产精品久久久久久久久久久不卡 | 久久男人天堂 | 亚洲第一黄 | 伊人国产精品 | 婷婷伊人| 婷婷亚洲五月 | 国产色视频在线观看免费 | 久久午夜影院 | 欧美成人激情视频 | 伊人精品视频在线观看 | 99久久久无码国产精品 | 91亚洲精品乱码久久久久久蜜桃 | 羞羞视频免费网站 | 成年人免费看 | 亚洲国产精品精华液com | 国产精品伦理一区 | 天天射影院 | 久色| 中文字幕亚洲欧美 | 久久精品一区 | 亚洲处破女 | 日韩五码在线 | 成人午夜在线 | 中文字幕高清一区 | 午夜午夜精品一区二区三区文 | 天天综合视频 | 成人影院欧美黄色 | 日韩特级 | 精品国产九九 | 免费一区二区三区视频在线 | 国产精品网站在线观看 | av一区二区三区 | 一级一片免费视频 | 亚洲精品一区二区网址 | 国产精品欧美一区二区三区 | 欧美一区二区在线观看 | 免费国产黄网站在线观看视频 | 91精品国产综合久久久久久 | 色小妹三区 | 精品不卡 |