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

源碼分析廣播運行原理

移動開發 Android
在 Android 里面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生一個廣播,應用程序開發者也可以監聽這些廣播并做出程序邏輯的處理。

[[436974]]

前言

在 Android 里面有各種各樣的廣播,比如電池的使用狀態,電話的接收和短信的接收都會產生一個廣播,應用程序開發者也可以監聽這些廣播并做出程序邏輯的處理;

今天我們就來分析下廣播的運行機制

一、廣播原理機制詳解

1、靜態廣播注冊流程分析

  • 靜態廣播是通過PackageManagerService在啟動的時候掃描已安裝的應用去注冊的;
  • 在PackageManagerService的構造方法中,會去掃描應用安裝目錄,順序是先掃描系統應用安裝目錄再掃描第三方應用安裝目錄;

PackageManagerService.scanDirLI就是用于掃描目錄的方法:

  1. private void scanDirLI(File dir, int flags, int scanMode, long currentTime) { 
  2.    String[] files = dir.list(); 
  3.    if (files == null) { 
  4.        return
  5.    } 
  6.    int i; 
  7.    for (i=0; i<files.length; i++) { 
  8.        File file = new File(dir, files[i]); 
  9.        if (!isPackageFilename(files[i])) { 
  10.            continue
  11.        } 
  12.        PackageParser.Package pkg = scanPackageLI(file, 
  13.                flags|PackageParser.PARSE_MUST_BE_APK, scanMode, currentTime, null); 
  14.        if (pkg == null && (flags & PackageParser.PARSE_IS_SYSTEM) == 0 && 
  15.                mLastScanError == PackageManager.INSTALL_FAILED_INVALID_APK) { 
  16.            file.delete(); 
  17.        } 
  18.    } 
  19. private static final boolean isPackageFilename(String name) { 
  20.    return name != null && name.endsWith(".apk"); 
  • 可以看到,它通過File.list方法列出目錄下的所有后綴為".apk"的文件傳給scanPackageLI去處理;
  • 而scanPackageLI(File scanFile,int parseFlags, int scanMode, long currentTime, UserHandle user)內部會調用它的重載方法;
  1. scanPackageLI(PackageParser.Package pkg,int parseFlags, int scanMode, long currentTime, UserHandle user): 
  2. private PackageParser.Package scanPackageLI(File scanFile,int parseFlags, int scanMode, long currentTime, UserHandle user) { 
  3.   ... 
  4.   final PackageParser.Package pkg = pp.parsePackage(scanFile,scanPath, mMetrics, parseFlags); 
  5.   ... 
  6.   PackageParser.Package scannedPkg = scanPackageLI(pkg, parseFlags, scanMode | SCAN_UPDATE_SIGNATURE, currentTime, user); 
  7.   ... 

在這個scanPackageLIl里面會解析Package并且將AndroidManifest.xml中注冊的BroadcastReceiver保存下來:

  1. ... 
  2. N = pkg.receivers.size(); 
  3. r = null
  4. for (i=0; i<N; i++) { 
  5.    PackageParser.Activity a = pkg.receivers.get(i); 
  6.    a.info.processName = fixProcessName(pkg.applicationInfo.processName, 
  7.            a.info.processName, pkg.applicationInfo.uid); 
  8.    mReceivers.addActivity(a, "receiver"); 
  9.    ... 
  10. ... 

靜態廣播的流程:

  • 系統應用的廣播先于第三方應用的廣播注冊;
  • 而安裝在同一個目錄下的應用的靜態廣播的注冊順序是按照File.list列出來的apk的順序注冊的;
  • 他們的注冊順序就決定了它們接收廣播的順序;
  • 通過靜態廣播的注冊流程,我們已經將靜態廣播注冊到了PackageManagerService的mReceivers中;

而我們可以使用PackageManagerService.queryIntentReceivers方法查詢intent對應的靜態廣播

  1. public List<ResolveInfo> queryIntentReceivers(Intent intent, String resolvedType, int flags, int userId) { 
  2.    if (!sUserManager.exists(userId)) return Collections.emptyList(); 
  3.    ComponentName comp = intent.getComponent(); 
  4.    if (comp == null) { 
  5.        if (intent.getSelector() != null) { 
  6.            intent = intent.getSelector(); 
  7.            comp = intent.getComponent(); 
  8.        } 
  9.    } 
  10.    if (comp != null) { 
  11.        List<ResolveInfo> list = new ArrayList<ResolveInfo>(1); 
  12.        ActivityInfo ai = getReceiverInfo(comp, flags, userId); 
  13.        if (ai != null) { 
  14.            ResolveInfo ri = new ResolveInfo(); 
  15.            ri.activityInfo = ai; 
  16.            list.add(ri); 
  17.        } 
  18.        return list; 
  19.    } 
  20.    synchronized (mPackages) { 
  21.        String pkgName = intent.getPackage(); 
  22.        if (pkgName == null) { 
  23.            return mReceivers.queryIntent(intent, resolvedType, flags, userId); 
  24.        } 
  25.        final PackageParser.Package pkg = mPackages.get(pkgName); 
  26.        if (pkg != null) { 
  27.            return mReceivers.queryIntentForPackage(intent, resolvedType, flags, pkg.receivers, 
  28.                    userId); 
  29.        } 
  30.        return null
  31.    } 

2、動態廣播注冊流程分析

我們調用Context.registerReceiver最后會調到ActivityManagerService.registerReceiver:

  1. public Intent registerReceiver(IApplicationThread caller, String callerPackage, IIntentReceiver receiver, IntentFilter filter, String permission, int userId) { 
  2.   ... 
  3.   ReceiverList rl = (ReceiverList)mRegisteredReceivers.get(receiver.asBinder()); 
  4.   ... 
  5.   BroadcastFilter bf = new BroadcastFilter(filter, rl, callerPackage, permission, callingUid, userId); 
  6.   ... 
  7.   mReceiverResolver.addFilter(bf); 
  8.   ... 

所以通過mReceiverResolver.queryIntent就能獲得intent對應的動態廣播了;

3、發送廣播流程分析

ContextImpl.sendBroadcast中會調用ActivityManagerNative.getDefault().broadcastIntent()

  1. public void sendBroadcast(Intent intent) { 
  2.     warnIfCallingFromSystemProcess(); 
  3.     String resolvedType = intent.resolveTypeIfNeeded(getContentResolver()); 
  4.     try { 
  5.         intent.prepareToLeaveProcess(); 
  6.         ActivityManagerNative.getDefault().broadcastIntent( 
  7.             mMainThread.getApplicationThread(), intent, resolvedType, null
  8.             Activity.RESULT_OK, nullnullnull, AppOpsManager.OP_NONE, falsefalse,getUserId()); 
  9.     } catch (RemoteException e) { 
  10.     } 

實際是調用ActivityManagerService.broadcastIntent:

  1. public final int broadcastIntent(IApplicationThread caller, 
  2.         Intent intent, String resolvedType, IIntentReceiver resultTo, 
  3.         int resultCode, String resultData, Bundle map, 
  4.         String requiredPermission, int appOp, boolean serialized, boolean sticky, int userId) { 
  5.     enforceNotIsolatedCaller("broadcastIntent"); 
  6.     synchronized(this) { 
  7.         intent = verifyBroadcastLocked(intent); 
  8.         final ProcessRecord callerApp = getRecordForAppLocked(caller); 
  9.         final int callingPid = Binder.getCallingPid(); 
  10.         final int callingUid = Binder.getCallingUid(); 
  11.         final long origId = Binder.clearCallingIdentity(); 
  12.         int res = broadcastIntentLocked(callerApp, 
  13.                 callerApp != null ? callerApp.info.packageName : null
  14.                 intent, resolvedType, resultTo, 
  15.                 resultCode, resultData, map, requiredPermission, appOp, serialized, sticky, 
  16.                 callingPid, callingUid, userId); 
  17.         Binder.restoreCallingIdentity(origId); 
  18.         return res; 
  19.     } 

調用ActivityManagerService.broadcastIntentLocked,而broadcastIntentLocked中的關鍵代碼如下:

  1. broadcastIntentLocked 
  2. // 靜態廣播 
  3. List receivers = null
  4. // 動態廣播 
  5. List<BroadcastFilter> registeredReceivers = null
  6. if ((intent.getFlags()&Intent.FLAG_RECEIVER_REGISTERED_ONLY) 
  7.       == 0) { 
  8.    // 查詢靜態廣播 
  9.    receivers = collectReceiverComponents(intent, resolvedType, users); 
  10. if (intent.getComponent() == null) { 
  11.    // 查詢動態廣播 
  12.    registeredReceivers = mReceiverResolver.queryIntent(intent, 
  13.            resolvedType, false, userId); 
  14. final boolean replacePending = 
  15.        (intent.getFlags()&Intent.FLAG_RECEIVER_REPLACE_PENDING) != 0; 
  16. int NR = registeredReceivers != null ? registeredReceivers.size() : 0; 
  17. if (!ordered && NR > 0) { 
  18.    final BroadcastQueue queue = broadcastQueueForIntent(intent); 
  19.    BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp, 
  20.            callerPackage, callingPid, callingUid, resolvedType, requiredPermission, 
  21.            appOp, registeredReceivers, resultTo, resultCode, resultData, map, 
  22.            ordered, sticky, false, userId); 
  23.    final boolean replaced = replacePending && queue.replaceParallelBroadcastLocked(r); 
  24.    if (!replaced) { 
  25.        // 發送動態廣播 
  26.        queue.enqueueParallelBroadcastLocked(r); 
  27.        queue.scheduleBroadcastsLocked(); 
  28.    } 
  29.    registeredReceivers = null
  30.    NR = 0; 
  31. ... 
  32. if ((receivers != null && receivers.size() > 0) 
  33.     || resultTo != null) { 
  34.    BroadcastQueue queue = broadcastQueueForIntent(intent); 
  35.    BroadcastRecord r = new BroadcastRecord(queue, intent, callerApp, 
  36.            callerPackage, callingPid, callingUid, resolvedType, 
  37.            requiredPermission, appOp, receivers, resultTo, resultCode, 
  38.            resultData, map, ordered, sticky, false, userId); 
  39.    boolean replaced = replacePending && queue.replaceOrderedBroadcastLocked(r); 
  40.    if (!replaced) { 
  41.        // 發送靜態廣播 
  42.        queue.enqueueOrderedBroadcastLocked(r); 
  43.        queue.scheduleBroadcastsLocked(); 
  44.    } 
  • 動態廣播會優先于靜態廣播,從上面的代碼我們可以看到;
  • 實際上靜態廣播靜態就是從PackageManagerService中查詢的:

  1. private List<ResolveInfo> collectReceiverComponents(Intent intent, String resolvedType, 
  2.             int[] users) { 
  3.     ... 
  4.     List<ResolveInfo> newReceivers = AppGlobals.getPackageManager() 
  5.                         .queryIntentReceivers(intent, resolvedType, STOCK_PM_FLAGS, user); 
  6.     ... 

4、廣播隊列

  • 從ActivityManagerService.broadcastIntentLocked中我們可以看到,實際上它不是直接將廣播發送到BroadcastReceiver中;
  • 而是將他包裝到BroadcastRecord中,再放進BroadcastQueue:
  1. BroadcastQueue queue = broadcastQueueForIntent(intent); 
  2. BroadcastRecord r = new BroadcastRecord(queue, intent, null
  3.         null, -1, -1, nullnull, AppOpsManager.OP_NONE, receivers, null, 0, 
  4.         nullnullfalsetruetrue, -1); 
  5. queue.enqueueParallelBroadcastLocked(r); 
  6. queue.scheduleBroadcastsLocked(); 
  7. enqueueParallelBroadcastLocked方法用于并發執行廣播的發送.它很簡單,就是將BroadcastRecord放到了mParallelBroadcasts中: 
  8. public void enqueueParallelBroadcastLocked(BroadcastRecord r) { 
  9.     mParallelBroadcasts.add(r); 

scheduleBroadcastsLocked方法同樣很簡單,就是向mHandler發送了個BROADCAST_INTENT_MSG消息:

  1. public void scheduleBroadcastsLocked() { 
  2.    if (mBroadcastsScheduled) { 
  3.        return
  4.    } 
  5.    mHandler.sendMessage(mHandler.obtainMessage(BROADCAST_INTENT_MSG, this)); 
  6.    mBroadcastsScheduled = true

mHandler在接收到BROADCAST_INTENT_MSG消息的時候會做些什么:

  1. final Handler mHandler = new Handler() { 
  2.    public void handleMessage(Message msg) { 
  3.        switch (msg.what) { 
  4.            case BROADCAST_INTENT_MSG: { 
  5.                processNextBroadcast(true); 
  6.            } break; 
  7.            case BROADCAST_TIMEOUT_MSG: { 
  8.                synchronized (mService) { 
  9.                    broadcastTimeoutLocked(true); 
  10.                } 
  11.            } break; 
  12.        } 
  13.    } 
  14. }; 

processNextBroadcast方法用于從隊列中獲取廣播消息并發送給BroadcastReceiver,它內部有兩個分支,并行處理和串行處理;

5、并行處理

動態注冊的非有序廣播等就是使用并行處理:

  1. final void processNextBroadcast(boolean fromMsg) { 
  2.   synchronized(mService) { 
  3.       BroadcastRecord r; 
  4.       mService.updateCpuStats(); 
  5.       if (fromMsg) { 
  6.          mBroadcastsScheduled = false
  7.       } 
  8.       while (mParallelBroadcasts.size() > 0) { 
  9.          r = mParallelBroadcasts.remove(0); 
  10.          r.dispatchTime = SystemClock.uptimeMillis(); 
  11.          r.dispatchClockTime = System.currentTimeMillis(); 
  12.          final int N = r.receivers.size(); 
  13.          for (int i=0; i<N; i++) { 
  14.              Object target = r.receivers.get(i); 
  15.              // 發送消息給Receiver 
  16.              deliverToRegisteredReceiverLocked(r, (BroadcastFilter)target, false); 
  17.          } 
  18.          addBroadcastToHistoryLocked(r); 
  19.       } 
  20.       ... 
  21.    } 
  22.    ... 
  23. private final void deliverToRegisteredReceiverLocked(BroadcastRecord r, 
  24.             BroadcastFilter filter, boolean ordered) { 
  25.     ... 
  26.     // 獲取BroadcastReceiver的Binder 
  27.     r.receiver = filter.receiverList.receiver.asBinder(); 
  28.     ... 
  29.     // 使用Binder機制將消息傳遞給BroadcastReceiver 
  30.     performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver, 
  31.                     new Intent(r.intent), r.resultCode, r.resultData, 
  32.                     r.resultExtras, r.ordered, r.initialSticky, r.userId); 
  33.     ... 
  34. void performReceiveLocked(ProcessRecord app, IIntentReceiver receiver, 
  35.         Intent intent, int resultCode, String data, Bundle extras, 
  36.         boolean ordered, boolean sticky, int sendingUser) throws RemoteException { 
  37.     ...... 
  38.         //通過Binder將消息處理傳到應用進程,應用進程內部再使用Handler機制,將消息處理放到主線程中 
  39.         app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode, 
  40.                         data, extras, ordered, sticky, sendingUser, app.repProcState); 
  41.     ...... 
  42.     } 

6、串行處理

有序廣播和靜態廣播等,會通過enqueueOrderedBroadcastLocked傳給BroadcastQueue:

  1. public void enqueueOrderedBroadcastLocked(BroadcastRecord r) { 
  2.    mOrderedBroadcasts.add(r); 

然后在processNextBroadcast里面會對mOrderedBroadcasts進行特殊處理;

廣播隊列傳送廣播給Receiver的原理其實就是將BroadcastReceiver和消息都放到BroadcastRecord里面,然后通過Handler機制遍歷BroadcastQueue里面的BroadcastRecord,將消息發送給BroadcastReceiver;

二、廣播流程總結

1、Android廣播分為兩個方面:廣播發送者和廣播接收者:

  • 廣播作為Android組件間的通信方式,可以使用的場景如下:
  • 同一app內部的同一組件(Component)內的消息通信(單個或多個線程之間);
  • 同一app內部的不同組件之間的消息通信(單個進程);
  • 同一app具有多個進程的不同組件之間的消息通信;
  • 不同app之間的組件之間消息通信;
  • Android系統在特定情況下與App之間的消息通信;

2、實現原理

從實現原理上看,Android中的廣播使用了觀察者模式,基于消息的發布/訂閱事件模型。因此,從實現的角度來看,Android中的廣播將廣播的發送者和接受者極大程度上解耦,使得系統能夠方便集成,更易擴展。具體實現流程要點粗略概括如下:

  • 廣播接收者BroadcastReceiver通過Binder機制向AMS(Activity Manager Service)進行注冊;
  • 廣播發送者通過binder機制向AMS發送廣播;
  • AMS查找符合相應條件(IntentFilter/Permission等)的BroadcastReceiver,將廣播發送到BroadcastReceiver相應的消息循環隊列中;
  • 消息循環隊列拿到此廣播后,回調BroadcastReceiver中的onReceive()方法;
  • 廣播發送者和廣播接收者分別屬于觀察者模式中的消息發布和訂閱兩端,AMS屬于中間的處理中心;
  • 廣播發送者和廣播接收者的執行是異步的,發出去的廣播不會關心有無接收者接收,也不確定接收者到底是何時才能接收到;

總結

學如逆水行舟,不進則退。心似平原跑馬,易放難收;

本文轉載自微信公眾號「Android開發編程」

 

責任編輯:姜華 來源: Android開發編程
相關推薦

2021-08-09 11:15:28

MybatisJavaSpring

2022-04-05 12:59:07

源碼線程onEvent

2021-09-05 07:35:58

lifecycleAndroid組件原理

2020-10-10 08:20:27

Spring Boot運行原理代碼

2021-12-06 14:52:08

動畫Android補間動畫

2019-10-16 16:33:41

Docker架構語言

2018-10-31 15:54:47

Java線程池源碼

2019-09-20 08:54:38

KafkaBroker消息

2014-12-11 13:37:13

WPF架構

2021-09-27 06:29:47

Vue3 響應式原理Vue應用

2018-11-14 14:33:33

MapReduce數據集計算

2020-10-21 09:11:52

Spring Boot源碼分析代碼

2010-01-25 13:56:58

Android本地廣播

2014-08-26 11:11:57

AsyncHttpCl源碼分析

2011-03-15 11:33:18

iptables

2021-08-06 08:33:27

Springboot分布式Seata

2011-05-26 10:05:48

MongoDB

2024-01-18 08:31:22

go實現gorm框架

2021-11-11 17:40:08

WatchdogAndroid源碼分析

2021-08-12 07:01:23

FlutterRouter Android
點贊
收藏

51CTO技術棧公眾號

av在线不卡一区| 麻豆国产精品va在线观看不卡| 亚洲中文字幕无码av永久| 亚洲经典一区二区三区| 亚洲少妇一区| 色综久久综合桃花网| 韩国三级hd中文字幕有哪些| а√在线中文网新版地址在线| 99久久综合狠狠综合久久| 国产成人精品久久二区二区| 老熟妻内射精品一区| 成人台湾亚洲精品一区二区| 在线观看国产一区二区| 中文字幕精品在线播放| 九一国产在线| 国产成+人+日韩+欧美+亚洲| 国产91亚洲精品| 妺妺窝人体色www聚色窝仙踪| 四虎5151久久欧美毛片| 欧美久久久久久久久| 18岁网站在线观看| 黄色小网站在线观看| 久久亚洲精品小早川怜子| 国产精品视频在线观看| 男女啊啊啊视频| 超碰成人久久| 欧美一区二区久久久| 男人日女人下面视频| 免费黄色在线观看| 国产欧美日韩一区二区三区在线观看| 不卡视频一区| 91成人国产综合久久精品| 国产精品腿扒开做爽爽爽挤奶网站| xxxxx91麻豆| 伊人网在线视频观看| 第四色中文综合网| 3d成人动漫网站| jizz欧美激情18| 性欧美18xxxhd| 一区二区三区欧美激情| 自拍偷拍亚洲色图欧美| 成人亚洲综合天堂| 26uuu欧美| 久久国产精品久久| 免费国产羞羞网站视频| 国模大尺度一区二区三区| 国产精品久久久久久av| 成人免费视频国产免费| 美女国产精品| 国产91ⅴ在线精品免费观看| 日本五十熟hd丰满| 亚洲一级二级| 国语自产精品视频在线看一大j8| 欧美亚洲日本在线| 综合视频在线| 免费99精品国产自在在线| 美女视频久久久| 偷拍欧美精品| www.欧美免费| 色老板免费视频| 91精品国产91久久久久久黑人| 这里只有视频精品| 天堂网中文在线观看| 国产精品福利在线观看播放| 日韩在线高清视频| 中文字幕另类日韩欧美亚洲嫩草| 国产精品久久久久久麻豆一区软件 | 成人在线观看小视频| 99久久夜色精品国产亚洲96| 精品久久久av| 国产精品白嫩白嫩大学美女| 欧美性色综合| 97视频色精品| 中文字幕日韩免费| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产精品久久久久久婷婷天堂| 中文字幕在线播放不卡| 精品无人区卡一卡二卡三乱码免费卡| 成人激情视频在线观看| www天堂在线| 91亚洲资源网| 色姑娘综合av| 国产剧情在线| 午夜亚洲福利老司机| 免费av观看网址| 精品国产欧美日韩一区二区三区| 欧美日韩精品一二三区| 四虎国产精品免费| 丝袜美腿一区二区三区动态图| 国产亚洲欧洲黄色| 曰本女人与公拘交酡| 一本一道久久综合狠狠老精东影业| 国产成人一区二区三区小说| 国产欧美日韩综合精品一区二区三区 | 中文字幕乱码久久午夜不卡| 国产精品12p| 欧美13videosex性极品| 欧美日韩一级视频| 亚洲乱妇老熟女爽到高潮的片| 天堂一区二区三区四区| 色婷婷成人综合| 日韩av在线播| 久久超碰97人人做人人爱| 国产二区一区| av电影在线网| 午夜久久久久久| 色噜噜狠狠一区二区| 久久97精品| 久久精品国产欧美激情| 日韩视频免费观看高清| 精品一区二区三区的国产在线播放 | 一区二区三区天堂av | 欧美日韩精品二区| 亚洲一二区在线观看| 日韩a级大片| 久久艳片www.17c.com | 欧美日韩美少妇| 私密视频在线观看| 亚洲mv大片欧洲mv大片| 国产精品2018| 天天干天天色天天| 亚洲精品国产精品乱码不99| 日本888xxxx| 欧美亚洲国产日韩| 欧美黄色片视频| 一级黄在线观看| 久久精品男人的天堂| 日韩伦理在线免费观看| 日本免费在线一区| 有码中文亚洲精品| 国产又大又粗又爽| av一区二区三区在线| 在线视频一二三区| 天堂综合在线播放| 在线看福利67194| 欧美国产成人精品一区二区三区| 国产成人午夜精品影院观看视频| 亚洲一区二区三区免费看| 亚洲校园激情春色| 日韩电影中文字幕在线| 久久久久久久中文字幕| 国产麻豆精品95视频| 爱爱爱视频网站| 欧美一区二区三区婷婷| 在线观看国产精品91| 老熟妇一区二区三区| 国产无人区一区二区三区| 国产在线青青草| 婷婷五月色综合香五月| 久久久久久噜噜噜久久久精品| 99草在线视频| 一区二区三区欧美久久| 色诱av手机版| 亚洲视频福利| 国产精品二区三区四区| 97人人在线视频| 亚洲国产又黄又爽女人高潮的| 豆国产97在线 | 亚洲| 成人一级片在线观看| www.成年人视频| 国产精品白丝av嫩草影院| 久久免费精品日本久久中文字幕| 免费看黄色一级视频| 精品久久久精品| 亚洲第一香蕉网| 日本va欧美va瓶| 正义之心1992免费观看全集完整版| 亚洲tv在线| 欧美乱妇高清无乱码| 亚洲国产精品欧美久久| 精品久久久久久久久久国产 | 国产精品天天看| 亚洲天堂2018av| 欧美va天堂在线| 国产欧美日韩视频一区二区三区| www.综合| 中文字幕久久久av一区| 国产麻豆91视频| 亚欧色一区w666天堂| av黄色免费网站| 久久激情综合网| 天堂8在线天堂资源bt| 视频福利一区| 91精品一区二区| 69av成人| 色多多国产成人永久免费网站| 99视频在线观看免费| 午夜精彩视频在线观看不卡| 妺妺窝人体色WWW精品| 国产自产视频一区二区三区| av高清在线免费观看| 国产欧美一区二区精品久久久| 成人综合国产精品| 欧美少妇网站| 久久久精品一区二区三区| 深夜福利视频在线观看| 欧美剧在线免费观看网站 | 成人在线小视频| 免费h视频在线观看| 中国china体内裑精亚洲片| 精品国产av一区二区| 色香蕉久久蜜桃| 中文字幕av久久爽av| 久久亚洲二区三区| 日本女人性视频| 日韩精品一级二级| 欧美人成在线观看| 欧美激情另类| 久久久久久久久一区| 另类视频一区二区三区| 国产福利视频一区| av福利导福航大全在线| 久久精品视频va| 每日更新在线观看av| 日韩欧美一级在线播放| 这里只有精品国产| 五月激情综合色| 欧美视频www| 国产精品视频第一区| a视频免费观看| 从欧美一区二区三区| 日本中文字幕影院| 久久精品动漫| 熟女少妇在线视频播放| 欧美视频日韩| 日本xxx免费| 日韩大片在线观看| 日本一区高清不卡| 伊人久久大香线蕉综合网站 | 免费视频亚洲| 国产一区精品视频| 91久久精品无嫩草影院| 成人综合国产精品| 国产成人久久精品一区二区三区| 国产97在线|亚洲| 亚洲美女尤物影院| 97在线观看视频国产| 99re6在线精品视频免费播放| 九九九热精品免费视频观看网站| 日本黄色片在线观看| 中文字幕欧美亚洲| av在线电影院| 中文字幕亚洲图片| 91大神xh98hx在线播放| 在线视频日本亚洲性| 成年人视频在线看| 影音先锋欧美精品| 97超碰人人在线| 综合久久五月天| 日本电影在线观看网站| 精品国产依人香蕉在线精品| 五月婷婷在线观看| 最近免费中文字幕视频2019| 亚乱亚乱亚洲乱妇| 久久手机免费视频| 9191在线播放| 久久乐国产精品| 日韩在线伦理| 日韩免费观看网站| 成人国产精品一区二区免费麻豆 | 成人黄色777网| 日韩av手机在线播放| 91色乱码一区二区三区| 免费成人深夜天涯网站| 中日韩av电影| 午夜国产福利一区二区| 亚洲一区二区三区美女| 日韩在线视频免费播放| 色狠狠综合天天综合综合| 涩涩视频在线观看| 欧美一区二区三区四区五区| 成人午夜免费福利| 亚洲精品在线看| 1024国产在线| 欧美国产日韩xxxxx| www欧美xxxx| 国产精品444| 日韩精品免费视频一区二区三区| 国产精品久久精品国产| 一道在线中文一区二区三区| 亚洲巨乳在线观看| 国产精品多人| 国产成人精品无码播放| 国产综合色在线视频区| 美女伦理水蜜桃4| 久久精品人人做人人综合 | 久久中文视频| 国产精品入口芒果| 日本vs亚洲vs韩国一区三区二区| 日韩精品在线播放视频| 91日韩一区二区三区| 五月婷婷六月香| 亚洲国产综合在线| 中文字字幕在线观看| 精品噜噜噜噜久久久久久久久试看| 毛片免费在线观看| 欧美老妇交乱视频| 国产亚洲一区二区手机在线观看 | 国产一区二区三区在线观看| 精品免费视频.| √新版天堂资源在线资源| 欧美黄色www| 香蕉成人在线| 欧美精品人人做人人爱视频| 欧美国产91| 日韩无套无码精品| 成人性视频网站| 手机在线中文字幕| 日韩欧美中文第一页| 国产chinasex对白videos麻豆| 亚洲精品午夜精品| 亚洲婷婷噜噜| 国产精品视频自拍| 免费不卡中文字幕在线| 欧美精品在欧美一区二区| 日本午夜精品视频在线观看 | 萌白酱国产一区二区| 经典三级一区二区| 精品蜜桃一区二区三区| 欧美 日韩 国产精品免费观看| 精品少妇无遮挡毛片| 波多野结衣中文一区| 乱h高h女3p含苞待放| 欧美曰成人黄网| 欧美91精品久久久久国产性生爱| 欧美黑人性视频| 中文字幕一区二区三区日韩精品| 亚洲精品国产精品久久| 天堂成人国产精品一区| av电影在线播放| 亚洲最大成人综合| 国产夫妻性生活视频| 日韩一区二区三区国产| 久久精品超碰| 亚洲精品免费在线看| 日韩黄色免费电影| 成人免费无遮挡无码黄漫视频| 欧美日韩国产在线| 熟妇人妻系列aⅴ无码专区友真希| 欧美精品亚州精品| 国产精品视频首页| 国产精品无码乱伦| 狠狠色2019综合网| 亚洲AV成人无码精电影在线| 欧美蜜桃一区二区三区| 亚洲成a人v欧美综合天堂麻豆| 国产精品流白浆视频| 日韩1区2区| 国内外成人免费在线视频| 国产精品国产a| 国产精品无码天天爽视频| 日韩一区二区三区xxxx| 国产日本亚洲| 国产91porn| 成人在线视频一区| 精品成人久久久| 亚洲欧洲在线看| 69堂免费精品视频在线播放| 色综合视频二区偷拍在线| 美腿丝袜亚洲三区| 国产激情无码一区二区三区| 欧美精品自拍偷拍| 丝袜美腿av在线| 精品一区二区不卡| 日韩精品乱码免费| 免费高清在线观看电视| 欧美va天堂va视频va在线| 僵尸再翻生在线观看免费国语| 蜜桃视频在线观看91| 蜜桃在线一区二区三区| 国产成人自拍网站| 亚洲成人黄色在线观看| 高潮一区二区| 亚洲一区精品视频| 丰满亚洲少妇av| 特级毛片www| 深夜成人在线观看| 51vv免费精品视频一区二区| 2022亚洲天堂| 国产精品第四页| 亚洲成人一级片| 琪琪亚洲精品午夜在线| 欧美电影免费| 欧亚乱熟女一区二区在线| 在线视频国内自拍亚洲视频| 伦xxxx在线| 精品国产乱码久久久久久88av | 国产欧美日韩精品一区二区免费 | 99久久99久久综合| 中文字幕激情视频| 欧美激情亚洲国产| 欧洲福利电影| 性生交大片免费看l| 日本二三区不卡| 手机在线免费av| 亚洲春色在线| av激情综合网| 91女人18毛片水多国产| 欧美亚洲日本黄色| 亚洲最新色图|