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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android系统中的进程管理:进程的优先级

發(fā)布時間:2025/3/15 Android 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android系统中的进程管理:进程的优先级 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本文是Android進(jìn)程管理系列文章的第二篇,會講解進(jìn)程管理中的優(yōu)先級管理。

進(jìn)程管理的第一篇文章:《進(jìn)程的創(chuàng)建》請?zhí)D(zhuǎn)至這里。

本文適合Android平臺的應(yīng)用程序開發(fā)者,也適合對于Android系統(tǒng)內(nèi)部實現(xiàn)感興趣的讀者。

前言

進(jìn)程的優(yōu)先級反應(yīng)了系統(tǒng)對于進(jìn)程重要性的判定。

在Android系統(tǒng)中,進(jìn)程的優(yōu)先級影響著以下三個因素:

  • 當(dāng)內(nèi)存緊張時,系統(tǒng)對于進(jìn)程的回收策略
  • 系統(tǒng)對于進(jìn)程的CPU調(diào)度策略
  • 虛擬機(jī)對于進(jìn)程的內(nèi)存分配和垃圾回收策略

本文會主要講解系統(tǒng)對于進(jìn)程優(yōu)先級的判斷依據(jù)和計算方法。

在Processes and Threads?(如果你還沒有閱讀,請立即閱讀一下這篇文章)一文中,我們已經(jīng)了解到,系統(tǒng)對于進(jìn)程的優(yōu)先級有如下五個分類:

  • 前臺進(jìn)程
  • 可見進(jìn)程
  • 服務(wù)進(jìn)程
  • 后臺進(jìn)程
  • 空進(jìn)程
  • 實際上這只是一個粗略的劃分。在系統(tǒng)的內(nèi)部實現(xiàn)中,優(yōu)先級遠(yuǎn)不止這么五種。

    優(yōu)先級的依據(jù)

    我們來簡單列一下應(yīng)用組件與進(jìn)程的相關(guān)信息:

    • 每一個Android的應(yīng)用進(jìn)程中,都可能包含四大組件中的一個/種或者多個/種。
    • 對于運(yùn)行中的Service和ContentProvider來說,可能有若干個客戶端進(jìn)程正在對其使用。
    • 應(yīng)用進(jìn)程是由ActivityManagerService發(fā)送請求讓zygote創(chuàng)建的,并且ActivityManagerService中對于每一個運(yùn)行中的進(jìn)程都有一個ProcessRecord對象與之對應(yīng)。

    ProcessRecord簡化圖如下所示:

    在ProcessRecord中,詳細(xì)記錄了應(yīng)用組件的相關(guān)信息,相關(guān)代碼如下:

    // all activities running in the process final ArrayList<ActivityRecord> activities = new ArrayList<>(); // all ServiceRecord running in this process final ArraySet<ServiceRecord> services = new ArraySet<>(); // services that are currently executing code (need to remain foreground). final ArraySet<ServiceRecord> executingServices = new ArraySet<>(); // All ConnectionRecord this process holds final ArraySet<ConnectionRecord> connections = new ArraySet<>(); // all IIntentReceivers that are registered from this process. final ArraySet<ReceiverList> receivers = new ArraySet<>(); // class (String) -> ContentProviderRecord final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>(); // All ContentProviderRecord process is using final ArrayList<ContentProviderConnection> conProviders = new ArrayList<>();

    這里的:

    • activities?記錄了進(jìn)程中運(yùn)行的Activity
    • services,executingServices?記錄了進(jìn)程中運(yùn)行的Service
    • receivers?記錄了進(jìn)程中運(yùn)行的BroadcastReceiver
    • pubProviders?記錄了進(jìn)程中運(yùn)行的ContentProvider

    而:

    • connections?記錄了對于Service連接
    • conProviders?記錄了對于ContentProvider的連接

    連接就是對于客戶端使用狀態(tài)的記錄,對于Service和ContentProvider是類似的,每有一個客戶端就需要記錄一個連接。連接的意義在于:連接的客戶端的進(jìn)程優(yōu)先級會影響被使用的Service和ContentProvider所在進(jìn)程的優(yōu)先級。?例如:當(dāng)一個后臺的Service正在被一個前臺的Activity使用,那么這個后臺的Service就需要設(shè)置一個較高的優(yōu)先級以便不會被回收。(否則后臺Service進(jìn)程一旦被回收,便會對前臺的Activity造成影響。)

    所有這些組件的狀態(tài)就是其所在進(jìn)程優(yōu)先級的決定性因素。?組件的狀態(tài)是指:

    • Activity是否在前臺,用戶是否可見
    • Service正在被哪些客戶端使用
    • ContentProvider正在被哪些客戶端使用
    • BroadcastReceiver是否正在接受廣播

    優(yōu)先級的基礎(chǔ)

    oom_score_adj

    對于每一個運(yùn)行中的進(jìn)程,Linux內(nèi)核都通過proc文件系統(tǒng)暴露這樣一個文件來允許其他程序修改指定進(jìn)程的優(yōu)先級:

    /proc/[pid]/oom_score_adj。(修改這個文件需要root權(quán)限)

    這個文件允許的值的范圍是:-1000 ~ +1000之間。值越小,表示進(jìn)程越重要

    當(dāng)內(nèi)存非常緊張時,系統(tǒng)便會遍歷所有進(jìn)程,以確定哪個進(jìn)程需要被殺死以回收內(nèi)存,此時便會讀取oom_score_adj?這個文件的值。關(guān)于這個值的使用,在后面講解進(jìn)程回收的的時候,我們會詳細(xì)講解。

    PS:在Linux 2.6.36之前的版本中,Linux 提供調(diào)整優(yōu)先級的文件是/proc/[pid]/oom_adj。這個文件允許的值的范圍是-17 ~ +15之間。數(shù)值越小表示進(jìn)程越重要。 這個文件在新版的Linux中已經(jīng)廢棄。

    但你仍然可以使用這個文件,當(dāng)你修改這個文件的時候,內(nèi)核會直接進(jìn)行換算,將結(jié)果反映到oom_score_adj這個文件上。

    Android早期版本的實現(xiàn)中也是依賴oom_adj這個文件。但是在新版本中,已經(jīng)切換到使用oom_score_adj這個文件。

    ProcessRecord中下面這些屬性反應(yīng)了oom_score_adj的值:

    int maxAdj; // Maximum OOM adjustment for this process int curRawAdj; // Current OOM unlimited adjustment for this process int setRawAdj; // Last set OOM unlimited adjustment for this process int curAdj; // Current OOM adjustment for this process int setAdj; // Last set OOM adjustment for this process

    maxAdj?指定了該進(jìn)程允許的oom_score_adj最大值。這個屬性主要是給系統(tǒng)應(yīng)用和常駐內(nèi)存的進(jìn)程使用,這些進(jìn)程的優(yōu)先級的計算方法與應(yīng)用進(jìn)程的計算方法不一樣,通過設(shè)定maxAdj保證這些進(jìn)程一直擁有較高的優(yōu)先級(在后面”優(yōu)先級的算法“中,我們會看到對于這個屬性的使用)。

    除此之外,還有四個屬性。

    這其中,curXXX這一組記錄了這一次優(yōu)先級計算的結(jié)果。在計算完成之后,會將curXXX復(fù)制給對應(yīng)的setXXX這一組上進(jìn)行備份。 (下文的其他屬性也會看到curXXX和setXXX的形式,和這里的原理是一樣的。)

    另外,xxxRawAdj記錄了沒有經(jīng)過限制的adj值,“沒有經(jīng)過限制”是指這其中的值可能是超過了oom_score_adj文件所允許的范圍(-1000 ~ 1000)。

    為了便于管理,ProcessList.java中預(yù)定義了oom_score_adj的可能取值。

    其實這里的預(yù)定義值也是對應(yīng)用進(jìn)程的一種分類,它們是:

    static final int UNKNOWN_ADJ = 1001; // 未知進(jìn)程 static final int PREVIOUS_APP_ADJ = 700; // 前一個應(yīng)用 static final int HOME_APP_ADJ = 600; // 桌面進(jìn)程 static final int SERVICE_ADJ = 500; // 包含了Service的進(jìn)程 static final int HEAVY_WEIGHT_APP_ADJ = 400; // 重量級進(jìn)程 static final int BACKUP_APP_ADJ = 300; // 備份應(yīng)用進(jìn)程 static final int PERCEPTIBLE_APP_ADJ = 200; // 可感知的進(jìn)程 static final int VISIBLE_APP_ADJ = 100; // 可見進(jìn)程 static final int VISIBLE_APP_LAYER_MAX = PERCEPTIBLE_APP_ADJ - VISIBLE_APP_ADJ - 1; static final int FOREGROUND_APP_ADJ = 0; // 前臺進(jìn)程 static final int PERSISTENT_SERVICE_ADJ = -700; // 常駐服務(wù)進(jìn)程 static final int PERSISTENT_PROC_ADJ = -800; // 常駐應(yīng)用進(jìn)程 static final int SYSTEM_ADJ = -900; // 系統(tǒng)進(jìn)程 static final int NATIVE_ADJ = -1000; // native系統(tǒng)進(jìn)程

    這里我們看到,FOREGROUND_APP_ADJ = 0,這個是前臺應(yīng)用進(jìn)程的優(yōu)先級。這是用戶正在交互的應(yīng)用,它們是很重要的,系統(tǒng)不應(yīng)當(dāng)把它們回收了。

    FOREGROUND_APP_ADJ = 0是普通應(yīng)用程序能夠獲取到的最高優(yōu)先級。

    而VISIBLE_APP_ADJ,PERCEPTIBLE_APP_ADJ,PREVIOUS_APP_ADJ這幾個級別的優(yōu)先級就逐步降低了。

    VISIBLE_APP_ADJ是具有可見Activity進(jìn)程的優(yōu)先級:同一時刻,不一定只有一個Activity是可見的,如果前臺Activity設(shè)置了透明屬性,那么背后的Activity也是可見的。

    PERCEPTIBLE_APP_ADJ是指用戶可感知的進(jìn)程,可感知的進(jìn)程包括:

    • 進(jìn)程中包含了處于pause狀態(tài)或者正在pause的Activity
    • 進(jìn)程中包含了正在stop的Activity
    • 進(jìn)程中包含了前臺的Service

    另外,PREVIOUS_APP_ADJ描述的是前一個應(yīng)用的優(yōu)先級。所謂“前一個應(yīng)用”是指:在啟動新的Activity時,如果新啟動的Activity是屬于一個新的進(jìn)程的,那么當(dāng)前即將被stop的Activity所在的進(jìn)程便會成為“前一個應(yīng)用”進(jìn)程。

    而HEAVY_WEIGHT_APP_ADJ?描述的重量級進(jìn)程是指那些通過Manifest指明不能保存狀態(tài)的應(yīng)用進(jìn)程。

    除此之外,Android系統(tǒng)中,有一些系統(tǒng)應(yīng)用會常駐內(nèi)存,這些應(yīng)用通常是系統(tǒng)實現(xiàn)的一部分,如果它們不存在,系統(tǒng)將處于比較奇怪的狀態(tài),例如SystemUI(狀態(tài)欄,Keyguard都處于這個應(yīng)用中)。

    所以它們的優(yōu)先級比所有應(yīng)用進(jìn)程的優(yōu)先級更高:PERSISTENT_SERVICE_ADJ = -700,PERSISTENT_PROC_ADJ = -800。

    另外,還有一些系統(tǒng)服務(wù)的實現(xiàn),如果這些系統(tǒng)服務(wù)不存在,系統(tǒng)將無法工作,所以這些應(yīng)用的優(yōu)先級最高,幾乎是任何任何時候都需要存在的:SYSTEM_ADJ = -900,NATIVE_ADJ = -1000。

    Schedule Group

    內(nèi)核負(fù)責(zé)了進(jìn)程的CPU調(diào)度,所有運(yùn)行中的進(jìn)程并非能平等的能獲取相等的時間片。在ProcessRecord中,通過Schedule Group來記錄進(jìn)程的調(diào)度組:

    int curSchedGroup; // Currently desired scheduling class int setSchedGroup; // Last set to background scheduling class

    它們可能的取值定義在ProcessList.java中:

    // Activity manager's version of Process.THREAD_GROUP_BG_NONINTERACTIVE static final int SCHED_GROUP_BACKGROUND = 0; // Activity manager's version of Process.THREAD_GROUP_DEFAULT static final int SCHED_GROUP_DEFAULT = 1; // Activity manager's version of Process.THREAD_GROUP_TOP_APP static final int SCHED_GROUP_TOP_APP = 2; // Activity manager's version of Process.THREAD_GROUP_TOP_APP // Disambiguate between actual top app and processes bound to the top app static final int SCHED_GROUP_TOP_APP_BOUND = 3;

    Process State

    進(jìn)程的狀態(tài)會影響虛擬機(jī)對于進(jìn)程的內(nèi)存分配和垃圾回收策略,ProcessRecord中的下面這幾個屬性記錄了進(jìn)程的狀態(tài):

    int curProcState; // Currently computed process state int repProcState; // Last reported process state int setProcState; // Last set process state in process tracker int pssProcState; // Currently requesting pss for

    這些屬性可能的取值定義在ActivityManager中,這些常量的名稱已經(jīng)說明了其作用:

    public static final int PROCESS_STATE_NONEXISTENT = -1;public static final int PROCESS_STATE_PERSISTENT = 0;public static final int PROCESS_STATE_PERSISTENT_UI = 1;public static final int PROCESS_STATE_TOP = 2;public static final int PROCESS_STATE_BOUND_FOREGROUND_SERVICE = 3;public static final int PROCESS_STATE_FOREGROUND_SERVICE = 4;public static final int PROCESS_STATE_TOP_SLEEPING = 5;public static final int PROCESS_STATE_IMPORTANT_FOREGROUND = 6;public static final int PROCESS_STATE_IMPORTANT_BACKGROUND = 7;public static final int PROCESS_STATE_BACKUP = 8;public static final int PROCESS_STATE_HEAVY_WEIGHT = 9;public static final int PROCESS_STATE_SERVICE = 10;public static final int PROCESS_STATE_RECEIVER = 11;public static final int PROCESS_STATE_HOME = 12;public static final int PROCESS_STATE_LAST_ACTIVITY = 13;public static final int PROCESS_STATE_CACHED_ACTIVITY = 14;public static final int PROCESS_STATE_CACHED_ACTIVITY_CLIENT = 15;public static final int PROCESS_STATE_CACHED_EMPTY = 16;

    優(yōu)先級的更新

    前文已經(jīng)提到,系統(tǒng)會對處于不同狀態(tài)的進(jìn)程設(shè)置不同的優(yōu)先級。但實際上,進(jìn)程的狀態(tài)是一直在變化中的。例如:用戶可以隨時會啟動一個新的Activity,或者將一個前臺的Activity切換到后臺。在這個時候,發(fā)生狀態(tài)變化的Activity的所在進(jìn)程的優(yōu)先級就需要進(jìn)行更新。

    并且,Activity可能會使用其他的Service或者ContentProvider。當(dāng)Activity的進(jìn)程優(yōu)先級發(fā)生變化的時候,它所使用的Service或者ContentProvider的優(yōu)先級也應(yīng)當(dāng)發(fā)生變化。

    ActivityManagerService中有如下兩個方法用來更新進(jìn)程的優(yōu)先級:

    • final boolean updateOomAdjLocked(ProcessRecord app)
    • final void updateOomAdjLocked()

    第一個方法是針對指定的單個進(jìn)程更新優(yōu)先級。第二個是對所有進(jìn)程更新優(yōu)先級。

    在下面的這些情況下,需要對指定的應(yīng)用進(jìn)程更新優(yōu)先級:

    • 當(dāng)有一個新的進(jìn)程開始使用本進(jìn)程中的ContentProvider
    • 當(dāng)本進(jìn)程中的一個Service被其他進(jìn)程bind或者unbind
    • 當(dāng)本進(jìn)程中的Service的執(zhí)行完成或者退出了
    • 當(dāng)本進(jìn)程中一個BroadcastReceiver正在接受廣播
    • 當(dāng)本進(jìn)程中的BackUpAgent啟動或者退出了

    final boolean updateOomAdjLocked(ProcessRecord app)?被調(diào)用的關(guān)系如下圖所示:

    在有些情況下,系統(tǒng)需要對所有應(yīng)用進(jìn)程的優(yōu)先級進(jìn)行更新,譬如:

    • 當(dāng)有一個新的進(jìn)程啟動時
    • 當(dāng)有一個進(jìn)程退出時
    • 當(dāng)系統(tǒng)在清理后臺進(jìn)程時
    • 當(dāng)有一個進(jìn)程被標(biāo)記為前臺進(jìn)程時
    • 當(dāng)有一個進(jìn)程進(jìn)入或者退出cached狀態(tài)時
    • 當(dāng)系統(tǒng)鎖屏或者解鎖時
    • 當(dāng)有一個Activity啟動或者退出時
    • 當(dāng)系統(tǒng)正在處理一個廣播事件時
    • 當(dāng)前臺Activity發(fā)生改變時
    • 當(dāng)有一個Service啟動時

    final void updateOomAdjLocked()?被調(diào)用的關(guān)系圖如下所示:?

    優(yōu)先級的算法

    ActivityManagerService中的computeOomAdjLocked方法負(fù)責(zé)計算進(jìn)程的優(yōu)先級,這個方法總計約700行,執(zhí)行流程主要包含如下10個步驟:

    下面我們來詳細(xì)看其中的每一個步驟:

    • 1.確認(rèn)該進(jìn)程是否是空進(jìn)程

      空進(jìn)程中沒有任何組件,因此主線程也為null(ProcessRecord.thread描述了應(yīng)用進(jìn)程的主線程)。

      如果是空進(jìn)程,則不需要再做后面的計算了。直接設(shè)置為ProcessList.CACHED_APP_MAX_ADJ級別即可。

    if (app.thread == null) {app.adjSeq = mAdjSeq;app.curSchedGroup = ProcessList.SCHED_GROUP_BACKGROUND;app.curProcState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;return (app.curAdj=app.curRawAdj=ProcessList.CACHED_APP_MAX_ADJ); }
    • 2.確認(rèn)是否設(shè)置了maxAdj

      上文已經(jīng)提到過,系統(tǒng)進(jìn)程或者Persistent進(jìn)程會通過設(shè)置maxAdj來保持其較高的優(yōu)先級,對于這類進(jìn)程不用按照普通進(jìn)程的算法進(jìn)行計算,直接按照maxAdj的值設(shè)置即可。

    if (app.maxAdj <= ProcessList.FOREGROUND_APP_ADJ) {app.adjType = "fixed";app.adjSeq = mAdjSeq;app.curRawAdj = app.maxAdj;app.foregroundActivities = false;app.curSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT;app.systemNoUi = true;if (app == TOP_APP) {app.systemNoUi = false;app.curSchedGroup = ProcessList.SCHED_GROUP_TOP_APP;app.adjType = "pers-top-activity";} else if (activitiesSize > 0) {for (int j = 0; j < activitiesSize; j++) {final ActivityRecord r = app.activities.get(j);if (r.visible) {app.systemNoUi = false;}}}if (!app.systemNoUi) {app.curProcState = ActivityManager.PROCESS_STATE_PERSISTENT_UI;}return (app.curAdj=app.maxAdj);}
    • 3.確認(rèn)進(jìn)程中是否有前臺優(yōu)先級的組件

      前臺優(yōu)先級的組件是指:

      a.前臺的Activity; b.正在接受廣播的Receiver; c.正在執(zhí)行任務(wù)的Service;

      注:除此之外,還有Instrumentation被認(rèn)為是具有較高優(yōu)先級的。Instrumentation應(yīng)用是輔助測試用的,正常運(yùn)行的系統(tǒng)中不用考慮這種應(yīng)用。

      假設(shè)進(jìn)程中包含了以上提到的前臺優(yōu)先級的任何一個組件,則直接設(shè)置進(jìn)程優(yōu)先級為FOREGROUND_APP_ADJ即可。因為這已經(jīng)是應(yīng)用程序能夠獲取的最高優(yōu)先級了。

    int adj;int schedGroup;int procState;boolean foregroundActivities = false;BroadcastQueue queue;if (app == TOP_APP) {adj = ProcessList.FOREGROUND_APP_ADJ;schedGroup = ProcessList.SCHED_GROUP_TOP_APP;app.adjType = "top-activity";foregroundActivities = true;procState = PROCESS_STATE_CUR_TOP;} else if (app.instrumentationClass != null) {adj = ProcessList.FOREGROUND_APP_ADJ;schedGroup = ProcessList.SCHED_GROUP_DEFAULT;app.adjType = "instrumentation";procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;} else if ((queue = isReceivingBroadcast(app)) != null) {adj = ProcessList.FOREGROUND_APP_ADJ;schedGroup = (queue == mFgBroadcastQueue)? ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;app.adjType = "broadcast";procState = ActivityManager.PROCESS_STATE_RECEIVER;} else if (app.executingServices.size() > 0) {adj = ProcessList.FOREGROUND_APP_ADJ;schedGroup = app.execServicesFg ?ProcessList.SCHED_GROUP_DEFAULT : ProcessList.SCHED_GROUP_BACKGROUND;app.adjType = "exec-service";procState = ActivityManager.PROCESS_STATE_SERVICE;} else {schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;adj = cachedAdj;procState = ActivityManager.PROCESS_STATE_CACHED_EMPTY;app.cached = true;app.empty = true;app.adjType = "cch-empty";}
    • 4.確認(rèn)進(jìn)程中是否有較高優(yōu)先級的Activity

      這里需要遍歷進(jìn)程中的所有Activity,找出其中優(yōu)先級最高的設(shè)置為進(jìn)程的優(yōu)先級。

      即便Activity不是前臺Activity,但是處于下面這些狀態(tài)的Activity優(yōu)先級也是被認(rèn)為是較高優(yōu)先級的:

    • 該Activity處于可見狀態(tài)
    • 該Activity處于Pause正在Pause狀態(tài)
    • 該Activity正在stop
    if (!foregroundActivities && activitiesSize > 0) {int minLayer = ProcessList.VISIBLE_APP_LAYER_MAX;for (int j = 0; j < activitiesSize; j++) {final ActivityRecord r = app.activities.get(j);if (r.app != app) {Log.e(TAG, "Found activity " + r + " in proc activity list using " + r.app+ " instead of expected " + app);if (r.app == null || (r.app.uid == app.uid)) {// Only fix things up when they look saner.app = app;} else {continue;}}if (r.visible) {// App has a visible activity; only upgrade adjustment.if (adj > ProcessList.VISIBLE_APP_ADJ) {adj = ProcessList.VISIBLE_APP_ADJ;app.adjType = "visible";}if (procState > PROCESS_STATE_CUR_TOP) {procState = PROCESS_STATE_CUR_TOP;}schedGroup = ProcessList.SCHED_GROUP_DEFAULT;app.cached = false;app.empty = false;foregroundActivities = true;if (r.task != null && minLayer > 0) {final int layer = r.task.mLayerRank;if (layer >= 0 && minLayer > layer) {minLayer = layer;}}break;} else if (r.state == ActivityState.PAUSING || r.state == ActivityState.PAUSED) {if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {adj = ProcessList.PERCEPTIBLE_APP_ADJ;app.adjType = "pausing";}if (procState > PROCESS_STATE_CUR_TOP) {procState = PROCESS_STATE_CUR_TOP;}schedGroup = ProcessList.SCHED_GROUP_DEFAULT;app.cached = false;app.empty = false;foregroundActivities = true;} else if (r.state == ActivityState.STOPPING) {if (adj > ProcessList.PERCEPTIBLE_APP_ADJ) {adj = ProcessList.PERCEPTIBLE_APP_ADJ;app.adjType = "stopping";}if (!r.finishing) {if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;}}app.cached = false;app.empty = false;foregroundActivities = true;} else {if (procState > ActivityManager.PROCESS_STATE_CACHED_ACTIVITY) {procState = ActivityManager.PROCESS_STATE_CACHED_ACTIVITY;app.adjType = "cch-act";}}}if (adj == ProcessList.VISIBLE_APP_ADJ) {adj += minLayer;} }
    • 5.確認(rèn)進(jìn)程中是否有前臺Service

      通過startForeground啟動的Service被認(rèn)為是前臺Service。給予這類進(jìn)程PERCEPTIBLE_APP_ADJ級別的優(yōu)先級。

    if (adj > ProcessList.PERCEPTIBLE_APP_ADJ|| procState > ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE) {if (app.foregroundServices) {// The user is aware of this app, so make it visible.adj = ProcessList.PERCEPTIBLE_APP_ADJ;procState = ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE;app.cached = false;app.adjType = "fg-service";schedGroup = ProcessList.SCHED_GROUP_DEFAULT;} else if (app.forcingToForeground != null) {// The user is aware of this app, so make it visible.adj = ProcessList.PERCEPTIBLE_APP_ADJ;procState = ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND;app.cached = false;app.adjType = "force-fg";app.adjSource = app.forcingToForeground;schedGroup = ProcessList.SCHED_GROUP_DEFAULT;} }
    • 6.確認(rèn)是否是特殊類型進(jìn)程

      特殊類型的進(jìn)程包括:重量級進(jìn)程,桌面進(jìn)程,前一個應(yīng)用進(jìn)程,正在執(zhí)行備份的進(jìn)程。 “重量級進(jìn)程”和“前一個應(yīng)用”進(jìn)程在上文中已經(jīng)說過了。而桌面就是指Android上的Launcher。

    if (app == mHeavyWeightProcess) {if (adj > ProcessList.HEAVY_WEIGHT_APP_ADJ) {adj = ProcessList.HEAVY_WEIGHT_APP_ADJ;schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;app.cached = false;app.adjType = "heavy";}if (procState > ActivityManager.PROCESS_STATE_HEAVY_WEIGHT) {procState = ActivityManager.PROCESS_STATE_HEAVY_WEIGHT;} }if (app == mHomeProcess) {if (adj > ProcessList.HOME_APP_ADJ) {adj = ProcessList.HOME_APP_ADJ;schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;app.cached = false;app.adjType = "home";}if (procState > ActivityManager.PROCESS_STATE_HOME) {procState = ActivityManager.PROCESS_STATE_HOME;} }if (app == mPreviousProcess && app.activities.size() > 0) {if (adj > ProcessList.PREVIOUS_APP_ADJ) {adj = ProcessList.PREVIOUS_APP_ADJ;schedGroup = ProcessList.SCHED_GROUP_BACKGROUND;app.cached = false;app.adjType = "previous";}if (procState > ActivityManager.PROCESS_STATE_LAST_ACTIVITY) {procState = ActivityManager.PROCESS_STATE_LAST_ACTIVITY;} }if (false) Slog.i(TAG, "OOM " + app + ": initial adj=" + adj+ " reason=" + app.adjType);app.adjSeq = mAdjSeq; app.curRawAdj = adj; app.hasStartedServices = false;if (mBackupTarget != null && app == mBackupTarget.app) {if (adj > ProcessList.BACKUP_APP_ADJ) {if (DEBUG_BACKUP) Slog.v(TAG_BACKUP, "oom BACKUP_APP_ADJ for " + app);adj = ProcessList.BACKUP_APP_ADJ;if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND) {procState = ActivityManager.PROCESS_STATE_IMPORTANT_BACKGROUND;}app.adjType = "backup";app.cached = false;}if (procState > ActivityManager.PROCESS_STATE_BACKUP) {procState = ActivityManager.PROCESS_STATE_BACKUP;} }
    • 7.根據(jù)所有Service的客戶端計算優(yōu)先級

      這里需要遍歷所有的Service,并且還需要遍歷每一個Service的所有連接。然后根據(jù)連接的關(guān)系確認(rèn)客戶端進(jìn)程的優(yōu)先級來確定當(dāng)前進(jìn)程的優(yōu)先級。

      ConnectionRecord.binding.client即為客戶端進(jìn)程ProcessRecord,由此便可以知道客戶端進(jìn)程的優(yōu)先級。

    for (int is = app.services.size()-1;is >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND|| procState > ActivityManager.PROCESS_STATE_TOP);is--) {ServiceRecord s = app.services.valueAt(is);if (s.startRequested) {app.hasStartedServices = true;if (procState > ActivityManager.PROCESS_STATE_SERVICE) {procState = ActivityManager.PROCESS_STATE_SERVICE;}if (app.hasShownUi && app != mHomeProcess) {if (adj > ProcessList.SERVICE_ADJ) {app.adjType = "cch-started-ui-services";}} else {if (now < (s.lastActivity + ActiveServices.MAX_SERVICE_INACTIVITY)) {if (adj > ProcessList.SERVICE_ADJ) {adj = ProcessList.SERVICE_ADJ;app.adjType = "started-services";app.cached = false;}}if (adj > ProcessList.SERVICE_ADJ) {app.adjType = "cch-started-services";}}}for (int conni = s.connections.size()-1;conni >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND|| procState > ActivityManager.PROCESS_STATE_TOP);conni--) {ArrayList<ConnectionRecord> clist = s.connections.valueAt(conni);for (int i = 0;i < clist.size() && (adj > ProcessList.FOREGROUND_APP_ADJ|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND|| procState > ActivityManager.PROCESS_STATE_TOP);
    • 8.根據(jù)所有Provider的客戶端確認(rèn)優(yōu)先級

      這里與Service類似,需要遍歷所有的Provider,以及每一個Provider的所有連接。然后根據(jù)連接的關(guān)系確認(rèn)客戶端進(jìn)程的優(yōu)先級來確定當(dāng)前進(jìn)程的優(yōu)先級。

      類似的,ContentProviderConnection.client為客戶端進(jìn)程的ProcessRecord。

    for (int provi = app.pubProviders.size()-1;provi >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND|| procState > ActivityManager.PROCESS_STATE_TOP);provi--) {ContentProviderRecord cpr = app.pubProviders.valueAt(provi);for (int i = cpr.connections.size()-1;i >= 0 && (adj > ProcessList.FOREGROUND_APP_ADJ|| schedGroup == ProcessList.SCHED_GROUP_BACKGROUND|| procState > ActivityManager.PROCESS_STATE_TOP);i--) {ContentProviderConnection conn = cpr.connections.get(i);ProcessRecord client = conn.client;if (client == app) {// Being our own client is not interesting.continue;}int clientAdj = computeOomAdjLocked(client, cachedAdj, TOP_APP, doingAll, now);...
    • 9.收尾工作 收尾工作主要是根據(jù)進(jìn)程中的Service,Provider的一些特殊狀態(tài)做一些處理,另外還有針對空進(jìn)程以及設(shè)置了maxAdj的進(jìn)程做一些處理,這里就不貼出代碼了。

    這里想專門說明一下的是,在這一步還會對Service進(jìn)程做ServiceB的區(qū)分。系統(tǒng)將Service進(jìn)程分為ServiceA和ServiceB。ServiceA是相對來說較新的Service,而ServiceB相對來說是比較“老舊”的,對用戶來說可能是不那么感興趣的,因此ServiceB的優(yōu)先級會相對低一些。

    static final int SERVICE_B_ADJ = 800; static final int SERVICE_ADJ = 500;

    而ServiceB的標(biāo)準(zhǔn)是:app.serviceb = mNewNumAServiceProcs > (mNumServiceProcs/3);?即:所有Service進(jìn)程的前1/3為ServiceA,剩下為ServiceB。

    if (adj == ProcessList.SERVICE_ADJ) {if (doingAll) {app.serviceb = mNewNumAServiceProcs > (mNumServiceProcs/3);mNewNumServiceProcs++;if (!app.serviceb) {if (mLastMemoryLevel > ProcessStats.ADJ_MEM_FACTOR_NORMAL&& app.lastPss >= mProcessList.getCachedRestoreThresholdKb()) {app.serviceHighRam = true;app.serviceb = true;} else {mNewNumAServiceProcs++;}} else {app.serviceHighRam = false;}}if (app.serviceb) {adj = ProcessList.SERVICE_B_ADJ;} }app.curRawAdj = adj;
    • 10.保存結(jié)果 最終需要把本次的計算結(jié)果保存到ProcessRecord中:
    app.curAdj = app.modifyRawOomAdj(adj); app.curSchedGroup = schedGroup; app.curProcState = procState; app.foregroundActivities = foregroundActivities;

    優(yōu)先級的生效

    優(yōu)先級的生效是指:將計算出來的優(yōu)先級真正應(yīng)用到系統(tǒng)中,applyOomAdjLocked?方法負(fù)責(zé)了此項工作。

    前文中我們提到,優(yōu)先級意味著三個方面,這里的生效就對應(yīng)了這三個方面:

  • ProcessList.setOomAdj(app.pid, app.info.uid, app.curAdj);?將計算出來的adj值寫入到procfs中,即:/proc/[pid]/oom_score_adj?這個文件中。

  • Process.setProcessGroup(app.pid, processGroup);?用來設(shè)置進(jìn)程的調(diào)度組。

  • app.thread.setProcessState(app.repProcState);?這個方法會最終調(diào)用到?VMRuntime.getRuntime().updateProcessState();將進(jìn)程的狀態(tài)設(shè)置到虛擬機(jī)中。

  • 結(jié)束語

    前言中我們提到,“優(yōu)先級反應(yīng)了系統(tǒng)對于進(jìn)程重要性的判定。”

    那么,系統(tǒng)如何評價進(jìn)程的優(yōu)先級,便是系統(tǒng)本身一個很重要的特性。了解系統(tǒng)的這一特性對于我們開發(fā)應(yīng)用程序,以及對于應(yīng)用程序運(yùn)行的行為分析是很有意義的。

    系統(tǒng)在判定優(yōu)先級的時候,應(yīng)當(dāng)做到公平公正,并且不能讓開發(fā)者有機(jī)可乘。

    “公平公正”是指系統(tǒng)需要站在一個中間人的狀態(tài)下,不偏倚任何一個應(yīng)用,公正的將系統(tǒng)資源分配給真正需要的進(jìn)程。并且在系統(tǒng)資源緊張的時候,回收不重要的進(jìn)程。

    通過上文的分析,我們看到,Android系統(tǒng)認(rèn)為“重要”的進(jìn)程主要有三類:

  • 系統(tǒng)進(jìn)程
  • 前臺與用戶交互的進(jìn)程
  • 前臺進(jìn)程所使用到的進(jìn)程
  • 不過對于這一點是有改進(jìn)的空間的,例如,可以引入用戶習(xí)慣的分析:如果是用戶頻繁使用的應(yīng)用,可以給予這些應(yīng)用更高的優(yōu)先級以提升這些應(yīng)用的響應(yīng)速度。目前,國內(nèi)一些Android定制廠商已經(jīng)開始做這類功能的支持。

    “不能讓開發(fā)者有機(jī)可乘”是指:系統(tǒng)對于進(jìn)程優(yōu)先級的判定的因素應(yīng)當(dāng)是不能被開發(fā)者利用的。因為一旦開發(fā)者可以利用,每個開發(fā)者都肯定會將自己的設(shè)置為高優(yōu)先級,來搶占更多的資源。

    需要說明的是,Android在這個方面是存在缺陷的:在Android系統(tǒng)上,可以通過startForeground拿到前臺的優(yōu)先級的。后來Google也意識到這個問題,于是在API Level 18以上的版本上,調(diào)用startForeground這個API會在通知欄顯示一條通知以告知用戶。但是,這個改進(jìn)是有Bug的:開發(fā)者可以同時通過startForeground啟動兩個Service,指定同樣的通知id,然后退出其中一個,這樣應(yīng)用的不會在通知欄顯示通知圖標(biāo),并且拿到了前臺的優(yōu)先級。這個便是讓開發(fā)者“有機(jī)可乘”了。

    由于筆者認(rèn)為這不是一個很好的行為,具體的做法不細(xì)說了,有興趣自己去網(wǎng)上搜索。

    本文,我們詳細(xì)講解的Android中進(jìn)程優(yōu)先級的計算方法,在下一篇文章中,我們會專門講解與進(jìn)程回收相關(guān)的內(nèi)容,敬請期待。

    參考資料與推薦讀物

    Embedded Android: Porting, Extending, and Customizing

    The proc filesystem

    sched_setscheduler


    原文: http://qiangbo.space/2016-11-23/AndroidAnatomy_Process_OomAdj/

    總結(jié)

    以上是生活随笔為你收集整理的Android系统中的进程管理:进程的优先级的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    国产精品亚洲a | 中文字幕免费一区 | 国产高清不卡在线 | 激情久久久久久久久久久久久久久久 | 精品理论片 | 在线观看91视频 | 亚洲欧美视频在线观看 | 日韩电影在线观看一区二区三区 | 在线观看成人 | 99视频在线免费播放 | 国产精品入口传媒 | 夜色在线资源 | 久久最新网址 | 在线视频观看国产 | 东方av在| 免费av视屏 | 国产一区二区在线看 | 玖玖玖在线观看 | 欧美一级性生活视频 | 色狠狠久久av五月综合 | www..com黄色片 | 久久久www成人免费精品 | 久久这里只有精品9 | 免费网址在线播放 | 97视频免费 | 一区二区三区高清不卡 | 日韩视频精品在线 | 亚洲专区在线 | 亚洲成人免费在线观看 | 在线高清| 性色大片在线观看 | 一区二区三区在线观看免费 | 国产精品久久久久久久久久直播 | 国产精品久久久久久麻豆一区 | 99精品视频在线观看免费 | 91手机电视 | 69av视频在线观看 | 高清久久久久久 | 91在线www| 69精品 | 在线播放av网址 | 久久久福利视频 | 欧美小视频在线观看 | 三级黄色免费片 | 国产欧美最新羞羞视频在线观看 | 中文资源在线官网 | 在线 成人 | 色狠狠综合 | 日韩欧美一区二区三区视频 | 夜夜夜精品 | 国产精品 国内视频 | 久久激五月天综合精品 | 久久在线观看视频 | 又黄又爽又无遮挡免费的网站 | 国产成人一区二区精品非洲 | 久久久久久国产一区二区三区 | 国产四虎在线 | 国产精品久久嫩一区二区免费 | 草免费视频| 国产日韩一区在线 | 免费在线观看一级片 | 丝袜美女在线 | 免费在线看v | 天天干天天干天天操 | 色综合网在线 | www日韩高清 | 99热精品免费观看 | 日韩精品综合在线 | 国产成人61精品免费看片 | 天堂av在线网址 | 夜夜操天天干, | 91在线公开视频 | 久久精品中文字幕一区二区三区 | 一本一本久久a久久精品综合妖精 | 成人一级电影在线观看 | www.久久免费 | 综合久久久 | 丁香六月婷婷开心婷婷网 | 国产美女在线观看 | 日韩二区三区在线观看 | 天天操夜夜操天天射 | 日韩欧美视频一区二区三区 | 婷婷综合久久 | 91网址在线观看 | 成年人免费在线播放 | 91中文在线视频 | 人人看黄色 | 久久躁日日躁aaaaxxxx | 在线观看免费黄视频 | 久久狠狠干 | 久久久久久久久久亚洲精品 | 手机看国产毛片 | 久久久久国产精品厨房 | 中文字幕在线视频一区 | 九九精品久久久 | 中文字幕黄色 | 精品乱码一区二区三四区 | 99久久精品国产系列 | 免费网址你懂的 | 免费一级片观看 | 国产精品中文字幕在线播放 | 国产精品久久久av | 精品国产一区二区三区免费 | 婷婷丁香狠狠爱 | 日韩av在线看 | 欧美激情精品久久 | 人人要人人澡人人爽人人dvd | 97品白浆高清久久久久久 | 日韩久久电影 | 三级av片 | 久久久久久久国产精品 | 最近中文字幕久久 | 欧美黄色特级片 | 日日草视频 | 日韩av片无码一区二区不卡电影 | 99久久精品午夜一区二区小说 | 国产亚洲va综合人人澡精品 | 精品久久久久久久久久久久久 | 日韩精品久久一区二区三区 | 国产91精品久久久久 | 手机av在线不卡 | 中日韩三级视频 | 啪嗒啪嗒免费观看完整版 | 日韩美女黄色片 | 99视频精品免费视频 | 午夜性盈盈 | 97av免费视频| 天天操综合 | 免费日p视频 | 久久精品日本啪啪涩涩 | 国产特级毛片aaaaaaa高清 | 玖玖视频免费在线 | av福利网址导航 | 国内揄拍国内精品 | 天天摸日日摸人人看 | 2017狠狠干 | 国产99久久久精品视频 | 手机看片 | 91av久久| 麻豆精品在线 | 亚洲国产成人精品在线观看 | av电影一区 | 亚洲一区二区三区四区在线视频 | av色网站| 亚洲欧美怡红院 | 91香蕉亚洲精品 | 国产一区二区成人 | 国产黄色成人 | 久草在线免费看视频 | 日韩精品黄 | 久草在线视频资源 | 免费在线观看a v | 四虎在线视频免费观看 | 成人av久久 | 午夜精品视频一区二区三区在线看 | 欧美日韩性 | 久久久久亚洲精品中文字幕 | 日日天天 | 国产精在线 | 在线午夜av | 免费日韩电影 | 亚洲激情视频在线观看 | 亚洲成aⅴ人片久久青草影院 | 一级黄色网址 | 日本少妇久久久 | 久青草国产在线 | 最近字幕在线观看第一季 | 午夜男人影院 | 97国产超碰 | 免费在线色 | 久久网站免费 | 久久国产精品视频免费看 | 中文字幕一区二区三区久久蜜桃 | 亚洲电影av在线 | www.人人干 | 99热精品在线| 97视频在线观看免费 | 久久精品一区 | 在线视频 区 | 在线观看第一页 | 久久成年人| 国产亚洲欧美在线视频 | 99色免费| 人人爽人人爽人人爽学生一级 | 国产人免费人成免费视频 | 国产精品久久久久久久久久久久久久 | 国内精品免费久久影院 | 亚洲精品视频在线观看视频 | 日本三级在线观看中文字 | 操天天操| 精品国产一区二区三区久久久蜜臀 | 黄网站app在线观看免费视频 | 超碰在线成人 | 久久久黄色av| 国产一二三在线视频 | 国产在线观看午夜 | www.亚洲精品在线 | 色偷偷88888欧美精品久久 | 亚洲3级 | 国产精品久久久久久五月尺 | 久久久久久激情 | 成人在线播放视频 | 91久久久久久久一区二区 | 国产精品九九九九九 | 久久国产精品偷 | 91网站免费观看 | 特级西西人体444是什么意思 | 日本精品一区二区三区在线观看 | 国产精品久久久久永久免费观看 | 国产精品日韩在线播放 | 亚洲精品动漫成人3d无尽在线 | 超碰个人在线 | av在线播放网址 | 精品在线播放 | 日本久久不卡视频 | 婷婷婷国产在线视频 | 亚洲美女在线一区 | av色综合网 | 国产玖玖在线 | 日韩免费高清 | 天天干天天摸 | 在线观看91精品国产网站 | 天天爽夜夜爽人人爽曰av | 亚州免费视频 | 99精品国产一区二区三区不卡 | 中文字幕国产精品一区二区 | 天天色天天艹 | 天天操天天干天天爱 | 色操插| 国产精品网址在线观看 | 日韩av看片 | 精品成人在线 | 日本久久中文 | 久久久久综合视频 | 黄色片网站av | 国产精品婷婷午夜在线观看 | 久久激情视频 久久 | 91精品看片| 日韩视频中文字幕在线观看 | 精品国产免费观看 | 国产精品一区二区视频 | 西西444www大胆无视频 | 亚洲激情在线观看 | 成人一级影视 | 久久国产精品网站 | 色婷婷99 | 日本精品一区二区 | www.色五月.com | 九九欧美视频 | 久久精品欧美日韩精品 | 国产精品久久久久高潮 | 毛片美女网站 | 色偷偷88888欧美精品久久久 | 亚洲黄色小说网 | 久久久国产精品一区二区三区 | 亚洲 欧洲 国产 日本 综合 | 日韩网站免费观看 | 亚洲v欧美v国产v在线观看 | 久草在线资源观看 | 日韩首页 | 1区2区视频| 狠狠狠狠狠狠狠干 | 久久久午夜精品理论片中文字幕 | 九九久久电影 | 成人四虎 | 欧美一级视频免费 | 97在线视频观看 | 丁香六月天 | 在线观看国产麻豆 | 91成人免费看 | 九九热只有这里有精品 | 日本成人a| 日韩久久在线 | 日韩欧美精品在线 | 亚洲午夜精品一区二区三区电影院 | 免费看黄20分钟 | 久久国产精品二国产精品中国洋人 | 欧美精品黑人性xxxx | 美女黄网久久 | 色网站在线免费观看 | 五月天亚洲精品 | 香蕉在线视频播放网站 | 中文字幕在线播放一区 | 国产小视频在线播放 | 激情久久五月天 | 久青草视频在线观看 | www.五月天 | 五月天电影免费在线观看一区 | 玖玖精品在线 | 欧美伦理电影一区二区 | 97超碰中文字幕 | 中文字幕 91 | 亚洲人在线视频 | 中文字幕av最新 | 九九精品久久久 | 欧美精彩视频在线观看 | 亚洲资源一区 | 亚洲综合小说电影qvod | 四虎精品成人免费网站 | 久久精品一区二区三区四区 | 亚洲春色成人 | 九七视频在线 | 日韩视频一二三区 | 国产精品久久久久免费观看 | 99国产视频在线 | 国产日产精品一区二区三区四区 | 天天爱天天插 | 99视频在线精品 | 一级电影免费在线观看 | 久久亚洲精品电影 | 久久久久久久看片 | 97人人爽 | 亚洲精选视频在线 | 看v片| 国产一级黄色免费看 | 亚洲精品在线一区二区三区 | 国产三级视频 | 午夜精品久久久久久久爽 | 黄网av在线| 日韩国产精品久久久久久亚洲 | 亚洲精品在线观看免费 | 人成在线免费视频 | 99久久精品午夜一区二区小说 | 久久99精品国产一区二区三区 | 天天五月天色 | 婷婷网站天天婷婷网站 | 欧美天天综合网 | 成人免费观看视频大全 | 91av资源网| 久久国产美女 | 国产高清av免费在线观看 | 97av在线视频 | 亚洲一区二区精品3399 | 日韩电影在线观看一区 | 久久久久亚洲精品中文字幕 | 一区二区高清在线 | 久久夜色精品国产欧美乱极品 | 久久 国产一区 | 91视频免费 | 亚洲视频 在线观看 | 黄色一级大片免费看 | 99成人精品 | 911久久香蕉国产线看观看 | 7777xxxx| 国产日产高清dvd碟片 | 久久毛片网站 | 亚洲高清网站 | 国产精品自拍av | 欧美成人精品在线 | 夜添久久精品亚洲国产精品 | 久久久久成人免费 | 婷婷色在线资源 | 国产美腿白丝袜足在线av | 在线免费观看视频a | 狠狠躁夜夜av | 国产一区在线免费 | 国产精品国产三级国产不产一地 | 性色av一区二区三区在线观看 | 国产欧美综合视频 | 日韩av快播电影网 | 麻豆 videos | 免费看三级黄色片 | 一区电影 | 欧美无极色 | 亚洲午夜激情网 | 色播五月激情综合网 | 精品99久久 | 欧美二区在线播放 | 欧美久久久一区二区三区 | 久99久中文字幕在线 | 日韩大陆欧美高清视频区 | 网站免费黄色 | 久久国产精品99久久久久 | 三上悠亚在线免费 | 五月天婷婷视频 | 91久久久久久久 | 欧美精品免费在线观看 | 欧美精品在线观看一区 | 五月婷婷在线视频观看 | 一本一本久久a久久精品牛牛影视 | 欧美日韩精品在线免费观看 | ww视频在线观看 | 国产婷婷精品av在线 | 成人影视免费看 | 国产一区二区视频在线 | 久久久久久久免费看 | 丁香高清视频在线看看 | 欧美不卡视频在线 | 成人黄色大片在线观看 | 国产在线观看一 | 亚洲精品国产精品久久99 | 激情黄色av | 一区二区av| 欧美性做爰猛烈叫床潮 | 九色自拍视频 | 国产在线一区观看 | 伊人av综合 | 91人人在线 | 日韩在线观看网站 | 国产精品高潮呻吟久久av无 | 国产在线综合视频 | 午夜久久 | 成年人在线看片 | 亚洲性xxxx | 国产福利在线免费 | 国产精品久久久999 国产91九色视频 | 九九九在线观看 | 五月婷婷播播 | 亚洲一区免费在线 | 91综合视频在线观看 | 精选久久 | 美女在线免费观看视频 | 在线免费观看视频你懂的 | 黄污视频大全 | 久久久久久久久久久免费视频 | 欧美精品中文在线免费观看 | 天堂网av在线 | 高清视频一区 | 亚洲成人家庭影院 | 久久综合影视 | 99久久精品国产一区二区三区 | 精品少妇一区二区三区在线 | 午夜精品福利一区二区三区蜜桃 | 成年免费在线视频 | 超碰在线94| 午夜a区 | 亚洲人成在线电影 | 91在线小视频 | 国产精品久久久久av福利动漫 | 久久久久久久久久网站 | 国产福利资源 | 国产黄色大全 | 91av电影 | 欧美a在线看 | 日韩高清激情 | 国产精品99免视看9 国产精品毛片一区视频 | 成年人看片网站 | 精品1区二区 | 亚洲欧美激情精品一区二区 | 西西444www | 99久久精品久久久久久清纯 | 91久久国产综合精品女同国语 | 麻豆视频在线免费观看 | 国产又粗又猛又爽 | 国产男男gay做爰 | 激情欧美一区二区三区免费看 | 黄色软件视频网站 | 黄色影院在线免费观看 | 成人资源网 | 99re久久精品国产 | 久久久久综合网 | 午夜精品剧场 | 国产精品99久久久久 | 免费精品 | 在线视频日韩精品 | 在线小视频你懂的 | 日韩精品一区二区在线视频 | 精品黄色在线观看 | 一区二区三区在线观看中文字幕 | 亚洲五月激情 | 国产成人精品一区二区三区福利 | www黄色av| 成年人国产精品 | 一区二区三区免费 | 69精品 | 日日干影院 | 中文字幕视频网 | 欧美中文字幕第一页 | 久久免费在线观看 | 色狠狠狠| 91片黄在线观看 | 久久精品综合 | 天堂av在线| 91九色在线视频 | 国产在线不卡精品 | 在线观看国产一区二区 | 蜜臀一区二区三区精品免费视频 | 日本性久久 | 成人免费在线播放视频 | 人人添人人澡人人澡人人人爽 | 久久久免费 | 在线黄色av | 四虎影视4hu4虎成人 | 亚洲视频精品 | 二区三区在线 | 国产成人三级一区二区在线观看一 | 中文字幕之中文字幕 | 国产精品一二三 | 欧美日韩一区二区免费在线观看 | 正在播放国产一区二区 | 亚洲免费专区 | 欧美日韩高清在线一区 | 精品欧美一区二区精品久久 | 久久久久久伊人 | 麻豆免费视频观看 | 国产精品免费一区二区三区 | 亚洲a成人v | 国产视| 久久国产剧场电影 | 久久精品视频18 | 亚洲欧美日韩精品一区二区 | 国产成人久久久77777 | 99热99 | 天天色天天射天天综合网 | 五月婷亚洲| 久久五月婷婷丁香 | 欧美一区二区三区在线视频观看 | 亚洲精品在线观看视频 | 国产视频在线播放 | 69视频网站| 日韩夜夜爽 | 国产玖玖精品视频 | 久久大视频 | www.午夜视频 | 国产区在线视频 | 精品在线免费观看 | 三级av片 | 中文字幕激情 | 久久久久久久久影视 | 一区av在线播放 | 黄色1级大片| 在线观看中文字幕第一页 | av福利超碰网站 | 91av精品| 91av视频在线免费观看 | 免费网址在线播放 | 91高清在线| 一个色综合网站 | 视频三区在线 | 日韩精品一区二区三区第95 | 在线观看亚洲专区 | 久久官网 | av一区二区三区在线观看 | 99色国产| 成人免费看片网址 | 国产成人福利在线观看 | 欧洲亚洲精品 | 高清日韩一区二区 | 99久久婷婷| 欧美a免费 | 久久不色 | 成人啊 v| 亚洲影视九九影院在线观看 | 亚洲精品影院在线观看 | av片一区二区 | 亚洲欧美色婷婷 | 热re99久久精品国产99热 | 81精品国产乱码久久久久久 | 中文字幕日韩精品有码视频 | 片网站 | 色久综合 | 五月综合在线观看 | 97在线资源 | 又黄又爽又色无遮挡免费 | 成人免费亚洲 | 国产亚洲欧美精品久久久久久 | 久久经典国产 | 色欧美视频 | 久久影视中文字幕 | 日日日视频 | 玖玖视频网 | 日韩中文字幕免费在线观看 | 毛片久久久 | 综合久久久久久久 | 国产在线国产 | 国产美女精品视频免费观看 | 久久久久亚洲精品成人网小说 | 欧美资源| 91在线九色 | 伊人导航 | 免费黄色av电影 | 高清久久久久久 | 国产一级片免费播放 | 色婷婷伊人| 91av九色 | 伊人成人久久 | 色姑娘综合 | 国产91丝袜在线播放动漫 | 少妇bbw撒尿 | 欧美日韩一级久久久久久免费看 | 99中文字幕在线观看 | 怡春院av | 久久视频精品在线观看 | 在线观看免费色 | 日韩v欧美v日本v亚洲v国产v | 国产精品成人一区二区三区吃奶 | 色噜噜日韩精品欧美一区二区 | 精品一区二区在线免费观看 | 五月婷婷色 | 五月婷在线播放 | a天堂最新版中文在线地址 久久99久久精品国产 | 亚洲mv大片欧洲mv大片免费 | 国产小视频你懂的在线 | 久久综合欧美精品亚洲一区 | 日本最大色倩网站www | 国产码电影 | 日韩免费一二三区 | 国产一区二三区好的 | 中文字幕视频三区 | 国产手机在线播放 | 亚洲成aⅴ人在线观看 | 黄色亚洲大片免费在线观看 | 国产福利av在线 | 国产一区视频在线观看免费 | 亚洲黄色小说网址 | 在线看成人| 欧美日韩免费观看一区二区三区 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产精品入口久久 | 91丨九色丨国产在线观看 | 久久久午夜电影 | 欧美色图30p | 黄色成人av在线 | 国产精品免费不卡 | 亚洲欧美日韩精品久久奇米一区 | 中中文字幕av在线 | 国产一级做a爱片久久毛片a | 精品久久久久久电影 | 欧美日韩二三区 | 亚洲欧美综合 | 97国产一区 | 天天亚洲 | 五月天网页 | 一区在线观看 | 免费三级黄色片 | 久久久久久美女 | 国产一区久久 | av中文字幕第一页 | 激情五月伊人 | 中文字幕网站 | 狠狠激情中文字幕 | 一区 在线观看 | 91精品国产自产老师啪 | 国产精品久久久久久久久岛 | 中文字幕av一区二区三区四区 | 国产精品v a免费视频 | 欧美一区在线看 | 国产视频网站在线观看 | 成人在线视频在线观看 | 欧美性生爱 | 中文字幕人成乱码在线观看 | 亚洲欧美综合精品久久成人 | 最新成人在线 | 中文电影网 | 丁香综合五月 | 色吧av色av| 国产精品一区二区三区电影 | 99精品国自产在线 | 黄色大全在线观看 | 久久九九国产精品 | 久久成人精品电影 | 亚洲成人精品国产 | 狠狠久久 | 免费福利片2019潦草影视午夜 | 国产无套精品久久久久久 | 在线观看日本高清mv视频 | 人人爽人人爱 | 91视频这里只有精品 | 亚洲成av人电影 | 婷婷av网 | 天天操天天干天天综合网 | 成人国产精品久久久 | 九九视频网 | 欧美日韩在线精品 | 五月婷婷中文网 | 免费污片 | 精品久久久久一区二区国产 | 国产成人精品av | 国产精品黄色影片导航在线观看 | japanese黑人亚洲人4k | 在线观看网站你懂的 | 久久大视频 | 超碰97在线人人 | 最近免费中文字幕mv在线视频3 | 日韩电影中文字幕在线观看 | 欧洲性视频 | 狠狠干2018| 精品9999| 日韩免费一区二区三区 | 91精品999 | 欧美日韩国产欧美 | 久精品在线观看 | 午夜视频免费在线观看 | 国产91精品一区二区绿帽 | 精品久久久99 | 在线视频中文字幕一区 | 国产精品剧情在线亚洲 | 国产精品入口66mio女同 | 亚洲精品www久久久 www国产精品com | 一区精品在线 | 国产麻豆果冻传媒在线观看 | 五月婷婷在线视频观看 | 麻豆视传媒官网免费观看 | av不卡网站| 黄色av三级在线 | 在线精品视频免费观看 | 日韩乱色精品一区二区 | 成人在线视频一区 | 久免费视频 | 一区二区三区在线观看免费 | 丁香六月天 | 一区二区不卡视频在线观看 | 天天插天天爽 | 久久久激情网 | 国产黄色一级大片 | 中文字幕人成乱码在线观看 | 国产在线视频一区二区 | 97久久久免费福利网址 | 不卡视频在线看 | 成 人 黄 色 免费播放 | 中文字幕高清 | 日韩一区在线免费观看 | 国产日韩欧美视频在线观看 | 亚洲精品va | 美女免费视频一区二区 | 一个色综合网站 | 九色在线视频 | 亚洲精品视频免费看 | 丁香五月亚洲综合在线 | 久久香蕉一区 | 日本在线观看一区二区三区 | 日韩国产欧美在线播放 | 伊人久久国产 | 日本99精品 | 毛片精品免费在线观看 | 欧美日韩精品在线播放 | 天天干天天操天天搞 | 欧美日韩18 | 日韩黄色免费 | 天天爱av导航 | 久久久天堂| 国产r级在线观看 | 福利视频一区二区 | 日韩av免费在线看 | 婷婷中文字幕 | 99精品免费视频 | 大型av综合网站 | 最近日本mv字幕免费观看 | 久久综合色婷婷 | 精品在线亚洲视频 | 亚洲精品久久久久久久不卡四虎 | 97av视频在线观看 | 在线视频你懂 | 激情久久一区二区三区 | 99热这里只有精品在线观看 | 久久久精品99 | 色婷婷成人网 | 黄色电影在线免费观看 | 婷婷av资源 | 天天做日日做天天爽视频免费 | 亚洲视频在线播放 | 中文字幕在线观看播放 | 综合国产视频 | 国产精品99久久久精品免费观看 | 亚州精品天堂中文字幕 | 91精选在线| 91大神一区二区三区 | 六月久久婷婷 | 爱爱一区 | 国产精国产精品 | 91片黄在线观看动漫 | 激情视频免费在线观看 | 国产护士hd高朝护士1 | 四虎www.| 97精品久久| 蜜桃视频精品 | 免费看污网站 | 久久久久国产成人精品亚洲午夜 | 日日综合网 | 欧美一级性生活视频 | 天天综合操 | 综合网天天射 | 国产视频在线观看一区 | 中文字幕在线视频一区 | 97人人网 | 日韩a在线 | 在线免费观看麻豆视频 | 欧美激情h| 正在播放国产一区二区 | 人人添人人澡 | 久久婷婷久久 | 午夜久久精品 | 国产精品久久久久一区二区国产 | 日韩免费一区二区在线观看 | 国产精久久久久久久 | www.久久色| 91精品久久久久久久久久久久久 | 日韩美精品视频 | 久久的色 | 99久久成人 | 四虎影视国产精品免费久久 | 激情久久五月天 | 人人爽人人爱 | 日韩三级视频在线看 | 成片视频免费观看 | 麻豆视频国产在线观看 | 精品一区二区亚洲 | 色a综合| 色五月色开心色婷婷色丁香 | 日本天天操 | 视频国产一区二区三区 | 天天操·夜夜操 | 日韩免费高清在线观看 | av资源免费看 | a久久免费视频 | 国产在线不卡一区 | 最近中文字幕 | 亚洲精品456在线播放 | 久久免费播放 | 亚洲综合激情网 | 精品国产激情 | 黄色小说在线免费观看 | 在线观av | 亚洲少妇自拍 | 狠狠色狠狠色综合系列 | 久草久视频 | 国产高清日韩 | 久久久av电影 | 黄网在线免费观看 | 亚洲精品在线观看的 | 国产一区二区三区四区在线 | 在线观看国产日韩欧美 | 久草av在线播放 | 国产麻豆果冻传媒在线观看 | av中文字幕剧情 | 欧美一级乱黄 | 波多野结衣精品在线 | 国产黄色在线网站 | 五月婷婷播播 | 午夜婷婷在线观看 | 日韩在线免费视频观看 | 久久免费在线 | 91自拍91| 日韩欧美高清一区二区三区 | 在线观看的a站 | 免费亚洲精品 | 日日夜夜精品 | www.黄色片网站 | 欧美色888| 欧美精品久久天天躁 | 91黄色小视频| 免费亚洲成人 | 日韩精品一区二 | 蜜臀久久99精品久久久酒店新书 | 午夜精品一区二区三区在线观看 | 日韩欧美精品在线 | 日韩激情在线 | 天天av在线播放 | 人人超碰在线 | 国产精品久久久久一区二区 | 成人国产电影在线观看 | 天天操天天射天天添 | 久久精品网站视频 | 深夜免费福利在线 | 国产一级淫片免费看 | 欧美精品xxx | 亚洲天堂自拍视频 | 精品日本视频 | 91精品婷婷国产综合久久蝌蚪 | 国产二区视频在线 | 天天夜夜狠狠操 | 亚洲乱码中文字幕综合 | 日韩欧美视频一区二区 | 成人黄色视 | 日韩av资源在线观看 | 日批视频在线观看免费 | 在线看成人 | 西西www444 | 在线中文字幕av观看 | 国产在线精品二区 | 97精品久久人人爽人人爽 | 夜夜视频欧洲 | 国产成人久久久77777 | 久久久久麻豆v国产 | 色免费在线 | 999久久精品 | 亚洲成人999 | 九九久久免费 | 探花视频免费观看 | 中文字幕日本在线观看 | 国产伦精品一区二区三区… | 久久视频在线观看免费 | 在线导航av | 国产精品 中文字幕 亚洲 欧美 | 日韩综合精品 | 国产精品久久久久久吹潮天美传媒 | 国产精品麻豆视频 | 色婷婷国产精品 | 日日夜夜91 | av免费观看网址 | 天天激情在线 | 99福利片 | 91你懂的 | 在线视频欧美亚洲 | 欧美精彩视频 | 日日夜夜添| 日韩欧美视频在线 | 色综合久久中文综合久久牛 | 激情久久伊人 | 91福利在线导航 | 激情小说网站亚洲综合网 | 在线日本看片免费人成视久网 | 国产综合小视频 | 99久久精品免费 | 国产中文字幕第一页 | 99re国产视频 | 日韩av成人在线观看 | 国产91在线看 | 四虎影视成人永久免费观看视频 | 欧美性视频网站 | 97视频免费观看2区 亚洲视屏 | 日韩高清在线一区 | 日本老少交| 亚洲精品综合一区二区 | 天天玩天天干 | 99精品网站 | 欧美精品国产精品 | 波多野结衣在线视频免费观看 | 在线观看中文字幕一区 | 国产精品淫 | 在线观看黄a | 日韩网站视频 | 久久久久电影 | 日本视频高清 | 久久观看最新视频 | 日韩一区二区三区在线观看 | 国产精品网红福利 | 91天天操 | 国产成人精品一区二区 | av在线网站观看 | 91中文在线 | 久久av免费| 91av官网| 国产一区二区在线免费播放 | 久久久久久国产精品亚洲78 | 国产精品一区二区在线观看 | 国产黄色一级大片 | 日韩欧美一级二级 | 成人动漫视频在线 | 欧美性爽爽 | 国产成人精品一区二 | 黄色精品一区 | 一区二区三区日韩视频在线观看 | 中文字幕影片免费在线观看 | 人人射av| 久久99国产综合精品免费 | 国产精品3 | 成人在线免费观看网站 | 国产麻豆精品久久一二三 | 天天色天天干天天色 | 最新日韩视频在线观看 | 国产精品美女久久久久久2018 | 麻豆94tv免费版 | 久久国产片 | 成人黄色小视频 | 欧美精品做受xxx性少妇 | 高清av中文在线字幕观看1 | 欧美色久 | 国产精品麻豆果冻传媒在线播放 | 久久久国产精品人人片99精片欧美一 | 亚色视频在线观看 | av免费观看高清 | 成人午夜电影免费在线观看 | 99高清视频有精品视频 | 波多野结衣亚洲一区二区 | 爱爱av在线 | 在线精品视频免费观看 | 久久1区| 久久久久日本精品一区二区三区 | 亚洲免费av一区二区 | a视频在线看| 五月天综合网站 | 亚洲精品456在线播放第一页 | 免费看三级 | 五月天丁香视频 | 超碰97中文 | 波多野结衣理论片 | 午夜av片 | 国产中文字幕视频在线 | 天天干天天做 | 婷婷六月色 | 一区二区男女 | 97免费| 成年人在线免费视频观看 | 天堂网av在线 | 久av电影| 久草视频99 | 91久色蝌蚪 | 成年人黄色大片在线 | 爱色婷婷 | 国产精品一区二区 91 | 久久婷婷国产色一区二区三区 | 国产高清视频 | 超碰av在线 | 久久一区91| 欧美性生活免费 | 国产精品久久久久久久久久免费看 | 国产一区二区不卡在线 |