日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

framework层Service的基础知识和常见问题

發布時間:2023/12/9 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 framework层Service的基础知识和常见问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

簡介

framework層Service相關的邏輯主要在ActiveServices類中。

分類

  • 啟動方式
    • start方式啟動:onCreate() → onStartCommand() → stopService → onDestroy()
    • bind方式啟動:onCreate() → onBind() → unbindService → onUnbind() → onDestroy()
  • 運行方式(優先級)
    • 前臺Service:會在通知欄顯示通知,優先級較高;anr超時時間為20s
    • 后臺Service:沒有通知,優先級較低;anr超時時間為200s
  • 常見的adb命令

  • 啟動指定Service
    • adb shell am startservice -n serviceName
  • 查看Service的dump信息
    • adb shell dumpsys activity services
  • Service啟動失敗原因

    一般都有如下log打印:

    Slog.w(TAG, “Background start not allowed: service “+ service(啟動的Intent) + " to " + r.shortInstanceName(Service名字 )+ " from pid=” + callingPid(調用方的pid) + " uid=” + callingUid(調用方的uid)+ " pkg=" + callingPackage(調用方的包名) + " startFg?=" + fgRequired(是否是前臺Service));

    具體的邏輯在ActiveServices的startServiceLocked方法里

    啟動后臺Service
    // startRequested表示是否start方式啟動(此處首次啟動暫未賦值所以為false,且service stop后會賦值為false),fgRequired表示是否前臺Serviceif (forcedStandby || (!r.startRequested && !fgRequired)) {final int allowed = mAm.getAppStartModeLocked(r.appInfo.uid, r.packageName, r.appInfo.targetSdkVersion, callingPid, false, false, forcedStandby);if (allowed != ActivityManager.APP_START_MODE_NORMAL) {Slog.w(TAG, "Background start not allowed: service " + service + " to " + r.shortInstanceName + " from pid=" + callingPid + " uid=" + callingUid + " pkg=" + callingPackage + " startFg?=" + fgRequired);......}
    后臺啟動Service && 不在電池優化白名單

    如果當前app的uid不是active(處于后臺),即使啟動的是前臺Service,也可能會失敗,例如:

    ActivityManager: Background start not allowed: service Intent { act=geofence_trigered cmp=com.xiaomi.smarthome/.scene.activity.GeoActionService (has extras) } to com.xiaomi.smarthome/.scene.activity.GeoActionService from pid=9233 uid=10270 pkg=com.xiaomi.smarthome startFg?=true

    原理代碼如下,下面的就是上面1中列出的代碼:

    final boolean bgLaunch = !mAm.isUidActiveLocked(r.appInfo.uid);boolean forcedStandby = false;if (bgLaunch && appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {forcedStandby = true;}

    另外,如果進程的procState < 8 ,他在后臺保留1min后就會進入idle狀態,相應的Service也會被stop

    Service發生ANR的原因

    10s內未調用startForeground導致的ANR

    I am_anr : [0,16206,com.android.mms,952745573,Context.startForegroundService() did not then call Service.startForeground(): ServiceRecord{3201640 u0 com.android.mms/com.xiaomi.mms.transaction.MxActivateService}]

    以startForegroundService方式啟動的Service,則需要在10s內調用startForeground方法,否則會發生ANR。一般會將該方法放到Service的onStartCommand中去執行,因為這種類型的ANR超時時間是從framework層開始通知app端執行Service的onStartCommand開始計算的。如果將該方法放到Service的onCreate中去執行,onStartCommand方法返回值是START_NOT_STICKY,進程被殺后Service重啟不會回調onCreate方法,但是還會走ANR超時邏輯。

    private final void sendServiceArgsLocked(ServiceRecord r, boolean execInFg, boolean oomAdjusted) throws TransactionTooLargeException {.......while (r.pendingStarts.size() > 0) {.....if (r.fgRequired && !r.fgWaiting) {if (!r.isForeground) {scheduleServiceForegroundTransitionTimeoutLocked(r);} }

    前臺Service

    設置前臺Service

    如果需要提高進程的優先級,避免由于低內存或其他廠商定制策略被系統查殺,可以設置Service為前臺Service,app端通過調用startForeground方法實現。具體流程如下圖1:

    app端Service中調用startForeground
    • 傳入Notication的id和Notification的實例,前臺Service的類型
    • 如果是用startForegroundService方式啟動的,則需要在service的onStartCommand方法中調用該startForeground方法,避免anr
    //Service.java public final void startForeground(int id, @NonNull Notification notification, @ForegroundServiceType int foregroundServiceType) {try {mActivityManager.setServiceForeground(new ComponentName(this, mClassName), mToken, id,notification, 0, foregroundServiceType);} catch (RemoteException ex) {} }
    AMS中作中轉,調用ActiveServices.java中的方法(因為app端進程只有AMS或ATMS的binder對象)
    • 該操作持有AMS大鎖
    • 真正實現地方在ActiveServices中
    // AMS.java @Override public void setServiceForeground(ComponentName className, IBinder token,int id, Notification notification, int flags, int foregroundServiceType) {synchronized(this) {mServices.setServiceForegroundLocked(className, token, id, notification, flags, foregroundServiceType);} }
    具體實現邏輯

    下面可能會省略部分代碼

    public void setServiceForegroundLocked(ComponentName className, IBinder token,int id, Notification notification, int flags, int foregroundServiceType) {final int userId = UserHandle.getCallingUserId();// 清除calling uid,避免uid權限校驗通不過,清除后callingUid就時system server的uid 1000final long origId = Binder.clearCallingIdentity();try {// 通過component ,token ,userId獲取到service recordServiceRecord r = findServiceLocked(className, token, userId);if (r != null) {setServiceForegroundInnerLocked(r, id, notification, flags, foregroundServiceType);}} finally {// 恢復之前的calling uidBinder.restoreCallingIdentity(origId);} }
    • 傳入的notification id為0表示當前service退出前臺狀態
    • P或P之后前臺service需要申請FOREGROUND_SERVICE權限
    • 移除前臺service的10s超時消息
    • 更新isForeground為true
    • 通知異步執行入隊列
    /*** @param id Notification ID. Zero === exit foreground state for the given service.*/private void setServiceForegroundInnerLocked(final ServiceRecord r, int id,Notification notification, int flags, int foregroundServiceType) {if (id != 0) {if (notification == null) {throw new IllegalArgumentException("null notification");}// Instant apps need permission to create foreground services.if (r.appInfo.isInstantApp()) {.......} else {// P或P之后前臺service需要申請FOREGROUND_SERVICE權限if (r.appInfo.targetSdkVersion >= Build.VERSION_CODES.P) {mAm.enforcePermission(android.Manifest.permission.FOREGROUND_SERVICE,r.app.pid, r.appInfo.uid, "startForeground");}// 一般傳入的service type默認為FOREGROUND_SERVICE_TYPE_MANIFEST,而manifestType默認為0(none)int manifestType = r.serviceInfo.getForegroundServiceType();if (foregroundServiceType == FOREGROUND_SERVICE_TYPE_MANIFEST) {foregroundServiceType = manifestType;}// 這種異常一般較少if ((foregroundServiceType & manifestType) != foregroundServiceType) {throw new IllegalArgumentException("foregroundServiceType "+ String.format("0x%08X", foregroundServiceType)+ " is not a subset of foregroundServiceType attribute "+ String.format("0x%08X", manifestType)+ " in service element of manifest file");}// 后臺啟動的前臺Service不得擁有“使用中權限”,下面有講到if (!r.mAllowWhileInUsePermissionInFgs) {Slog.w(TAG,"Foreground service started from background can not have "+ "location/camera/microphone access: service "+ r.shortInstanceName);}}boolean alreadyStartedOp = false;boolean stopProcStatsOp = false;//移除前臺service 10s的超時消息。重置fgRequired 和 fgWaitingif (r.fgRequired) { r.fgRequired = false;r.fgWaiting = false;alreadyStartedOp = stopProcStatsOp = true;mAm.mHandler.removeMessages(ActivityManagerService.SERVICE_FOREGROUND_TIMEOUT_MSG, r);}try {boolean ignoreForeground = false;......// service的app不在電池優化白名單內&不是前臺app啟動,ignoreForeground賦值為trueif (!ignoreForeground&& !appIsTopLocked(r.appInfo.uid)&& appRestrictedAnyInBackground(r.appInfo.uid, r.packageName)) {Slog.w(TAG,"Service.startForeground() not allowed due to bg restriction: service "+ r.shortInstanceName);updateServiceForegroundLocked(r.app, false);ignoreForeground = true;}if (!ignoreForeground) {// 取消可能存在的notificationif (r.foregroundId != id) {cancelForegroundNotificationLocked(r);r.foregroundId = id;}// 給service的notification相關變量賦值notification.flags |= Notification.FLAG_FOREGROUND_SERVICE;r.foregroundNoti = notification;r.foregroundServiceType = foregroundServiceType;// 前臺service第一次設置會為falseif (!r.isForeground) {final ServiceMap smap = getServiceMapLocked(r.userId);if (smap != null) {// 統計每個app前臺service的數量ActiveForegroundApp active = smap.mActiveForegroundApps.get(r.packageName);if (active == null) {active = new ActiveForegroundApp();active.mPackageName = r.packageName;active.mUid = r.appInfo.uid;active.mShownWhileScreenOn = mScreenOn;if (r.app != null && r.app.uidRecord != null) {active.mAppOnTop = active.mShownWhileTop =r.app.uidRecord.getCurProcState()<= ActivityManager.PROCESS_STATE_TOP;}active.mStartTime = active.mStartVisibleTime= SystemClock.elapsedRealtime();smap.mActiveForegroundApps.put(r.packageName, active);requestUpdateActiveForegroundAppsLocked(smap, 0);}active.mNumActive++;}// 設置isForeground為true,第二次執行該方法后不必執行這些代碼,且表示當前service在前臺r.isForeground = true;........}// 每次執行該方法都會重新post通知,異步執行r.postNotification();if (r.app != null) {// 更新進程優先級updateServiceForegroundLocked(r.app, true);}getServiceMapLocked(r.userId).ensureNotStartingBackgroundLocked(r);mAm.notifyPackageUse(r.serviceInfo.packageName,PackageManager.NOTIFY_PACKAGE_USE_FOREGROUND_SERVICE);} else {}} finally {.......}} else {// notification id為0 ,是取消前臺service的流程,下面講}
    發送通知
    • 通知入隊等操作異步進行,避免死鎖
    • 通知沒有對應的icon,打印警告信息,并給設置一個簡陋的通知模板,告知用戶當前正在運行該進程
      V/ActivityManager: Attempted to start a foreground service (com.mfashiongallery.emag/.lks.minusonescreen.overlay.OverlayService) with a broken notification (no icon: Notification(channel=gallery_overlay_windows shortcut=null contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 color=0x00000000 vis=PRIVATE))
    // ServiceRecord.javapublic void postNotification() {final int appUid = appInfo.uid;final int appPid = app.pid;if (foregroundId != 0 && foregroundNoti != null) {// Do asynchronous communication with notification manager to// avoid deadlocks.final String localPackageName = packageName;final int localForegroundId = foregroundId;final Notification _foregroundNoti = foregroundNoti;final ServiceRecord record = this;ams.mHandler.post(new Runnable() {public void run() {NotificationManagerInternal nm = LocalServices.getService(NotificationManagerInternal.class);if (nm == null) {return;}Notification localForegroundNoti = _foregroundNoti;try {if (localForegroundNoti.getSmallIcon() == null) {// 通知沒有對應icon,打印警告信息Slog.v(TAG, "Attempted to start a foreground service (" + shortInstanceName + ") with a broken notification (no icon: " + localForegroundNoti + ")");CharSequence appName = appInfo.loadLabel(ams.mContext.getPackageManager());if (appName == null) {appName = appInfo.packageName;}Context ctx = null;try {ctx = ams.mContext.createPackageContextAsUser(appInfo.packageName, 0, new UserHandle(userId));// 重新構建通知相關信息Notification.Builder notiBuilder = new Notification.Builder(ctx,localForegroundNoti.getChannelId());// 設置icon為app應用信息的iconnotiBuilder.setSmallIcon(appInfo.icon);// mark as foregroundnotiBuilder.setFlag(Notification.FLAG_FOREGROUND_SERVICE, true);// 構建pendingIntentrunningIntent.setData(Uri.fromParts("package", appInfo.packageName, null));PendingIntent pi = PendingIntent.getActivityAsUser(ams.mContext, 0,runningIntent, PendingIntent.FLAG_UPDATE_CURRENT, null,UserHandle.of(userId));// 設置系統的通知顏色notiBuilder.setColor(ams.mContext.getColor(com.android.internal.R.color.system_notification_accent_color));// 設置通知標題為“xxx 正在運行”notiBuilder.setContentTitle(ams.mContext.getString(com.android.internal.R.string.app_running_notification_title,appName));// 設置通知的內容"點按即可了解詳情或停止應用",miui定制國內版本為"可能導致系統卡頓,降低待機時間,點按關閉"// MIUI MOD START:// notiBuilder.setContentText(// ams.mContext.getString(// com.android.internal.R.string// .app_running_notification_text,// appName));if (miui.os.Build.IS_INTERNATIONAL_BUILD) {notiBuilder.setContentText(ams.mContext.getString(com.android.internal.R.string.app_running_notification_text,appName));} else {notiBuilder.setContentText(ams.mContext.getString(com.android.internal.R.string.app_running_notification_tip_text,appName));}// ENDnotiBuilder.setContentIntent(pi);localForegroundNoti = notiBuilder.build();} catch (PackageManager.NameNotFoundException e) {}}if (nm.getNotificationChannel(localPackageName, appUid,localForegroundNoti.getChannelId()) == null) {int targetSdkVersion = Build.VERSION_CODES.O_MR1;try {final ApplicationInfo applicationInfo =ams.mContext.getPackageManager().getApplicationInfoAsUser(appInfo.packageName, 0, userId);targetSdkVersion = applicationInfo.targetSdkVersion;} catch (PackageManager.NameNotFoundException e) {}if (targetSdkVersion >= Build.VERSION_CODES.O_MR1) {throw new RuntimeException("invalid channel for service notification: "+ foregroundNoti);}}if (localForegroundNoti.getSmallIcon() == null) {// Notifications whose icon is 0 are defined to not show// a notification, silently ignoring it. We don't want to// just ignore it, we want to prevent the service from// being foreground.throw new RuntimeException("invalid service notification: "+ foregroundNoti);}// 通知入隊nm.enqueueNotification(localPackageName, localPackageName,appUid, appPid, null, localForegroundId, localForegroundNoti,userId);foregroundNoti = localForegroundNoti; // save it for amending next time} catch (RuntimeException e) {Slog.w(TAG, "Error showing notification for service", e);// 出現問題會stop server,阿里巴巴app就經常因為這個原因被殺ams.mServices.killMisbehavingService(record,appUid, appPid, localPackageName);}}});}}

    取消前臺service

    app端調用

    取消前臺service的流程和設置前臺service的流程基本相同,傳入的參數不同,如圖2

    • 傳入的notification id為0
    • notifications為null
    • flags為1表示移除通知,0表示不移除
    public final void stopForeground(@StopForegroundFlags int flags) {try {mActivityManager.setServiceForeground(new ComponentName(this, mClassName), mToken, 0, null,flags, 0);} catch (RemoteException ex) {}}
    ActiveServices中的流程

    setServiceForegroundInnerLocked方法中notification id為0的else邏輯

    • 自減mActiveForegroundApps中對應app的mNumActive,代表當前app的前臺service -1
    • 如果app的mNumActive <= 0,則將該app從mActiveForegroundApps中移除,并更新adj
    • 傳入的flags為1,則需要取消notification
    // 取消前臺service,如果當前service是前臺serviceif (r.isForeground) {final ServiceMap smap = getServiceMapLocked(r.userId);if (smap != null) {// 更新mActiveForegroundApps中對應app的mNumActivedecActiveForegroundAppLocked(smap, r);}// 重置isForeground屬性r.isForeground = false; .......if (r.app != null) {mAm.updateLruProcessLocked(r.app, false, null);updateServiceForegroundLocked(r.app, true);}}// 如果傳入的flags為1,則要取消通知if ((flags & Service.STOP_FOREGROUND_REMOVE) != 0) {cancelForegroundNotificationLocked(r);r.foregroundId = 0;r.foregroundNoti = null;} else if (r.appInfo.targetSdkVersion >= Build.VERSION_CODES.LOLLIPOP) {r.stripForegroundServiceFlagFromNotification();if ((flags & Service.STOP_FOREGROUND_DETACH) != 0) {r.foregroundId = 0;r.foregroundNoti = null;}}}
    移除通知
    private void cancelForegroundNotificationLocked(ServiceRecord r) {// notification id不為0if (r.foregroundId != 0) {// First check to see if this app has any other active foreground services// with the same notification ID. If so, we shouldn't actually cancel it,// because that would wipe away the notification that still needs to be shown// due the other service.ServiceMap sm = getServiceMapLocked(r.userId);if (sm != null) {for (int i = sm.mServicesByInstanceName.size() - 1; i >= 0; i--) {ServiceRecord other = sm.mServicesByInstanceName.valueAt(i);if (other != r && other.foregroundId == r.foregroundId&& other.packageName.equals(r.packageName)) {// Found one! Abort the cancel.return;}}}r.cancelNotification();}} public void cancelNotification() {// 異步執行,避免死鎖final String localPackageName = packageName;final int localForegroundId = foregroundId;final int appUid = appInfo.uid;final int appPid = app != null ? app.pid : 0;ams.mHandler.post(new Runnable() {public void run() {NotificationManagerInternal nm = LocalServices.getService(NotificationManagerInternal.class);if (nm == null) {return;}try {nm.cancelNotification(localPackageName, localPackageName, appUid, appPid,null, localForegroundId, userId);} catch (RuntimeException e) {Slog.w(TAG, "Error canceling notification for service", e);}}});}

    后臺啟動的前臺Service不得擁有使用中權限

    android會限制從后臺啟動的前臺service擁有“使用中”權限,包括位置、攝像頭、麥克風等,否則會打印出如下的警告信息。
    W ActivityManager: Foreground service started from background can not have location/camera/microphone access: service com.mi.health/.scenerecognition.SceneForegroundService

    start或bind方式啟動都會去給mAllowWhileInUsePermissionInFgs賦值

    if (!r.mAllowWhileInUsePermissionInFgs) {r.mAllowWhileInUsePermissionInFgs =shouldAllowWhileInUsePermissionInFgsLocked(callingPackage, callingPid,callingUid, service, r, allowBackgroundActivityStarts);}

    豁免情況

    • FGS由ROOT_UID,SYSTEM_UID,NFC_UID、SHELL_UID等啟動。
    • CallingUid 聲明START_ACTIVITIES_FROM_BACKGROUND權限(hide權限)
    • FGS由IME或其他可見應用啟動。
    • 在while-in-use白名單內:AttentionService, SystemCaptionService(for live caption)
    private boolean shouldAllowWhileInUsePermissionInFgsLocked(String callingPackage,int callingPid, int callingUid, Intent intent, ServiceRecord r,boolean allowBackgroundActivityStarts) {// 一般后臺啟動前臺service限制打開的if (!mAm.mConstants.mFlagBackgroundFgsStartRestrictionEnabled) {return true;}// 一般為falseif (allowBackgroundActivityStarts) {return true;}//部分uid豁免boolean isCallerSystem = false;final int callingAppId = UserHandle.getAppId(callingUid);switch (callingAppId) {case ROOT_UID:case SYSTEM_UID:case NFC_UID:case SHELL_UID:isCallerSystem = true;break;default:isCallerSystem = false;break;}if (isCallerSystem) {return true;}if (r.app != null) {ActiveInstrumentation instr = r.app.getActiveInstrumentation();if (instr != null && instr.mHasBackgroundActivityStartsPermission) {return true;}}final boolean hasAllowBackgroundActivityStartsToken = r.app != null? !r.app.mAllowBackgroundActivityStartsTokens.isEmpty() : false;if (hasAllowBackgroundActivityStartsToken) {return true;}// app聲明了START_ACTIVITIES_FROM_BACKGROUND權限豁免if (mAm.checkPermission(START_ACTIVITIES_FROM_BACKGROUND, callingPid, callingUid)== PERMISSION_GRANTED) {return true;}// app在top自然允許final boolean isCallingUidTopApp = appIsTopLocked(callingUid);if (isCallingUidTopApp) {return true;}// Does the calling UID have any visible activity?final boolean isCallingUidVisible = mAm.mAtmInternal.isUidForeground(callingUid);if (isCallingUidVisible) {return true;}final boolean isWhiteListedPackage =mWhiteListAllowWhileInUsePermissionInFgs.contains(callingPackage);if (isWhiteListedPackage) {return true;}// Is the calling UID a device owner app?final boolean isDeviceOwner = mAm.mInternal.isDeviceOwner(callingUid);if (isDeviceOwner) {return true;}return false;}

    后臺Service

    后臺Service管控

    android對后臺進程管控比較嚴格,app退到后臺超過1min就會進入idle狀態,并嘗試stop相關的Service,所以我們可能會經常見到如下log:

    08-27 20:08:12.038 1588 5729 I am_uid_active: 10135

    08-27 20:09:13.517 1588 2114 I am_uid_idle: 10135

    08-27 20:09:13.517 1588 2114 I am_stop_idle_service: [10135,com.android.htmlviewer/com.android.settings.services.MemoryOptimizationService]

    為了便于理解,以下代碼都只是節選方法中與之相關的一部分代碼

    在OomAdjuster.java的updateUidsLocked方法中發送IDLE_UIDS_MSG消息
    • isProcStateBackground 是判斷當前UidRecord的procState值是否小于8(PROCESS_STATE_TRANSIENT_BACKGROUND)
    • 后臺Service的procState一般是10(PROCESS_STATE_SERVICE)
    • 如果當前進程跟top進程有綁定(如處于top狀態的進程訪問當前進程的provider等),那他的procState為3(PROCESS_STATE_BOUND_TOP)
    • 如果當前UidRect處于后臺且不在臨時白名單內,但是上次不處于后臺或者在臨時白名單內,就會在1min(BACKGROUND_SETTLE_TIME)后將當前的UidRect idle
    private void updateUidsLocked(ActiveUids activeUids, final long nowElapsed) {for (int i = activeUids.size() - 1; i >= 0; i--) {final UidRecord uidRec = activeUids.valueAt(i);int uidChange = UidRecord.CHANGE_PROCSTATE;// 判斷當前procState是否處于后臺或者不在臨時白名單內 if (ActivityManager.isProcStateBackground(uidRec.getCurProcState()) && !uidRec.curWhitelist) {// 上次procState不處于后臺或者在臨時白名單內if (!ActivityManager.isProcStateBackground(uidRec.setProcState) || uidRec.setWhitelist) {// 這里傳入的elapsedRealtime而不是uptimeMillis,谷歌代碼曾出過問。uidRec.lastBackgroundTime = nowElapsed;if (!mService.mHandler.hasMessages(IDLE_UIDS_MSG)) {// 發送uid idle消息,處于后臺時間BACKGROUND_SETTLE_TIME是1minmService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,mConstants.BACKGROUND_SETTLE_TIME);}}
    在AMS的MainHandler處理該消息并調用idleUids去設置對應的uid idle
    • idle處理邏輯是在system server的main線程中進行的
    • idle時間是在處于后臺或不在臨時白名單的1min后
    • 遍歷active uid時,時間到了就執行doStopUidLocked
    • 時間未到計算更新為最近的一次idle時間并再次發送IDLE_UIDS_MSG消息
    final class MainHandler extends Handler {@Overridepublic void handleMessage(Message msg) {switch (msg.what) {......case IDLE_UIDS_MSG: {idleUids();} break; @GuardedBy("mService")void idleUidsLocked() {final int N = mActiveUids.size();if (N <= 0) {return;}final long nowElapsed = SystemClock.elapsedRealtime();// 得到起始后臺時間點邊界,大于這個值此時不會被idlefinal long maxBgTime = nowElapsed - mConstants.BACKGROUND_SETTLE_TIME;long nextTime = 0;for (int i = N - 1; i >= 0; i--) {final UidRecord uidRec = mActiveUids.valueAt(i);final long bgTime = uidRec.lastBackgroundTime;// 上次處于后臺時間 > 0表示當前uid處于后臺if (bgTime > 0 && !uidRec.idle) {// 處于后臺時間超過1minif (bgTime <= maxBgTime) {// 打印event log : am_uid_idleEventLogTags.writeAmUidIdle(uidRec.uid);// 給idle標志位賦值uidRec.idle = true;uidRec.setIdle = true;// stop 后臺ServicemService.doStopUidLocked(uidRec.uid, uidRec);} else {// 計算下次idle消息時間點if (nextTime == 0 || nextTime > bgTime) {nextTime = bgTime;}}}} // 發送下次idle消息if (nextTime > 0) {mService.mHandler.removeMessages(IDLE_UIDS_MSG);mService.mHandler.sendEmptyMessageDelayed(IDLE_UIDS_MSG,nextTime + mConstants.BACKGROUND_SETTLE_TIME - nowElapsed);}}
    stop后臺service的邏輯
    • AMS的doStopUidLocked方法會先stop 后臺service,再去更新uid并分發uid的change
    • stopInBackgroundLocked回調后,service不一定會真被stop
    //AMS.java@GuardedBy("this")final void doStopUidLocked(int uid, final UidRecord uidRec) {mServices.stopInBackgroundLocked(uid);enqueueUidChangeLocked(uidRec, uid, UidRecord.CHANGE_IDLE);} // ActiveServices.javavoid stopInBackgroundLocked(int uid) {// 獲取該uid下的所有serviceServiceMap services = mServiceMap.get(UserHandle.getUserId(uid));ArrayList<ServiceRecord> stopping = null;if (services != null) {// 遍歷所獲取到的servicesfor (int i = services.mServicesByInstanceName.size() - 1; i >= 0; i--) {ServiceRecord service = services.mServicesByInstanceName.valueAt(i);// start方式啟動的serviceif (service.appInfo.uid == uid && service.startRequested) {// 獲取當前service的start 權限,miui會多傳入callingPackage,對諸如小米推送拉起的service放開權限if (mAm.getAppStartModeLocked(service.appInfo.uid, service.packageName,service.appInfo.targetSdkVersion, -1, false, false, false)!= ActivityManager.APP_START_MODE_NORMAL) {if (stopping == null) {stopping = new ArrayList<>();}String compName = service.shortInstanceName;// 打印event log am_stop_idle_serviceEventLogTags.writeAmStopIdleService(service.appInfo.uid, compName);// 打印idle相關的system logStringBuilder sb = new StringBuilder(64);sb.append("Stopping service due to app idle: ");UserHandle.formatUid(sb, service.appInfo.uid);sb.append(" ");TimeUtils.formatDuration(service.createRealTime- SystemClock.elapsedRealtime(), sb);sb.append(" ");sb.append(compName);Slog.w(TAG, sb.toString());// 將當前service添加進stoppping列表stopping.add(service);// 如果當前app不在電池優化白名單中,那么前臺service也是有可能不允許啟動的,所以要取消notificationif (appRestrictedAnyInBackground(service.appInfo.uid, service.packageName)) {cancelForegroundNotificationLocked(service);}}}}if (stopping != null) {for (int i=stopping.size()-1; i>=0; i--) {ServiceRecord service = stopping.get(i);service.delayed = false;services.ensureNotStartingBackgroundLocked(service);// stop servicestopServiceLocked(service);}}}} private final void bringDownServiceIfNeededLocked(ServiceRecord r, boolean knowConn,boolean hasConn) {if (isServiceNeededLocked(r, knowConn, hasConn)) {return;}// 如果有新拉起service的需求,本次不會stop該serviceif (mPendingServices.contains(r)) {return;}bringDownServiceLocked(r);}

    總結

    以上是生活随笔為你收集整理的framework层Service的基础知识和常见问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    日韩国产欧美在线播放 | 麻豆传媒电影在线观看 | 久草免费在线观看视频 | 麻豆视频www | 日韩国产欧美在线视频 | 啪一啪在线 | www.亚洲视频 | 在线日韩精品视频 | 色亚洲激情| 日韩黄色在线观看 | 欧美国产不卡 | 狠狠的干 | 久久免费视频5 | 婷婷亚洲五月色综合 | 99免费看片 | 日韩va亚洲va欧美va久久 | 亚洲最新在线 | 亚洲一区二区三区四区精品 | 亚洲精品乱码久久久久久蜜桃不爽 | 欧美日韩在线观看不卡 | 久久精品免费 | 九九九在线观看 | 亚洲精品在线视频网站 | 欧美另类tv| 在线 国产 日韩 | 亚洲免费观看在线视频 | 色婷婷狠| 日韩理论电影在线观看 | 欧美性色黄 | 操操操综合 | 久久视奸| 国产伦理精品一区二区 | 成人精品福利 | 久久午夜视频 | 六月丁香婷婷网 | 日本亚洲国产 | 国语黄色片 | 国产精品99久久久精品免费观看 | 一级黄色片在线观看 | 999热视频 | 免费高清在线视频一区· | 综合色天天 | 在线国产欧美 | 97色噜噜| 日韩毛片在线免费观看 | 国产99一区二区 | 亚洲精品视频一 | 欧美一级性视频 | 久久天天躁狠狠躁亚洲综合公司 | 国产亚洲精品久久久久5区 成人h电影在线观看 | 不卡av在线免费观看 | 国产在线一卡 | 91色在线观看视频 | 99国产一区二区三精品乱码 | 国产一级二级在线观看 | 在线日韩中文 | 久久精品一区二区三 | 久久久久久久久久久久久9999 | 国产亚洲精品美女 | 国产在线视频在线观看 | 日日夜夜精品网站 | 亚洲日本精品 | 天天色综合三 | 91视频免费看片 | x99av成人免费 | 久草网在线视频 | 精品成人a区在线观看 | 国产精品久久久99 | 国产不卡免费视频 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 亚洲成 人精品 | 精品亚洲国产视频 | 探花国产在线 | 在线观看91网站 | 国产视频资源在线观看 | www.伊人色.com| 樱空桃av | 欧美激情一区不卡 | 亚洲影视九九影院在线观看 | 天天久久综合 | 亚洲欧美视频网站 | 国产一区二区影院 | 99爱视频 | 国产激情小视频在线观看 | 在线观看中文字幕一区二区 | 免费看污在线观看 | 亚洲精品综合一区二区 | 日本中文字幕视频 | 夜夜夜夜夜夜操 | 成人久久久久久久久久 | 成人午夜片av在线看 | 97爱 | 日韩免费一级电影 | 九九九九九国产 | 高潮久久久久久 | 免费看黄色91 | 国产一区二区播放 | 97精品国产aⅴ | 狠狠狠狠狠狠狠 | 欧美日韩高清在线观看 | 天天操天天艹 | 超碰97人 | 国产精品久久99 | 91麻豆精品国产午夜天堂 | 亚洲在线成人精品 | 99热这里只有精品在线观看 | 国产精品大片在线观看 | 日韩精品一区二 | 久久国产精品免费一区二区三区 | 日韩成人不卡 | 精品美女在线视频 | 天天撸夜夜操 | av综合站 | 黄色资源在线观看 | 最新的av网站 | 国产精品免费视频久久久 | 91福利影院在线观看 | 日韩网站在线播放 | 久久精品韩国 | 青青草国产免费 | 五月亚洲综合 | 草莓视频在线观看免费观看 | 久久精品视频国产 | 色婷婷午夜 | 四虎在线观看精品视频 | 最近中文字幕免费 | 国内成人综合 | 免费观看黄色av | 日本精品久久久久 | 国产福利中文字幕 | 操综合 | 丁香免费视频 | 久久99在线| 91亚洲激情| 香蕉视频4aa | 亚洲人成人天堂h久久 | 精品国产视频在线观看 | 久久 精品一区 | 中文字幕在线视频网站 | 日本中文字幕视频 | 亚洲精品18日本一区app | 91成人看片 | 免费视频成人 | 91视频免费看 | www.亚洲精品视频 | www在线观看国产 | 天天色天天综合 | 免费性网站 | 91成人免费电影 | 久久精品99国产国产 | 在线成人性视频 | 久久久免费看 | 韩国精品福利一区二区三区 | 精品女同一区二区三区在线观看 | 日本少妇高清做爰视频 | 日韩久久精品一区二区 | 国产精品涩涩屋www在线观看 | 久久av网址 | 高清av在线免费观看 | 免费在线播放av电影 | 男女啪啪免费网站 | 夜夜操网 | 天天干天天做天天操 | 91av电影在线观看 | 免费亚洲精品 | 成人黄色小说在线观看 | 国产精品久久久久久久久久久免费看 | 最新99热 | 日韩免费在线视频 | 91丨九色丨蝌蚪丰满 | 波多野结衣综合网 | 中文有码在线 | 国产一区在线播放 | 久久久久北条麻妃免费看 | 在线免费av观看 | 亚洲欧美在线视频免费 | 日韩欧美视频免费观看 | 亚洲开心色 | 99精品在线免费 | 精品美女久久久久久免费 | 500部大龄熟乱视频使用方法 | 射久久久| 国产视频在线观看一区 | 天天色天天操综合 | 96久久| 奇米导航| 日本久久免费视频 | 日韩视频www | 激情综合五月婷婷 | 国产青草视频在线观看 | 91免费高清视频 | 综合精品在线 | 天天天插| 最新亚洲视频 | 日韩在线一区二区免费 | 99视频网站 | 久久噜噜少妇网站 | 日日夜夜噜 | 中文乱码视频在线观看 | 国产麻豆电影 | 亚洲黄色av网址 | 在线观看中文 | 久色 网| 91一区一区三区 | 毛片3 | av在线网站免费观看 | 久久免费视频7 | 日韩一区二区在线免费观看 | 久久影视中文字幕 | 99热精品视| 免费观看91| 中文字幕成人网 | 天天干.com | 国产成人av综合色 | 亚洲精品综合一二三区在线观看 | 国产精品第一页在线 | 久久久久久久久久电影 | 亚洲自拍av在线 | 亚洲一区美女视频在线观看免费 | 91少妇精拍在线播放 | 五月婷婷狠狠 | 欧美精品国产综合久久 | 日韩91精品 | 九九视频免费观看视频精品 | 天天天天天天操 | 成人97人人超碰人人99 | 免费高清在线视频一区· | 国产精品综合久久久久久 | 四虎亚洲精品 | 在线www色 | 国产精品ⅴa有声小说 | 日本久久久久久久久 | 五月婷婷操| 91久久黄色 | 日韩美女一级片 | 日日干影院 | 成人动漫一区二区 | 久久久久久免费毛片精品 | 成人av资源网站 | 国产男女爽爽爽免费视频 | 人人插人人做 | 国产亚洲欧美精品久久久久久 | 欧美精品一区二区三区一线天视频 | 日韩特黄av | 欧美一区二区免费在线观看 | 久久99视频免费 | 伊人婷婷色 | 亚洲在线看 | 在线视频欧美亚洲 | zzijzzij日本成熟少妇 | 91成人精品一区在线播放69 | 亚洲黄色软件 | 怡红院av久久久久久久 | 免费久久99精品国产婷婷六月 | 亚洲精品综合久久 | 成人va天堂 | 亚洲国产成人精品在线观看 | 国产免费又爽又刺激在线观看 | 中文字幕在线播放日韩 | 日韩av影视在线 | 亚洲第一区在线播放 | 国产激情电影综合在线看 | 国产成人精品三级 | 欧美日韩啪啪 | 在线观看黄av | 欧美日韩在线第一页 | 日韩偷拍精品 | 伊人影院av | a一片一级| 视频二区 | 免费高清看电视网站 | 精品国偷自产国产一区 | 人人要人人澡人人爽人人dvd | 亚洲h在线播放在线观看h | 亚洲成a人片在线观看网站口工 | 五月婷婷国产 | 日韩精品视频免费在线观看 | 国产精品亚洲综合久久 | 免费看一级黄色大全 | 精品福利国产 | 日韩精品中文字幕在线不卡尤物 | 欧美精品久久久久久久久免 | 欧美日韩不卡一区二区三区 | 成人sm另类专区 | 日韩av电影一区 | 欧美日韩在线播放一区 | 国产涩涩在线观看 | 一区二区三区高清不卡 | www.婷婷com| 99精品视频在线观看播放 | 日韩视频在线不卡 | 欧美日韩精品在线免费观看 | 久久精彩 | 日韩天堂在线观看 | 六月丁香激情网 | 天天色天天操天天爽 | 五月婷婷亚洲 | 久草精品视频 | av黄色在线播放 | 欧美日韩一区二区三区在线观看视频 | 亚州国产精品久久久 | 欧美日韩视频观看 | 国产精品21区 | 狠狠干天天 | 成年人免费观看国产 | 久久艹精品 | 91日韩精品一区 | 免费黄色小网站 | 三级小视频在线观看 | 欧美二区视频 | 91在线影院 | 四虎4hu永久免费 | 亚洲精品国产片 | 在线成人一区二区 | 国外成人在线视频网站 | 91视频免费网站 | 日本高清中文字幕有码在线 | 伊人影院99 | 久操视频在线免费看 | 日本三级国产 | 97视频人人澡人人爽 | a视频在线观看免费 | 国产一区自拍视频 | 在线免费观看视频你懂的 | 一区二区精品视频 | 国产无遮挡猛进猛出免费软件 | 日韩电影精品 | 日本久久中文 | 成人观看| 手机av在线网站 | 成 人 黄 色 片 在线播放 | 四虎最新入口 | 91视频在线观看免费 | 中文字幕av在线不卡 | 五月天六月色 | 国产区久久 | 色噜噜色噜噜 | 久久国产露脸精品国产 | 99九九99九九九视频精品 | 色综合久久88色综合天天 | 手机色站 | av大全在线免费观看 | 麻豆视屏 | 亚洲综合视频在线 | 波多野结衣视频在线 | 色吊丝在线永久观看最新版本 | 亚洲精品网页 | 午夜久久久影院 | 成人精品视频久久久久 | 国产精品久久久久久超碰 | 欧美日韩在线观看一区 | 在线观看爱爱视频 | 永久av免费在线观看 | 最新成人在线 | 在线蜜桃视频 | 午夜av在线电影 | 天天夜操 | 成人av在线一区二区 | 日本一区二区三区视频在线播放 | 热久久99这里有精品 | 免费色视频网址 | 亚av在线 | 久久国产精品久久久 | 五月色丁香 | 99视频久| 久久久精品影视 | 黄色av一区二区 | 在线激情网 | 香蕉手机在线 | 中文字幕在线观看一区 | 91免费视频国产 | 亚洲精品国产精品国自产在线 | 97在线播放视频 | 成人免费视频播放 | 久久手机精品视频 | 天天操夜夜操国产精品 | 久久综合五月天婷婷伊人 | 天天爱天天插 | 亚洲精品资源 | 最近中文字幕mv免费高清在线 | 在线免费观看涩涩 | 精品一区在线看 | 丁香激情综合国产 | 国产高清一 | 狠狠躁夜夜躁人人爽视频 | 久久99国产精品免费 | 最新中文在线视频 | 91一区啪爱嗯打偷拍欧美 | 国产精品黄网站在线观看 | 亚洲第五色综合网 | 黄色软件视频大全免费下载 | 狠狠色婷婷丁香六月 | 久久99热国产 | 国产高清视频在线观看 | 亚洲视频免费视频 | 中文字幕综合在线 | 91视频 - v11av| 日韩99热| 日韩精品一区二区在线观看 | 亚洲精品乱码久久久一二三 | www.天堂av| 一区中文字幕 | 97在线资源| 午夜久久久久久久久久影院 | 日韩一级电影网站 | www.天天射 | 久久久资源 | 天天插综合 | 亚洲欧美视频在线播放 | 久久久九色精品国产一区二区三区 | 91精品国产成人观看 | 亚洲乱码一区 | 国产精品久久一区二区无卡 | 日韩女同一区二区三区在线观看 | 国产特黄色片 | 精品亚洲视频在线 | 国产精品理论片在线播放 | 免费在线播放 | 激情五月婷婷综合 | 欧美日韩二三区 | 黄色一级片视频 | 国产91在线 | 美洲 | 国产黄在线免费观看 | 国产伦精品一区二区三区高清 | 干干干操操操 | 操操综合网 | 日韩在线不卡av | 国内偷拍精品视频 | 91九色视频在线观看 | 91精品导航 | 色精品视频 | 最近中文字幕免费av | 欧美三人交 | 国产黄色一级大片 | 欧美一级片免费播放 | 中文字幕第一页在线 | 久久精彩 | 2017狠狠干 | 国产午夜精品免费一区二区三区视频 | 日韩免费一二三区 | 精品一区二区三区久久 | 最新成人在线 | 国产福利av在线 | 色婷婷精品大在线视频 | 日韩在线视频看看 | 国产精品视频永久免费播放 | 欧美精品免费在线观看 | 国产91精品欧美 | 久久久久久久久久久久久久电影 | 日韩精品1区2区 | 久久成年人网站 | 99视频免费看 | 久久久国产一区二区三区 | 九九免费在线观看 | 久久精品99国产精品酒店日本 | 激情综合五月天 | 国产精品麻豆三级一区视频 | 国产视频欧美视频 | 91毛片视频| 欧美性大战久久久久 | 免费国产一区二区视频 | 欧美五月婷婷 | 免费亚洲精品视频 | 亚洲色图激情文学 | 在线亚洲激情 | 91在线看黄| 亚洲美女在线一区 | 天天操夜夜操天天射 | 香蕉成人在线视频 | 欧美狠狠操 | 日韩成人不卡 | 丁香五婷 | 中文字幕欧美日韩va免费视频 | 九九在线视频免费观看 | 亚洲97在线 | 美女久久视频 | 久久69av| 天天色视频 | 欧美成人理伦片 | 日韩欧美网站 | 国模视频一区二区三区 | 狠狠色丁香婷婷综合基地 | 国产精品videossex国产高清 | 亚洲1区在线 | 最新日韩在线观看视频 | 久久久久久久久电影 | 国产理论片在线观看 | 日日操天天射 | 久久久久久久久毛片精品 | 国产区网址 | 9999激情 | 婷婷开心久久网 | 久久99精品久久久久久久久久久久 | 国产高清精品在线观看 | www黄色| 99久久99热这里只有精品 | 色窝资源 | 精品亚洲va在线va天堂资源站 | 国产高清绿奴videos | 最近中文字幕大全中文字幕免费 | 国内精品美女在线观看 | 日韩av不卡在线观看 | 国产成人亚洲在线电影 | 亚洲国产精品久久 | 国产一级黄大片 | 97视频人人澡人人爽 | 最近2019好看的中文字幕免费 | 人人干免费 | 精品国产伦一区二区三区观看体验 | 国产亚洲精品中文字幕 | 成人国产精品久久久久久亚洲 | 国产一区二区免费在线观看 | 免费高清男女打扑克视频 | 狠狠躁夜夜躁人人爽视频 | 91视频免费看 | 亚洲精品网页 | 激情网在线视频 | www.久草.com | 五月婷影院 | 亚洲免费av在线 | 欧美日韩高清 | 99福利影院| 国精产品999国精产品岳 | 成年人国产精品 | 久久色网站 | 中文字幕在线观看三区 | 999一区二区三区 | 日韩av手机在线看 | 中文字幕视频一区二区 | 国产精品成人一区二区三区吃奶 | 99免费在线 | 麻花天美星空视频 | 在线小视频 | 狠狠精品 | 在线黄色国产电影 | 色婷婷激情电影 | 久久久久久久久毛片 | 国产中文字幕视频在线 | 黄色动态图xx | 欧美黄色高清 | 97色在线观看免费视频 | 国产h在线播放 | 天天插天天射 | 欧美精品久久久久性色 | 中文字幕欧美日韩va免费视频 | 日韩videos | 国产一区网址 | 天天干天天怕 | 亚洲美女精品区人人人人 | 国产精品成人自拍 | 四季av综合网站 | 久久久69| av大片网站| www日韩视频| 日本最新高清不卡中文字幕 | 国产精品国产亚洲精品看不卡 | 欧美一区在线看 | 日韩一区二区三区免费视频 | 韩国av不卡 | 日韩av成人在线观看 | 在线观看视频免费播放 | 九九热免费在线观看 | 国产一级免费观看视频 | 免费av网址在线观看 | 精品超碰 | 日批在线观看 | 亚洲一区二区观看 | 久久久久99精品成人片三人毛片 | 国产精品自产拍在线观看蜜 | 五月婷在线播放 | 成年人黄色免费网站 | 免费福利视频导航 | 日韩久久久久久久久久 | 日韩资源在线观看 | 日韩免费一级电影 | 五月婷激情 | 9在线观看免费高清完整版 玖玖爱免费视频 | 在线观看免费日韩 | 91污在线观看 | 开心激情婷婷 | 久久综合免费 | 999久久国精品免费观看网站 | 中文字幕成人在线观看 | 中文字幕高清免费日韩视频在线 | 国产99久久久精品 | 91在线影院| 国产99久久九九精品 | 91精品视频在线看 | 天天综合久久综合 | 日韩视频中文字幕在线观看 | 久久新 | 成人小视频在线播放 | 96超碰在线| 精品女同一区二区三区在线观看 | 国产精品2018 | 久久久久综合精品福利啪啪 | 久久国内精品99久久6app | 国产不卡一区二区视频 | 99久久99久久 | 国产主播大尺度精品福利免费 | 中文字幕亚洲欧美日韩2019 | 欧美一级免费在线 | 日批视频国产 | 日韩激情视频 | 九九九电影免费看 | 欧美色噜噜 | 亚洲激情在线 | 最近中文字幕在线 | 亚洲另类在线视频 | 国产黄色片在线免费观看 | 在线观看中文字幕网站 | 欧美日韩免费一区二区三区 | 国产色拍拍拍拍在线精品 | 丁香久久久 | 最近2019中文免费高清视频观看www99 | 天天操天天操天天操天天操天天操天天操 | 久久论理 | 九九热国产视频 | 久久人人添人人爽添人人88v | 又黄又刺激视频 | 日韩免费一区二区 | 中文超碰字幕 | 久久精品91视频 | 狠狠做深爱婷婷综合一区 | 69视频在线播放 | 天天操综合网站 | 亚洲在线黄色 | 日本久久久精品视频 | 国产精品一区二区在线观看免费 | 日韩区在线观看 | 国产免费一区二区三区网站免费 | 日本中文字幕电影在线免费观看 | 国产最顶级的黄色片在线免费观看 | 欧美色精品天天在线观看视频 | 精品国产aⅴ一区二区三区 在线直播av | av手机在线播放 | 日日夜夜精品 | 黄色电影小说 | 99久久精品免费看国产免费软件 | 日韩黄色一级电影 | 伊人网综合在线观看 | 免费看的黄色的网站 | 精品伦理一区二区三区 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 黄色大片入口 | 色综合久久综合中文综合网 | 欧美激情第一区 | 欧美精品亚洲二区 | 日韩狠狠操 | 波多野结衣综合网 | 日韩成人邪恶影片 | 91精品福利在线 | 久久久久久久久久久久av | 久久手机看片 | 欧美精品一区二区三区四区在线 | 天天射天天干天天爽 | 日韩r级在线| 亚洲一区二区三区毛片 | 五月婷婷六月丁香激情 | 韩国av一区二区 | 日韩中文在线字幕 | 日本福利视频在线 | 99久久国产免费看 | 一区二区视频网站 | 精品久久久久久久久久久久久久久久久久 | www.五月激情.com | 免费av观看 | 久久成人免费 | 精品久久久久久亚洲综合网 | 亚洲精品综合一区二区 | 日韩大片在线看 | 成人国产精品久久久久久亚洲 | 一区二区欧美在线观看 | 欧美精品三级 | 色婷婷在线播放 | 亚洲一区二区精品视频 | 99热都是精品 | 黄色国产区 | 久久网页| 热久久在线视频 | 天天综合视频在线观看 | 视频在线观看91 | www.色综合.com | 91视频啊啊啊| 国产18精品乱码免费看 | 国产在线高清视频 | 免费成人av在线看 | 999久久久免费视频 午夜国产在线观看 | 国产精品一区二区在线播放 | 黄色片网站大全 | 亚洲人人网 | 国产精品视频 | 亚洲欧洲精品一区二区精品久久久 | aaaaaa毛片 | 免费在线观看日韩 | 人人爱人人做人人爽 | 免费麻豆网站 | 99在线精品视频 | 国产91在线观 | 成年人免费在线观看网站 | 992tv在线成人免费观看 | 久久久久亚洲精品男人的天堂 | 国产精品一区二区在线免费观看 | 日韩亚洲国产中文字幕 | 天天干天天操天天拍 | 国产亚洲免费观看 | www.夜夜爱| 在线 影视 一区 | 国产在线色| 欧美极品少妇xbxb性爽爽视频 | 黄色特级片 | 超碰97在线资源站 | 天天操操操操操 | 成人av影视观看 | 免费色视频在线 | 制服丝袜欧美 | 999成人免费视频 | 在线国产中文字幕 | av中文字幕在线电影 | 黄色大片免费播放 | 狠狠色综合网站久久久久久久 | 日韩av片在线 | 国产99久久久精品 | 亚洲一区动漫 | 在线观看日韩中文字幕 | 中文字幕免费看 | 狠狠干美女 | 中文字幕高清有码 | 日韩精品在线视频免费观看 | 久久久久久久久久久影院 | 九九精品无码 | 中文在线www | 久久久久福利视频 | 九九热av | 日韩视频在线不卡 | 久草国产视频 | 久久黄色影院 | 欧美日韩久久不卡 | 蜜臀精品久久久久久蜜臀 | 久久精品久久国产 | 久久精品国产99国产 | 91成人精品视频 | 精品国产99国产精品 | 国产婷婷色 | 国产一级黄色电影 | 丁香婷婷色月天 | 美女啪啪图片 | 成片免费观看视频大全 | 国产99久久精品一区二区300 | av成人免费在线观看 | 日韩精品视频免费在线观看 | 最近中文字幕完整视频高清1 | 欧美激情精品久久久久久免费印度 | 中文字幕亚洲国产 | 俺要去色综合狠狠 | 久久久官网| 久久久久一区二区三区四区 | 91精品伦理 | 欧美片网站yy | 精品国产乱码久久久久久1区二区 | 91精品久久久久久久99蜜桃 | 国产无套精品久久久久久 | 免费h在线观看 | 久久久久一区二区三区 | 久久草 | av片在线观看 | 草久在线观看 | 五月婷婷另类国产 | www成人av| 免费久久精品视频 | 最新国产精品视频 | 99热这里只有精品久久 | 福利区在线观看 | 国产精品久久久久久久久久三级 | 岛国一区在线 | 国产99re| 亚洲视频2 | 在线免费观看黄色av | 激情综合网色播五月 | 久久www免费人成看片高清 | 久草新在线 | 99久久久国产精品 | 在线黄色av电影 | 青青河边草手机免费 | 久草综合在线 | 色噜噜狠狠狠狠色综合久不 | 亚洲精品国产拍在线 | 国产成人亚洲在线观看 | av中文字幕日韩 | 国产香蕉久久 | 久久精品中文字幕少妇 | www.亚洲在线| 国产成人免费网站 | 狠狠操夜夜 | 日本最新一区二区三区 | 日韩在线视频精品 | 西西444www大胆高清视频 | 久久久久久久久久久影院 | 亚洲资源网 | 中日韩欧美精彩视频 | 中文字幕之中文字幕 | 97热在线观看 | 精品国产一区二区三区免费 | 亚洲视频在线观看 | 亚洲成色777777在线观看影院 | av亚洲产国偷v产偷v自拍小说 | 久久久久久综合 | 精品国产一区二区三区在线观看 | 91亚洲影院 | 日韩一区在线播放 | 日日夜夜精品 | 天天操天天操天天干 | 欧美日韩精品综合 | 天天射天天操天天干 | 欧美伦理电影一区二区 | 91看片在线 | 久久久精品一区二区 | 欧美一区二区三区免费观看 | 毛片视频网址 | 成人蜜桃网 | 婷婷成人亚洲综合国产xv88 | 日本久久免费视频 | 成人av免费在线播放 | 三级av网 | 亚洲欧美国产日韩在线观看 | 亚洲 欧洲av | 91污在线观看 | 国际av在线 | 欧美性成人 | 久久精品综合网 | 日韩在线 | 日本久久成人 | 欧美日韩免费看 | 成年人在线看片 | 一区二区视 | 久久久久国产精品一区二区 | 日本一区二区三区免费看 | 久久久久久久综合色一本 | 91av色| 香蕉视频在线网站 | 天天操天天操天天操天天操 | 国产精品99久久久久久武松影视 | 中文字幕乱码一区二区 | 国产一卡在线 | 久久久亚洲电影 | 超薄丝袜一二三区 | 色吊丝在线永久观看最新版本 | 亚洲国产精品成人综合 | 久久精品国产免费观看 | 色噜噜在线观看视频 | 天天天天天天干 | 欧美天天综合网 | 五月婷婷视频在线 | 精品久久久久久久久久久院品网 | 国产精品久久99综合免费观看尤物 | 国产白浆在线观看 | 欧美了一区在线观看 | 精品1区2区3区 | 一区二区av | 国产一区二区精 | 日本成人黄色片 | 超碰免费观看 | 亚洲一区免费在线 | 免费av的网站 | 国产精品久久视频 | 久久免费福利视频 | 欧美网址在线观看 | 最近中文字幕免费观看 | 91最新视频 | 日韩激情在线视频 | 玖操 | 综合色站 | 亚洲成人资源网 | 超碰人人乐 | 亚洲精品大全 | 久草在线在线 | 亚洲国产色一区 | 天天爽天天爽 | 久久国产精品小视频 | 国产精品久久影院 | bayu135国产精品视频 | 免费亚洲视频 | 69国产精品视频 | 久久深夜 | 在线草| 一级一片免费观看 | 99视频在线精品免费观看2 | 黄色一级大片在线免费看国产一 | 欧美在线视频日韩 | 欧美综合在线观看 | 成人黄色大片 | 黄色av一区 | 日韩精品不卡在线观看 | 精品久久99 | 亚洲韩国一区二区三区 | 国产色道 | 国产色视频网站 | 丁香一区二区 | 国产午夜精品一区二区三区在线观看 | 国产福利午夜 | 97精品免费视频 | 亚洲少妇自拍 | 天天色天天射天天操 | 波多野结衣视频一区二区 | 国产视频二区三区 | 国产免费黄视频在线观看 | 欧美天天综合 | 91麻豆网| 激情偷乱人伦小说视频在线观看 | 精品美女在线观看 | www.亚洲| 欧美日韩精品在线免费观看 | 日韩在线观看不卡 | 日韩av黄| 中文超碰字幕 | 黄色美女免费网站 | 色婷婷视频在线观看 | 波多野结衣视频一区 | 最近更新的中文字幕 | 欧美肥妇free | 亚洲理论在线观看电影 | 91亚洲精品国偷拍自产在线观看 | 久久天天操 | 中文av一区二区 | 日韩精品视频在线观看免费 | 亚洲欧美va | 久草在线视频新 | 成人手机在线视频 | 亚洲午夜av久久乱码 | 国产日本高清 | 欧美精品在线一区二区 | 中文字幕在线专区 | 欧美精品亚洲二区 | 免费看的黄色的网站 | 天天夜夜亚洲 | 久久国产精品99久久久久久丝袜 | 日韩欧美69 | 国产精品视频区 | 久久综合干 | 中文字幕乱码亚洲精品一区 | 成人免费观看大片 | www.狠狠色| 久久免费视频2 | 久久久久久综合 | 日本精品一 | 91成人网页版 | 玖玖在线观看视频 | 综合激情av| 色婷婷88av视频一二三区 | 99久久激情视频 | 伊人狠狠干 | a√天堂中文在线 | 精品久久久久久电影 | 免费观看国产成人 | 久久免费视频网站 | 一区二区三区免费在线观看视频 | 中文字幕在线观看91 | 久久精品视频在线观看 | 中文字幕在线视频一区二区 | 亚洲精品在线一区二区 | 日韩在线精品一区 | 国产超碰在线观看 | 中文字幕在线观看完整 | www蜜桃视频 | av在线成人 | 亚洲午夜精品在线观看 | 亚洲精品视频偷拍 | 欧美亚洲一区二区在线 | 99中文视频在线 | 色噜噜狠狠狠狠色综合久不 | 国产a精品 | 日本中文字幕网址 | 人人草在线观看 | 丁香在线观看完整电影视频 | 日韩av电影中文字幕在线观看 | 国产日本在线观看 | 国产一卡二卡在线 | 欧美成人va| 国产激情小视频在线观看 | av一级一片 | 在线免费观看麻豆 | 亚欧日韩成人h片 | 免费福利影院 | 玖玖视频免费在线 | 中文字幕一区二区三区乱码在线 | 欧美日韩精品网站 | 久久精品一区二区 | 国产成人99久久亚洲综合精品 | 久久久国产精品成人免费 | 五月婷婷激情综合网 | 成人免费在线网 | 免费观看十分钟 | 亚洲国产精品电影在线观看 | 天天拍夜夜拍 | 亚洲成人高清在线 | 国产高清免费视频 | 日韩国产精品久久 | 国产69精品久久99不卡的观看体验 |