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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

Android

Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)

發(fā)布時(shí)間:2025/3/15 Android 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本篇是Android后臺(tái)殺死系列的第三篇,前面兩篇已經(jīng)對(duì)后臺(tái)殺死注意事項(xiàng),殺死恢復(fù)機(jī)制做了分析,本篇主要講解的是Android后臺(tái)殺死原理。相對(duì)于后臺(tái)殺死恢復(fù),LowMemoryKiller原理相對(duì)簡(jiǎn)單,并且在網(wǎng)上還是能找到不少資料的,不過(guò),由于Android不同版本在框架層的實(shí)現(xiàn)有一些不同,網(wǎng)上的分析也多是針對(duì)一個(gè)Android版本,本文簡(jiǎn)單做了以下區(qū)分對(duì)比。LowMemoryKiller(低內(nèi)存殺手)是Andorid基于oomKiller原理所擴(kuò)展的一個(gè)多層次oomKiller,OOMkiller(Out Of Memory Killer)是在Linux系統(tǒng)無(wú)法分配新內(nèi)存的時(shí)候,選擇性殺掉進(jìn)程,到oom的時(shí)候,系統(tǒng)可能已經(jīng)不太穩(wěn)定,而LowMemoryKiller是一種根據(jù)內(nèi)存閾值級(jí)別觸發(fā)的內(nèi)存回收的機(jī)制,在系統(tǒng)可用內(nèi)存較低時(shí),就會(huì)選擇性殺死進(jìn)程的策略,相對(duì)OOMKiller,更加靈活。在詳細(xì)分析其原理與運(yùn)行機(jī)制之前,不妨自己想一下,假設(shè)讓你設(shè)計(jì)一個(gè)LowMemoryKiller,你會(huì)如何做,這樣一個(gè)系統(tǒng)需要什么功能模塊呢?

  • 進(jìn)程優(yōu)先級(jí)定義:只有有了優(yōu)先級(jí),才能決定先殺誰(shuí),后殺誰(shuí)

  • 進(jìn)程優(yōu)先級(jí)的動(dòng)態(tài)管理:一個(gè)進(jìn)程的優(yōu)先級(jí)不應(yīng)該是固定不變的,需要根據(jù)其變動(dòng)而動(dòng)態(tài)變化,比如前臺(tái)進(jìn)程切換到后臺(tái)優(yōu)先級(jí)肯定要降低

  • 進(jìn)程殺死的時(shí)機(jī),什么時(shí)候需要挑一個(gè),或者挑多個(gè)進(jìn)程殺死

  • 如何殺死

以上幾個(gè)問(wèn)題便是一個(gè)MemoryKiller模塊需要的基本功能,Android底層采用的是Linux內(nèi)核,其進(jìn)程管理都是基于Linux內(nèi)核,LowMemoryKiller也相應(yīng)的放在內(nèi)核模塊,這也意味著用戶空間對(duì)于后臺(tái)殺死不可見(jiàn),就像AMS完全不知道一個(gè)APP是否被后臺(tái)殺死,只有在AMS喚醒APP的時(shí)候,才知道APP是否被LowMemoryKiller殺死過(guò)。其實(shí)LowmemoryKiller的原理是很清晰的,先看一下整體流程圖,再逐步分析:

先記住兩點(diǎn) :

  • LowMemoryKiller是被動(dòng)殺死進(jìn)程

  • Android應(yīng)用通過(guò)AMS,利用proc文件系統(tǒng)更新進(jìn)程信息

  • Android應(yīng)用進(jìn)程優(yōu)先級(jí)及oomAdj

    Android會(huì)盡可能長(zhǎng)時(shí)間地保持應(yīng)用存活,但為了新建或運(yùn)行更重要的進(jìn)程,可能需要移除舊進(jìn)程來(lái)回收內(nèi)存,在選擇要Kill的進(jìn)程的時(shí)候,系統(tǒng)會(huì)根據(jù)進(jìn)程的運(yùn)行狀態(tài)作出評(píng)估,權(quán)衡進(jìn)程的“重要性“,其權(quán)衡的依據(jù)主要是四大組件。如果需要縮減內(nèi)存,系統(tǒng)會(huì)首先消除重要性最低的進(jìn)程,然后是重要性略遜的進(jìn)程,依此類推,以回收系統(tǒng)資源。在Android中,應(yīng)用進(jìn)程劃分5級(jí)(摘自Google文檔):Android中APP的重要性層次一共5級(jí):

    • 前臺(tái)進(jìn)程(Foreground process)

    • 可見(jiàn)進(jìn)程(Visible process)

    • 服務(wù)進(jìn)程(Service process)

    • 后臺(tái)進(jìn)程(Background process)

    • 空進(jìn)程(Empty process)

    前臺(tái)進(jìn)程

    用戶當(dāng)前操作所必需的進(jìn)程。如果一個(gè)進(jìn)程滿足以下任一條件,即視為前臺(tái)進(jìn)程:

    • 包含正在交互的Activity(resumed

    • 包含綁定到正在交互的Activity的Service

    • 包含正在“前臺(tái)”運(yùn)行的Service(服務(wù)已調(diào)用startForeground())

    • 包含正執(zhí)行一個(gè)生命周期回調(diào)的Service(onCreate()、onStart() 或 onDestroy())

    • 包含一個(gè)正執(zhí)行其onReceive()方法的BroadcastReceiver

    通常,在任意給定時(shí)間前臺(tái)進(jìn)程都為數(shù)不多。只有在內(nèi)存不足以支持它們同時(shí)繼續(xù)運(yùn)行這一萬(wàn)不得已的情況下,系統(tǒng)才會(huì)終止它們。 此時(shí),設(shè)備往往已達(dá)到內(nèi)存分頁(yè)狀態(tài),因此需要終止一些前臺(tái)進(jìn)程來(lái)確保用戶界面正常響應(yīng)。

    可見(jiàn)進(jìn)程

    沒(méi)有任何前臺(tái)組件、但仍會(huì)影響用戶在屏幕上所見(jiàn)內(nèi)容的進(jìn)程。 如果一個(gè)進(jìn)程滿足以下任一條件,即視為可見(jiàn)進(jìn)程:

    • 包含不在前臺(tái)、但仍對(duì)用戶可見(jiàn)的 Activity(已調(diào)用其 onPause() 方法)。例如,如果前臺(tái) Activity 啟動(dòng)了一個(gè)對(duì)話框,允許在其后顯示上一Activity,則有可能會(huì)發(fā)生這種情況。

    • 包含綁定到可見(jiàn)(或前臺(tái))Activity 的 Service。

    可見(jiàn)進(jìn)程被視為是極其重要的進(jìn)程,除非為了維持所有前臺(tái)進(jìn)程同時(shí)運(yùn)行而必須終止,否則系統(tǒng)不會(huì)終止這些進(jìn)程。

    服務(wù)進(jìn)程

    正在運(yùn)行已使用 startService() 方法啟動(dòng)的服務(wù)且不屬于上述兩個(gè)更高類別進(jìn)程的進(jìn)程。盡管服務(wù)進(jìn)程與用戶所見(jiàn)內(nèi)容沒(méi)有直接關(guān)聯(lián),但是它們通常在執(zhí)行一些用戶關(guān)心的操作(例如,在后臺(tái)播放音樂(lè)或從網(wǎng)絡(luò)下載數(shù)據(jù))。因此,除非內(nèi)存不足以維持所有前臺(tái)進(jìn)程和可見(jiàn)進(jìn)程同時(shí)運(yùn)行,否則系統(tǒng)會(huì)讓服務(wù)進(jìn)程保持運(yùn)行狀態(tài)。

    后臺(tái)進(jìn)程

    包含目前對(duì)用戶不可見(jiàn)的 Activity 的進(jìn)程(已調(diào)用 Activity 的 onStop() 方法)。這些進(jìn)程對(duì)用戶體驗(yàn)沒(méi)有直接影響,系統(tǒng)可能隨時(shí)終止它們,以回收內(nèi)存供前臺(tái)進(jìn)程、可見(jiàn)進(jìn)程或服務(wù)進(jìn)程使用。 通常會(huì)有很多后臺(tái)進(jìn)程在運(yùn)行,因此它們會(huì)保存在 LRU (最近最少使用)列表中,以確保包含用戶最近查看的 Activity 的進(jìn)程最后一個(gè)被終止。如果某個(gè) Activity 正確實(shí)現(xiàn)了生命周期方法,并保存了其當(dāng)前狀態(tài),則終止其進(jìn)程不會(huì)對(duì)用戶體驗(yàn)產(chǎn)生明顯影響,因?yàn)楫?dāng)用戶導(dǎo)航回該 Activity 時(shí),Activity會(huì)恢復(fù)其所有可見(jiàn)狀態(tài)。 有關(guān)保存和恢復(fù)狀態(tài)、或者異常殺死恢復(fù)可以參考前兩篇 文章。

    空進(jìn)程

    不含任何活動(dòng)應(yīng)用組件的進(jìn)程。保留這種進(jìn)程的的唯一目的是用作緩存,以縮短下次在其中運(yùn)行組件所需的啟動(dòng)時(shí)間,這就是所謂熱啟動(dòng)?。為了使系統(tǒng)資源在進(jìn)程緩存和底層內(nèi)核緩存之間保持平衡,系統(tǒng)往往會(huì)終止這些進(jìn)程。

    根據(jù)進(jìn)程中當(dāng)前活動(dòng)組件的重要程度,Android會(huì)將進(jìn)程評(píng)定為它可能達(dá)到的最高級(jí)別。例如,如果某進(jìn)程托管著服務(wù)和可見(jiàn) Activity,則會(huì)將此進(jìn)程評(píng)定為可見(jiàn)進(jìn)程,而不是服務(wù)進(jìn)程。此外,一個(gè)進(jìn)程的級(jí)別可能會(huì)因其他進(jìn)程對(duì)它的依賴而有所提高,即服務(wù)于另一進(jìn)程的進(jìn)程其級(jí)別永遠(yuǎn)不會(huì)低于其所服務(wù)的進(jìn)程。 例如,如果進(jìn)程 A 中的內(nèi)容提供程序?yàn)檫M(jìn)程 B 中的客戶端提供服務(wù),或者如果進(jìn)程 A 中的服務(wù)綁定到進(jìn)程 B 中的組件,則進(jìn)程 A 始終被視為至少與進(jìn)程B同樣重要。

    通過(guò)Google文檔,對(duì)不同進(jìn)程的重要程度有了一個(gè)直觀的認(rèn)識(shí),下面看一下量化到內(nèi)存是什么樣的呈現(xiàn)形式,這里針對(duì)不同的重要程度,做了進(jìn)一步的細(xì)分,定義了重要級(jí)別ADJ,并將優(yōu)先級(jí)存儲(chǔ)到內(nèi)核空間的進(jìn)程結(jié)構(gòu)體中去,供LowmemoryKiller參考:

    ADJ優(yōu)先級(jí) 優(yōu)先級(jí) 對(duì)應(yīng)場(chǎng)景
    UNKNOWN_ADJ 16 一般指將要會(huì)緩存進(jìn)程,無(wú)法獲取確定值
    CACHED_APP_MAX_ADJ 15 不可見(jiàn)進(jìn)程的adj最大值(不可見(jiàn)進(jìn)程可能在任何時(shí)候被殺死)
    CACHED_APP_MIN_ADJ 9 不可見(jiàn)進(jìn)程的adj最小值(不可見(jiàn)進(jìn)程可能在任何時(shí)候被殺死)
    SERVICE_B_AD 8 B List中的Service(較老的、使用可能性更小)
    PREVIOUS_APP_ADJ 7 上一個(gè)App的進(jìn)程(比如APP_A跳轉(zhuǎn)APP_B,APP_A不可見(jiàn)的時(shí)候,A就是屬于PREVIOUS_APP_ADJ)
    HOME_APP_ADJ 6 Home進(jìn)程
    SERVICE_ADJ 5 服務(wù)進(jìn)程(Service process)
    HEAVY_WEIGHT_APP_ADJ 4 后臺(tái)的重量級(jí)進(jìn)程,system/rootdir/init.rc文件中設(shè)置
    BACKUP_APP_ADJ 3 備份進(jìn)程(這個(gè)不太了解)
    PERCEPTIBLE_APP_ADJ 2 可感知進(jìn)程,比如后臺(tái)音樂(lè)播放
    VISIBLE_APP_ADJ 1 可見(jiàn)進(jìn)程(可見(jiàn),但是沒(méi)能獲取焦點(diǎn),比如新進(jìn)程僅有一個(gè)懸浮Activity,Visible process)
    FOREGROUND_APP_ADJ 0 前臺(tái)進(jìn)程(正在展示是APP,存在交互界面,Foreground process)
    PERSISTENT_SERVICE_ADJ -11 關(guān)聯(lián)著系統(tǒng)或persistent進(jìn)程
    PERSISTENT_PROC_ADJ -12 系統(tǒng)persistent進(jìn)程,比如telephony
    SYSTEM_ADJ -16 系統(tǒng)進(jìn)程
    NATIVE_ADJ -17 native進(jìn)程(不被系統(tǒng)管理)

    以上介紹的目的只有一點(diǎn):Android的應(yīng)用進(jìn)程是有優(yōu)先級(jí)的,它的優(yōu)先級(jí)跟當(dāng)前是否存在展示界面,以及是否能被用戶感知有關(guān),越是被用戶感知的的應(yīng)用優(yōu)先級(jí)越高(系統(tǒng)進(jìn)程不考慮)。

    Android應(yīng)用的優(yōu)先級(jí)是如何更新的

    APP中很多操作都可能會(huì)影響進(jìn)程列表的優(yōu)先級(jí),比如退到后臺(tái)、移到前臺(tái)等,都會(huì)潛在的影響進(jìn)程的優(yōu)先級(jí),我們知道Lowmemorykiller是通過(guò)遍歷內(nèi)核的進(jìn)程結(jié)構(gòu)體隊(duì)列,選擇優(yōu)先級(jí)低的殺死,那么APP操作是如何寫(xiě)入到內(nèi)核空間的呢?Linxu有用戶間跟內(nèi)核空間的區(qū)分,無(wú)論是APP還是系統(tǒng)服務(wù),都是運(yùn)行在用戶空間,嚴(yán)格說(shuō)用戶控件的操作是無(wú)法直接影響內(nèi)核空間的,更不用說(shuō)更改進(jìn)程的優(yōu)先級(jí)。其實(shí)這里是通過(guò)了Linux中的一個(gè)proc文件體統(tǒng),proc文件系統(tǒng)可以簡(jiǎn)單的看多是內(nèi)核空間映射成用戶可以操作的文件系統(tǒng),當(dāng)然不是所有進(jìn)程都有權(quán)利操作,通過(guò)proc文件系統(tǒng),用戶空間的進(jìn)程就能夠修改內(nèi)核空間的數(shù)據(jù),比如修改進(jìn)程的優(yōu)先級(jí),在Android家族,5.0之前的系統(tǒng)是AMS進(jìn)程直接修改的,5.0之后,是修改優(yōu)先級(jí)的操作被封裝成了一個(gè)獨(dú)立的服務(wù)-lmkd,lmkd服務(wù)位于用戶空間,其作用層次同AMS、WMS類似,就是一個(gè)普通的系統(tǒng)服務(wù)。我們先看一下5.0之前的代碼,這里仍然用4.3的源碼看一下,模擬一個(gè)場(chǎng)景,APP只有一個(gè)Activity,我們主動(dòng)finish掉這個(gè)Activity,APP就回到了后臺(tái),這里要記住,雖然沒(méi)有可用的Activity,但是APP本身是沒(méi)喲死掉的,這就是所謂的熱啟動(dòng),先看下大體的流程:

    現(xiàn)在直接去AMS看源碼:

    ActivityManagerService

    public final boolean finishActivity(IBinder token, int resultCode, Intent resultData) {...synchronized(this) {final long origId = Binder.clearCallingIdentity();boolean res = mMainStack.requestFinishActivityLocked(token, resultCode,resultData, "app-request", true);...} }

    一開(kāi)始的流程跟startActivity類似,首先是先暫停當(dāng)前resume的Activity,其實(shí)也就是自己,

    final boolean finishActivityLocked(ActivityRecord r, int index, int resultCode,Intent resultData, String reason, boolean immediate, boolean oomAdj) {...if (mPausingActivity == null) {if (DEBUG_PAUSE) Slog.v(TAG, "Finish needs to pause: " + r);if (DEBUG_USER_LEAVING) Slog.v(TAG, "finish() => pause with userLeaving=false");startPausingLocked(false, false);}...}

    pause掉當(dāng)前Activity之后,還需要喚醒上一個(gè)Activity,如果當(dāng)前APP的Activity棧里應(yīng)經(jīng)空了,就回退到上一個(gè)應(yīng)用或者桌面程序,喚醒流程就不在講解了,因?yàn)樵贏MS恢復(fù)異常殺死APP的那篇已經(jīng)說(shuō)過(guò),這里要說(shuō)的是喚醒之后對(duì)這個(gè)即將退回后臺(tái)的APP的操作,這里注意與startActivity不同的地方,看下面代碼:

    ActivityStack

    private final void completePauseLocked() {ActivityRecord prev = mPausingActivity;if (prev != null) {if (prev.finishing) {1、 不同點(diǎn)<!--主動(dòng)finish的時(shí)候,走的是這個(gè)分支,狀態(tài)變換的細(xì)節(jié)請(qǐng)自己查詢代碼-->prev = finishCurrentActivityLocked(prev, FINISH_AFTER_VISIBLE, false);} ...2、相同點(diǎn) if (!mService.isSleeping()) {resumeTopActivityLocked(prev);}

    看一下上面的兩個(gè)關(guān)鍵點(diǎn)1跟2,1是同startActivity的completePauseLocked不同的地方,主動(dòng)finish的prev.finishing是為true的,因此會(huì)執(zhí)行finishCurrentActivityLocked分支,將當(dāng)前pause的Activity加到mStoppingActivities隊(duì)列中去,并且喚醒下一個(gè)需要走到到前臺(tái)的Activity,喚醒后,會(huì)繼續(xù)執(zhí)行stop:

    private final ActivityRecord finishCurrentActivityLocked(ActivityRecord r,int index, int mode, boolean oomAdj) {if (mode == FINISH_AFTER_VISIBLE && r.nowVisible) {if (!mStoppingActivities.contains(r)) {mStoppingActivities.add(r);...}....return r;}...}

    讓我們?cè)倩氐絩esumeTopActivityLocked繼續(xù)看,resume之后會(huì)回調(diào)completeResumeLocked函數(shù),繼續(xù)執(zhí)行stop,這個(gè)函數(shù)通過(guò)向Handler發(fā)送IDLE_TIMEOUT_MSG消息來(lái)回調(diào)activityIdleInternal函數(shù),最終執(zhí)行destroyActivityLocked銷毀ActivityRecord,

    final boolean resumeTopActivityLocked(ActivityRecord prev, Bundle options) {...if (next.app != null && next.app.thread != null) { ...try {。。。next.app.thread.scheduleResumeActivity(next.appToken,mService.isNextTransitionForward());..。try {next.visible = true;completeResumeLocked(next);} ....}

    在銷毀Activity的時(shí)候,如果當(dāng)前APP的Activity堆棧為空了,就說(shuō)明當(dāng)前Activity沒(méi)有可見(jiàn)界面了,這個(gè)時(shí)候就需要?jiǎng)討B(tài)更新這個(gè)APP的優(yōu)先級(jí),詳細(xì)代碼如下:

    final boolean destroyActivityLocked(ActivityRecord r,boolean removeFromApp, boolean oomAdj, String reason) {...if (hadApp) {if (removeFromApp) {// 這里動(dòng)ProcessRecord里面刪除,但是沒(méi)從history刪除int idx = r.app.activities.indexOf(r);if (idx >= 0) {r.app.activities.remove(idx);}...if (r.app.activities.size() == 0) {// No longer have activities, so update oom adj.mService.updateOomAdjLocked();...}

    最終會(huì)調(diào)用AMS的updateOomAdjLocked函數(shù)去更新進(jìn)程優(yōu)先級(jí),在4.3的源碼里面,主要是通過(guò)Process類的setOomAdj函數(shù)來(lái)設(shè)置優(yōu)先級(jí):

    ActivityManagerService

    private final boolean updateOomAdjLocked(ProcessRecord app, int hiddenAdj,int clientHiddenAdj, int emptyAdj, ProcessRecord TOP_APP, boolean doingAll) {...計(jì)算優(yōu)先級(jí)computeOomAdjLocked(app, hiddenAdj, clientHiddenAdj, emptyAdj, TOP_APP, false, doingAll);。。。<!--如果不相同,設(shè)置新的OomAdj-->if (app.curAdj != app.setAdj) {if (Process.setOomAdj(app.pid, app.curAdj)) {... }

    Process中setOomAdj是一個(gè)native方法,原型在android_util_Process.cpp中

    android_util_Process.cpp

    jboolean android_os_Process_setOomAdj(JNIEnv* env, jobject clazz,jint pid, jint adj) { #ifdef HAVE_OOM_ADJchar text[64];sprintf(text, "/proc/%d/oom_adj", pid);int fd = open(text, O_WRONLY);if (fd >= 0) {sprintf(text, "%d", adj);write(fd, text, strlen(text));close(fd);}return true; #endifreturn false; }

    可以看到,在native代碼里,就是通過(guò)proc文件系統(tǒng)修改內(nèi)核信息,這里就是動(dòng)態(tài)更新進(jìn)程的優(yōu)先級(jí)oomAdj,以上是針對(duì)Android4.3系統(tǒng)的分析,之后會(huì)看一下5.0之后的系統(tǒng)是如何實(shí)現(xiàn)的。下面是4.3更新oomAdj的流程圖,注意紅色的執(zhí)行點(diǎn):

    Android5.0之后框架層的實(shí)現(xiàn):LMKD服務(wù)

    Android5.0將設(shè)置進(jìn)程優(yōu)先級(jí)的入口封裝成了一個(gè)獨(dú)立的服務(wù)lmkd服務(wù),AMS不再直接訪問(wèn)proc文件系統(tǒng),而是通過(guò)lmkd服務(wù)來(lái)進(jìn)行設(shè)置,從init.rc文件中看到服務(wù)的配置。

    service lmkd /system/bin/lmkdclass corecriticalsocket lmkd seqpacket 0660 system system

    從配置中可以看出,該服務(wù)是通過(guò)socket與其他進(jìn)行進(jìn)程進(jìn)行通信,其實(shí)就是AMS通過(guò)socket向lmkd服務(wù)發(fā)送請(qǐng)求,讓lmkd去更新進(jìn)程的優(yōu)先級(jí),lmkd收到請(qǐng)求后,會(huì)通過(guò)/proc文件系統(tǒng)去更新內(nèi)核中的進(jìn)程優(yōu)先級(jí)。首先看一下5.0中這一塊AMS有什么改變,其實(shí)大部分流程跟之前4.3源碼類似,我們只看一下不同地方

    ActivityManagerService

    private final boolean updateOomAdjLocked(ProcessRecord app, int cachedAdj,ProcessRecord TOP_APP, boolean doingAll, long now) {...computeOomAdjLocked(app, cachedAdj, TOP_APP, doingAll, now);...applyOomAdjLocked(app, doingAll, now, SystemClock.elapsedRealtime()); }private final boolean applyOomAdjLocked(ProcessRecord app, boolean doingAll, long now,long nowElapsed) {boolean success = true;if (app.curRawAdj != app.setRawAdj) {app.setRawAdj = app.curRawAdj;}int changes = 0;不同點(diǎn)1if (app.curAdj != app.setAdj) {ProcessList.setOomAdj(app.pid, app.info.uid, app.curAdj);if (DEBUG_SWITCH || DEBUG_OOM_ADJ) Slog.v(TAG_OOM_ADJ,"Set " + app.pid + " " + app.processName + " adj " + app.curAdj + ": "+ app.adjType);app.setAdj = app.curAdj;app.verifiedAdj = ProcessList.INVALID_ADJ;}

    從上面的不同點(diǎn)1可以看出,5.0之后是通過(guò)ProcessList類去設(shè)置oomAdj,其實(shí)這里就是通過(guò)socket與LMKD服務(wù)進(jìn)行通信,向lmkd服務(wù)傳遞給LMK_PROCPRIO命令去更新進(jìn)程優(yōu)先級(jí):

    public static final void setOomAdj(int pid, int uid, int amt) {if (amt == UNKNOWN_ADJ)return;long start = SystemClock.elapsedRealtime();ByteBuffer buf = ByteBuffer.allocate(4 * 4);buf.putInt(LMK_PROCPRIO);buf.putInt(pid);buf.putInt(uid);buf.putInt(amt);writeLmkd(buf);long now = SystemClock.elapsedRealtime();} private static void writeLmkd(ByteBuffer buf) {for (int i = 0; i < 3; i++) {if (sLmkdSocket == null) {if (openLmkdSocket() == false) {...try {sLmkdOutputStream.write(buf.array(), 0, buf.position());return;...}

    其實(shí)就是openLmkdSocket打開(kāi)本地socket端口,并將優(yōu)先級(jí)信息發(fā)送過(guò)去,那么lmkd服務(wù)端如何處理的呢,init.rc里配置的服務(wù)是在開(kāi)機(jī)時(shí)啟動(dòng)的,來(lái)看看lmkd服務(wù)的入口:main函數(shù)

    lmkd.c函數(shù)

    int main(int argc __unused, char **argv __unused) {struct sched_param param = {.sched_priority = 1,};mlockall(MCL_FUTURE);sched_setscheduler(0, SCHED_FIFO, &param);if (!init())mainloop();ALOGI("exiting");return 0; }

    很簡(jiǎn)單,打開(kāi)一個(gè)端口,并通過(guò)mainloop監(jiān)聽(tīng)socket,如果有請(qǐng)求到來(lái),就解析命令并執(zhí)行,剛才傳入的LMK_PROCPRIO命令對(duì)應(yīng)的操作就是cmd_procprio,用來(lái)更新oomAdj,其更新新機(jī)制還是通過(guò)proc文件系統(tǒng),不信?看下面代碼:

    static void cmd_procprio(int pid, int uid, int oomadj) {struct proc *procp;。。。還是利用/proc文件系統(tǒng)進(jìn)行更新snprintf(path, sizeof(path), "/proc/%d/oom_score_adj", pid);snprintf(val, sizeof(val), "%d", lowmem_oom_adj_to_oom_score_adj(oomadj));writefilestring(path, val);。。。 }

    簡(jiǎn)單的流程圖如下,同4.3不同的地方

    以上就分析完了用戶空間的操作如何影響到進(jìn)程的優(yōu)先級(jí),并且將新的優(yōu)先級(jí)寫(xiě)到內(nèi)核中。最后看一下LomemoryKiller在什么時(shí)候、如何根據(jù)優(yōu)先級(jí)殺死進(jìn)程的:

    LomemoryKiller內(nèi)核部分:如何殺死

    LomemoryKiller屬于一個(gè)內(nèi)核驅(qū)動(dòng)模塊,主要功能是:在系統(tǒng)內(nèi)存不足的時(shí)候掃描進(jìn)程隊(duì)列,找到低優(yōu)先級(jí)(也許說(shuō)性價(jià)比低更合適)的進(jìn)程并殺死,以達(dá)到釋放內(nèi)存的目的。對(duì)于驅(qū)動(dòng)程序,入口是__init函數(shù),先看一下這個(gè)驅(qū)動(dòng)模塊的入口:

    static int __init lowmem_init(void) {register_shrinker(&lowmem_shrinker);return 0; }

    可以看到在init的時(shí)候,LomemoryKiller將自己的lowmem_shrinker入口注冊(cè)到系統(tǒng)的內(nèi)存檢測(cè)模塊去,作用就是在內(nèi)存不足的時(shí)候可以被回調(diào),register_shrinker函數(shù)是一屬于另一個(gè)內(nèi)存管理模塊的函數(shù),如果一定要根下去的話,可以看一下它的定義,其實(shí)就是加到一個(gè)回調(diào)函數(shù)隊(duì)列中去:

    void register_shrinker(struct shrinker *shrinker) {shrinker->nr = 0;down_write(&shrinker_rwsem);list_add_tail(&shrinker->list, &shrinker_list);up_write(&shrinker_rwsem); }

    最后,看一下,當(dāng)內(nèi)存不足觸發(fā)回調(diào)的時(shí)候,LomemoryKiller是如何找到低優(yōu)先級(jí)進(jìn)程,并殺死的:入口函數(shù)就是init時(shí)候注冊(cè)的lowmem_shrink函數(shù)(4.3源碼,后面的都有微調(diào)但原理大概類似):

    static int lowmem_shrink(int nr_to_scan, gfp_t gfp_mask) {struct task_struct *p;。。。關(guān)鍵點(diǎn)1 找到當(dāng)前的內(nèi)存對(duì)應(yīng)的閾值for(i = 0; i < array_size; i++) {if (other_free < lowmem_minfree[i] &&other_file < lowmem_minfree[i]) {min_adj = lowmem_adj[i];break;}}。。。關(guān)鍵點(diǎn)2 找到優(yōu)先級(jí)低于這個(gè)閾值的進(jìn)程,并殺死read_lock(&tasklist_lock);for_each_process(p) {if (p->oomkilladj < min_adj || !p->mm)continue;tasksize = get_mm_rss(p->mm);if (tasksize <= 0)continue;if (selected) {if (p->oomkilladj < selected->oomkilladj)continue;if (p->oomkilladj == selected->oomkilladj &&tasksize <= selected_tasksize)continue;}selected = p;selected_tasksize = tasksize;}if(selected != NULL) {force_sig(SIGKILL, selected);rem -= selected_tasksize;}lowmem_print(4, "lowmem_shrink %d, %x, return %d\n", nr_to_scan, gfp_mask, rem);read_unlock(&tasklist_lock);return rem; }

    先看關(guān)鍵點(diǎn)1:其實(shí)就是確定當(dāng)前低內(nèi)存對(duì)應(yīng)的閾值;關(guān)鍵點(diǎn)2 :找到比該閾值優(yōu)先級(jí)低,切task多的進(jìn)程,將其殺死。如何殺死的呢?很直接,通過(guò)Linux的中的信號(hào)量,發(fā)送SIGKILL信號(hào)直接將進(jìn)程殺死。到這就分析完了LomemoryKiller內(nèi)核部分如何工作的。其實(shí)很簡(jiǎn)單,一句話:被動(dòng)掃描,找到低優(yōu)先級(jí)的進(jìn)程,殺死。

    總結(jié)

    通過(guò)本篇文章,希望大家能有以下幾點(diǎn)認(rèn)知:

    • Android APP進(jìn)程是有優(yōu)先級(jí)的的,與進(jìn)程是否被用戶感知有直接關(guān)系

    • APP切換等活動(dòng)都可能造成進(jìn)程優(yōu)先級(jí)的變化,都是利用AMS,并通過(guò)proc文件設(shè)置到內(nèi)核的

    • LowmemoryKiller運(yùn)行在內(nèi)核,在內(nèi)存需要縮減的時(shí)候,會(huì)選擇低優(yōu)先級(jí)的進(jìn)程殺死

    至于更加細(xì)節(jié)的內(nèi)存的縮減、優(yōu)先級(jí)的計(jì)算也許將來(lái)會(huì)放到單獨(dú)的文章中說(shuō)明,本文的目的是:能讓大家對(duì)LowmemoryKiller的概念以及運(yùn)行機(jī)制有個(gè)簡(jiǎn)單了解。

    參考文檔

    Android應(yīng)用程序啟動(dòng)過(guò)程源代碼分析?
    Android Framework架構(gòu)淺析之【近期任務(wù)】?
    Android Low Memory Killer介紹?
    Android開(kāi)發(fā)之InstanceState詳解?
    對(duì)Android近期任務(wù)列表(Recent Applications)的簡(jiǎn)單分析?
    Android 操作系統(tǒng)的內(nèi)存回收機(jī)制?
    Android LowMemoryKiller原理分析 精?
    Android進(jìn)程生命周期與ADJ?
    Linux下/proc目錄簡(jiǎn)介?
    Android系統(tǒng)中的進(jìn)程管理:進(jìn)程的創(chuàng)建 精?
    Google文檔--進(jìn)程和線程


    原文地址: 

    總結(jié)

    以上是生活随笔為你收集整理的Android后台杀死系列之三:LowMemoryKiller原理(4.3-6.0)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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

    91亚洲国产成人久久精品网站 | 免费亚洲精品 | 亚洲三级性片 | 亚洲精品免费在线 | 免费看v片| 97国产精品免费 | 日韩免费在线一区 | 国产精品入口a级 | 99视频国产精品 | 综合国产在线观看 | 国产精品黑丝在线观看 | 午夜精品一区二区三区可下载 | 免费看片成年人 | 日韩欧美一区二区在线播放 | 91九色视频观看 | 亚洲精品视频网址 | 狠狠干夜夜爱 | 成人午夜电影在线观看 | 在线免费黄网站 | 人人人爽 | 亚州av成人 | 婷婷久久一区 | 色永久免费视频 | 国产美女网站视频 | 中文字幕精品一区二区精品 | 丁香六月激情 | 国产99精品| 欧美日韩不卡在线 | 91亚洲狠狠婷婷综合久久久 | 精品欧美乱码久久久久久 | 国产电影一区二区三区四区 | 午夜黄色影院 | 日日干美女 | 国产伦精品一区二区三区四区视频 | 国产精品自产拍在线观看蜜 | 国产不卡视频在线 | 欧美日韩久久 | 91中文字幕一区 | 亚洲国产精久久久久久久 | av福利免费 | 伊人精品在线 | 激情 一区二区 | 婷婷色九月 | 亚洲人成在线观看 | 国产精品视频线看 | 国产精品乱码在线 | 国产精品igao视频网入口 | 国产精品久久久久久久久久久久久 | 国产亚洲永久域名 | 亚洲欧美国内爽妇网 | 激情五月播播久久久精品 | 精品视频在线视频 | 日韩欧美在线视频一区二区 | 97碰碰精品嫩模在线播放 | 91少妇精拍在线播放 | 69精品久久 | 色综合久久99| 992tv又爽又黄的免费视频 | 午夜影院日本 | 日日夜夜av | 成人av资源网 | 成人黄色小说网 | 国产欧美三级 | 中文字幕在线看人 | 欧美日韩在线视频免费 | 黄色三几片 | 99热精品在线 | 亚洲精品免费在线视频 | 国产香蕉久久精品综合网 | 97伊人网| 亚洲精品女人久久久 | 精品国产免费一区二区三区五区 | 在线中文字幕观看 | 日本成人免费在线观看 | 日韩精品 在线视频 | 丰满少妇对白在线偷拍 | 99av国产精品欲麻豆 | 超碰在线9| 93久久精品日日躁夜夜躁欧美 | 国产中文字幕一区二区三区 | 99精品免费久久久久久久久日本 | 伊人成人激情 | 国产成人精品亚洲日本在线观看 | 日韩网站免费观看 | 欧美日韩裸体免费视频 | 欧美大片大全 | 在线观看精品黄av片免费 | 国产精品免费视频一区二区 | 狠狠狠色丁香综合久久天下网 | 成人网页在线免费观看 | 99欧美 | 亚洲黄色app | 天天操伊人 | 精品一区二区三区久久久 | 日韩精品一区二区三区在线播放 | 久久久久久久久久久久电影 | 欧美巨大 | 黄色av影院 | 激情五月网站 | 成人av.com| 一区二区三区av在线 | 久久激五月天综合精品 | 成人免费观看在线视频 | 日本一区二区高清不卡 | 国产aa精品 | 日韩精品免费在线视频 | 欧美日韩在线精品 | www.久久久 | 大荫蒂欧美视频另类xxxx | 国产91小视频| 欧美日产一区 | 久草在线综合 | 日韩精品久久久 | av在线播放一区二区三区 | 成年人黄色免费网站 | 丁香综合五月 | 91丨九色丨国产丨porny精品 | 97av在线视频免费播放 | 最近日韩中文字幕中文 | 丁香激情婷婷 | 99re6热在线精品视频 | 日韩欧美99 | 免费高清在线一区 | 免费在线观看国产黄 | 日韩网页| 一级a性色生活片久久毛片波多野 | 99精品视频在线观看免费 | 国产精品黄色在线观看 | 亚洲全部视频 | 激情在线五月天 | 香蕉久久久久久久 | 久久爱www. | 日本久久高清视频 | 国产成人精品一区一区一区 | 黄色高清视频在线观看 | 丁香六月在线 | 九九九九免费视频 | 在线看污网站 | 中文字幕亚洲在线观看 | 久久视频网址 | 免费精品人在线二线三线 | 午夜久久久精品 | 不卡电影免费在线播放一区 | 日韩在线观看电影 | 中文字幕在线播放第一页 | 99se视频在线观看 | 国产精品久久久久国产精品日日 | 91精品免费在线观看 | 日韩欧美在线高清 | 日韩肉感妇bbwbbwbbw | 久久婷婷国产色一区二区三区 | 777视频在线观看 | 夜夜夜夜猛噜噜噜噜噜初音未来 | 日韩在线国产精品 | 久久精品2 | 日韩免费视频线观看 | 久久成人国产精品 | 日韩免费视频播放 | 九九免费视频 | 91视频在线免费看 | 精品人妖videos欧美人妖 | 91精品免费在线 | 色99在线| 午夜久久成人 | 天堂av一区二区 | 国产三级精品三级在线观看 | 国产网红在线观看 | 中文字幕精品三区 | 亚洲电影免费 | 天天看天天操 | 亚洲精选在线观看 | 国产成人av电影在线观看 | 中文字幕在线观看视频一区二区三区 | 日本中文字幕视频 | 午夜精选视频 | 国产免费久久久久 | 国产看片免费 | 中文国产在线观看 | 国产精品视频久久久 | 在线导航福利 | 日韩网站在线免费观看 | 午夜免费福利视频 | 黄色网址国产 | 成人免费网站在线观看 | 国产96精品| 四虎精品成人免费网站 | 国内精品久久久久久 | 在线看日韩 | 久久精品高清视频 | 成人黄色片在线播放 | 青青草国产免费 | 91精品国产99久久久久久红楼 | 蜜桃视频精品 | 人人射人人爽 | 三上悠亚一区二区在线观看 | 亚洲精品tv久久久久久久久久 | 麻豆传媒在线免费看 | 亚洲精品99久久久久中文字幕 | 亚洲国产精品久久久久久 | 免费黄色一区 | 91片黄在线观看动漫 | av高清在线 | 国产区免费在线 | 亚洲五月激情 | 欧美少妇的秘密 | 乱男乱女www7788| 99精品国产99久久久久久福利 | 天天干天天干天天干天天干天天干天天干 | 在线免费观看成人 | 欧美视频日韩视频 | 欧美韩日在线 | 欧美极品xxx | 国产精品日韩在线 | 色91av| 天天躁日日躁狠狠 | 免费看的黄色录像 | 在线电影 一区 | 天天射天天操天天干 | 白丝av在线 | 久久综合九色99 | 国产成人在线观看免费 | 久久不见久久见免费影院 | 色综合激情久久 | 国产亚洲成av人片在线观看桃 | 超碰人人超 | 中文字幕视频在线播放 | 国产免费午夜 | 超碰成人免费电影 | 国产三级久久久 | 欧美日韩一区二区三区在线免费观看 | 国产亚洲精品久久久久久移动网络 | 日本性生活一级片 | 91丨九色丨国产在线 | 在线观看日韩视频 | 天天综合日日夜夜 | 久久久久久国产精品 | 婷婷狠狠操 | 免费人人干 | 亚洲乱码国产乱码精品天美传媒 | 99r国产精品 | 日本中文字幕在线播放 | 欧美日韩免费视频 | 天天色天天爱天天射综合 | 欧美精品久久久久久久久久 | 麻豆视频在线观看免费 | 久久精品久久久久电影 | 久久久久久免费毛片精品 | 狠狠色丁香婷婷综合视频 | 日韩性网站| 色在线免费视频 | 玖玖综合网 | 免费大片黄在线 | 久爱综合 | 波多野结衣网址 | av中文字幕免费在线观看 | 99久久久成人国产精品 | 欧美成年人在线视频 | 丁香五月网久久综合 | 天天插天天狠 | 伊人婷婷网 | 日韩在线观看三区 | 久久av免费| 人人狠狠综合久久亚洲婷 | 日本爱爱片 | 91麻豆视频 | 日韩精品极品视频 | 在线观看激情av | 一区二区国产精品 | 亚洲免费av网站 | 色资源中文字幕 | 成片人卡1卡2卡3手机免费看 | 4p变态网欧美系列 | 欧美大香线蕉线伊人久久 | 中文字幕电影高清在线观看 | 日韩精品一区二区在线观看视频 | 免费91麻豆精品国产自产在线观看 | 五月天久久综合 | 天天草天天插 | 狠狠撸电影 | 999电影免费在线观看 | 欧美激情精品久久久久久变态 | 国产精品ssss在线亚洲 | 日韩精品一区二区免费 | 国内精自线一二区永久 | 黄色的视频网站 | 日韩精品一区二区三区外面 | 最近最新mv字幕免费观看 | 日本精a在线观看 | 人人射av| 天天色天天上天天操 | 国产精品视频免费 | 国产精品久久久久久久久久久久冷 | 国产在线视频一区 | 夜夜躁日日躁狠狠久久88av | 香蕉网站在线观看 | 国产美女网站视频 | 国产精品高清在线观看 | www.狠狠色| 久久8精品| 成人性生交视频 | 欧美aaa一级 | 欧美日韩在线免费观看 | 精品一区二区三区电影 | 国产二区视频在线 | 久久久久综合 | 激情综合国产 | 欧美在线不卡一区 | 五月婷婷在线播放 | 国产一区二区综合 | 国产精品久久久久一区 | 欧美成a人片在线观看久 | 国产区久久 | 欧美日韩3p | 亚洲三级黄 | 久久久精品 一区二区三区 国产99视频在线观看 | 日韩视频一二三区 | 亚洲开心色 | 免费精品在线观看 | 色噜噜日韩精品欧美一区二区 | 天天狠狠干 | 国产亚洲亚洲 | 国产vs久久 | 久久日本视频 | 国内精品视频一区二区三区八戒 | 99视频在线免费 | 国产精品久久久久久吹潮天美传媒 | 91av视频在线免费观看 | 99高清视频有精品视频 | 成人一级黄色片 | 欧洲精品二区 | 在线视频第一页 | 中文字幕在线观看完整 | 大荫蒂欧美视频另类xxxx | a v在线观看 | 手机av在线免费观看 | 在线亚洲观看 | 91欧美在线| 日日成人网 | 免费在线观看av网站 | 色的网站在线观看 | 99精品免费在线 | jizz欧美性9 国产一区高清在线观看 | 免费激情在线电影 | 日韩午夜网站 | 日韩电影在线一区二区 | 国产精品国产亚洲精品看不卡15 | 五月天丁香综合 | 成人在线电影观看 | 99免费在线视频观看 | 国产精品久久亚洲 | 国产精品成人一区二区三区吃奶 | 亚洲色图av | 国产日韩欧美在线一区 | 国产精品久久久久久久电影 | 91精品国产91久久久久久三级 | 狠狠干综合 | 久久亚洲区| 激情大尺度视频 | 夜添久久精品亚洲国产精品 | 亚洲在线视频免费观看 | 亚洲成av人片 | 天天看天天干 | 五月天久久综合 | 久久久综合 | 国产精品理论片在线播放 | 亚洲免费精品视频 | 69久久久 | 日韩精品免费一区 | 国产一线二线三线在线观看 | 国产精品九九热 | 婷久久 | 亚洲五月婷 | 日本激情视频中文字幕 | 免费在线黄色av | 久久成人久久 | 久久99视频免费 | 久久久久电影 | av免费成人 | 国产精品久久久久久久久久久免费 | 中文字幕av免费在线观看 | www五月天com| 视频在线一区二区三区 | 国产精品久久99综合免费观看尤物 | 久久综合九色综合网站 | 午夜视频不卡 | 国产精品亚州 | wwxxxx日本| 在线视频久 | 亚洲专区免费观看 | 久久人人97超碰国产公开结果 | 日韩mv欧美mv国产精品 | 黄色一级在线视频 | 国产精品永久久久久久久久久 | 福利视频区 | 欧美一级片在线 | 日日干综合 | 久热av在线| 香蕉视频免费看 | 国产高清黄 | 99精品久久精品一区二区 | 亚洲免费成人av电影 | 成人a v视频 | 超碰在线官网 | 在线看v片| 国产黄在线播放 | 欧美乱淫视频 | 99国产精品免费网站 | 激情视频在线观看网址 | 国产一线二线三线性视频 | 国产高清在线视频 | 久久99欧美 | 国产精品久久一区二区三区不卡 | 免费黄色小网站 | 国偷自产视频一区二区久 | 国产精品美女久久久久久久网站 | 久久av网址 | 91精品国自产拍天天拍 | 亚洲一区二区三区毛片 | 超碰成人免费电影 | 日韩久久午夜一级啪啪 | 黄色的视频网站 | 亚洲精品国久久99热 | 免费观看完整版无人区 | a成人v在线 | 欧美日韩精品影院 | 免费一级片在线 | 91大神一区二区三区 | 成人小视频在线免费观看 | av电影免费在线看 | 有码视频在线观看 | 久久久不卡影院 | 日本韩国在线不卡 | 日本久久免费电影 | 国产精品二区在线 | 欧美亚洲成人xxx | 色a在线观看| 久久久精品国产免费观看一区二区 | 草莓视频在线观看免费观看 | 亚洲 中文字幕av | 500部大龄熟乱视频使用方法 | 91理论片午午伦夜理片久久 | 日本激情中文字幕 | 天天色棕合合合合合合 | 四虎4hu永久免费 | 日韩大片在线看 | 在线精品视频在线观看高清 | 97视频免费 | 在线观看网站你懂的 | 欧美激情在线看 | 涩av在线 | 一级黄色免费 | 夜夜爱av| 高清国产一区 | 日韩欧美一区二区三区视频 | 97热久久免费频精品99 | 色全色在线资源网 | 在线 国产一区 | 久久久久久久久久久福利 | 国产不卡精品 | 国产在线观看免 | 操操操干干干 | 三三级黄色片之日韩 | 天天天干 | 色偷偷88888欧美精品久久久 | 国产精品6 | 日韩手机在线 | 成人av在线影视 | 特级毛片在线观看 | 国产在线精品播放 | 在线观看91久久久久久 | 91精品国产九九九久久久亚洲 | 黄色aa久久 | 日韩精品五月天 | 欧美在线视频第一页 | 香蕉视频在线免费看 | 国产激情电影综合在线看 | 久久一区精品 | 亚洲性xxxx| 国产aa精品 | 国产 日韩 中文字幕 | 不卡在线一区 | 91爱在线 | 国产高清精品在线观看 | 国产精品毛片久久久久久久久久99999999 | 91传媒在线观看 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 亚洲成年人免费网站 | 国产在线小视频 | 粉嫩aⅴ一区二区三区 | 日韩欧美国产免费播放 | 97成人精品区在线播放 | 韩国av免费在线 | 久久人人爽人人爽人人片 | 最新婷婷色| 亚洲成熟女人毛片在线 | 日本一区二区免费在线观看 | 午夜久久网 | 免费高清在线观看成人 | 91九色国产 | 久久影视中文字幕 | 国产伦精品一区二区三区四区视频 | 91久久精 | 日韩av看片 | 成人亚洲精品久久久久 | 在线免费观看视频你懂的 | 开心婷婷色 | 亚洲黄色成人av | 国产亚洲欧美精品久久久久久 | 久久久国产99久久国产一 | 99久久精品国产亚洲 | 五月天色网站 | 操老逼免费视频 | 丁香婷婷色综合亚洲电影 | 国产精品一区专区欧美日韩 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 天天天操天天天干 | 九九免费在线观看 | 亚洲精品视频一二三 | 97av视频| 亚洲精品自在在线观看 | 久久精品视频3 | 成人黄色国产 | 久久国产精品99久久久久久老狼 | 在线观看色视频 | 91手机电影 | 亚洲a资源 | av电影在线观看完整版一区二区 | 在线观看成人小视频 | 色婷婷在线观看视频 | 视频一区二区在线观看 | 国产婷婷精品av在线 | 天天综合网天天综合色 | 最近中文字幕在线中文高清版 | 国产黄色一级片 | 国产精品综合在线 | 99热在线精品观看 | 国产小视频在线 | 97超碰在线久草超碰在线观看 | 国产18精品乱码免费看 | 日本巨乳在线 | 色婷婷亚洲 | 久久综合99 | 青草视频免费观看 | 亚洲精品美女免费 | 欧美在线观看视频一区二区三区 | 国产欧美在线一区 | 91久久久久久久 | 美女黄濒 | 九九有精品| 免费开视频 | 免费看黄色大全 | 97视频在线观看免费 | 西西人体4444www高清视频 | 伊人宗合网 | 精品久久久久_ | 欧美精品久久久久a | 99九九免费视频 | 免费高清无人区完整版 | 免费在线一区二区 | 国产一区二区三区四区在线 | 亚洲一区在线看 | 国产又粗又猛又黄又爽的视频 | 免费观看av | 五月开心六月伊人色婷婷 | 女人高潮一级片 | 手机看片福利 | 九9热这里真品2 | 在线观看视频一区二区三区 | 丝袜美腿亚洲 | 精品美女久久久久 | 欧美久久久久久久久久 | 叶爱av在线 | av无限看 | 91精品国产综合久久福利不卡 | 精品视频资源站 | 激情久久婷婷 | 日韩久久久久久 | 999电影免费在线观看2020 | 国产高清日韩 | 精品久久久久久久久久岛国gif | 91亚洲欧美激情 | www.日日日.com| 亚洲黑丝少妇 | 色.www| 麻豆国产精品视频 | 国产v视频 | 久久免费精品 | 免费看污黄网站 | 精品久久网 | 天天干天天色2020 | 婷婷日韩| 日韩在线第一 | 在线亚洲免费视频 | 一区二区三区精品在线 | 五月天婷婷丁香花 | 中文有码在线视频 | 日本久久免费电影 | 韩国av免费| 特黄特色特刺激视频免费播放 | 成人在线观看网址 | 狠狠躁日日躁狂躁夜夜躁av | 亚洲国产午夜视频 | 国产精品 中文在线 | 婷婷色 亚洲 | 天堂va在线高清一区 | 久草在线视频国产 | 色狠狠婷婷 | 91亚洲精品久久久中文字幕 | 国产精品综合av一区二区国产馆 | 久久亚洲免费 | 特黄特色特刺激视频免费播放 | 2019天天干天天色 | 亚州国产精品 | 日韩精品一区二区在线视频 | 国产破处精品 | 99精品视频在线观看视频 | 成人动漫视频在线 | 中文字幕一区二区三区在线播放 | 五月天婷婷视频 | 在线观看91精品国产网站 | 国产精品二区在线观看 | 国产视频中文字幕在线观看 | 天天草视频| 国产黄大片在线观看 | 欧美a性 | 日韩欧美精品在线观看视频 | 国产成人精品午夜在线播放 | 九九久久国产精品 | 在线观看中文字幕一区 | 国产视频999 | 久久免费看av | 超碰在线人人艹 | 亚洲日本在线视频观看 | 中文字幕在线视频免费播放 | 婷香五月| 国产成人久久精品一区二区三区 | 五月婷婷激情综合 | 久在线 | 色综合天天狠天天透天天伊人 | 国产小视频在线 | 高清av免费看 | 国产一级做a爱片久久毛片a | 91亚洲在线观看 | 香蕉视频在线免费 | 麻豆精品91 | 日韩免费观看高清 | 亚洲欧美日韩中文在线 | 视频在线观看入口黄最新永久免费国产 | 97爱| 韩国精品一区二区三区六区色诱 | 日韩中文字幕免费电影 | 日韩在线电影观看 | av在线免费网 | 亚洲jizzjizz日本少妇 | 久久久久www| 区一区二在线 | 国产69精品久久久久99尤 | 69成人在线 | 久久黄色网| 日韩免费观看视频 | 国产中文字幕第一页 | 黄污污网站| 成人毛片在线视频 | 91在线超碰 | 成人黄视频 | 国产亚洲人| 久久全国免费视频 | 黄色av免费电影 | 最近字幕在线观看第一季 | 国产亚洲精品成人av久久影院 | 久草精品视频在线看网站免费 | 国产不卡在线播放 | 日本一区二区不卡高清 | 狠狠狠狠狠狠干 | 国产一区二区久久精品 | 久久久久五月 | 国产婷婷一区二区 | 日韩爱爱网站 | 国产免费一区二区三区最新 | 韩国av一区二区三区在线观看 | 日韩欧美一区二区在线 | 国产日韩精品一区二区三区 | 久99视频| 在线播放第一页 | 91日韩精品视频 | 中文字幕韩在线第一页 | 国产a国产a国产a | 国产区 在线 | 久草在线高清视频 | 97超碰人人澡人人爱学生 | 欧美精品一区在线发布 | 日日爱av| 久影院| 999久久久国产精品 高清av免费观看 | 国产色婷婷精品综合在线手机播放 | 日本一区二区三区免费看 | 草久久久久久 | 日韩视频免费观看高清完整版在线 | 九七视频在线观看 | 精品国产一区二区三区久久 | 黄色亚洲免费 | 色婷五月天 | 国产精品一区二区三区在线看 | 日韩欧美高清不卡 | 久久久久成人精品亚洲国产 | 最新av在线网址 | 久草爱 | 久久精品视频在线观看免费 | 久草免费在线观看视频 | 免费能看的av | 午夜国产成人 | av在线电影免费观看 | 欧美午夜剧场 | 亚洲91网站 | 美女网站色在线观看 | 免费久久视频 | 免费在线黄色av | 天天操天天射天天 | 粉嫩aⅴ一区二区三区 | 色婷婷综合久久久中文字幕 | 精品一区精品二区高清 | 激情av一区二区 | 欧美精品久久天天躁 | 国产黄在线看 | 欧美整片sss | 精品国产伦一区二区三区观看说明 | 激情视频免费观看 | 亚洲成人资源在线 | 久热色超碰| 午夜精品一区二区三区在线观看 | 欧美日韩电影在线播放 | 亚洲精品视频网站在线观看 | 久久久久久久久精 | 18久久久久久 | 日日麻批40分钟视频免费观看 | 国产在线观看午夜 | 99视频播放 | 国产精品一区二区久久精品爱微奶 | 免费看的黄色的网站 | 涩五月婷婷 | 欧美日韩中文字幕视频 | 久久在线免费观看 | av中文字幕免费在线观看 | 欧美专区日韩专区 | 亚洲免费不卡 | 四虎在线永久免费观看 | 天堂网av在线 | 99免费在线播放99久久免费 | 色视频网址 | 成人一区二区在线观看 | 激情综合网五月 | 91精彩视频在线观看 | 久久久久 | 欧美日韩国产高清视频 | 51久久成人国产精品麻豆 | 日韩免费一区 | 91精品久久香蕉国产线看观看 | 国产伦理久久精品久久久久_ | 亚洲极色 | 婷婷丁香花五月天 | 久草视频手机在线 | 三级av免费| 五月婷婷丁香激情 | 久久试看 | 亚洲精品 在线视频 | 97视频在线观看免费 | 中文字幕在线观看一区二区 | 欧美视频日韩 | 高清免费av在线 | 日韩素人在线观看 | 国产黄色大全 | 五月综合久久 | 国产第页| 中文字幕4 | 日韩在线免费视频观看 | 91中文字幕| 狠狠色婷婷丁香六月 | 国产成人99久久亚洲综合精品 | 国产一区私人高清影院 | 人成免费网站 | 国产 日韩 中文字幕 | 国产毛片在线 | 日韩精品一区二区三区不卡 | 国产一级91| 婷婷激情影院 | 亚欧日韩成人h片 | 91在线看黄| 精品欧美在线视频 | 日本在线观看黄色 | 中文字幕在线观看视频一区二区三区 | 国产二区免费视频 | 992tv在线观看 | 欧美日韩在线观看不卡 | 久久久久国产精品午夜一区 | 亚洲深夜影院 | 日韩高清激情 | 久久精品综合一区 | 久99视频 | 亚洲天堂色婷婷 | 蜜臀久久99精品久久久无需会员 | 免费观看www7722午夜电影 | 欧美激情片在线观看 | 亚洲日本成人 | 91在线影院| 六月婷操 | 国产精品久久久 | 久久免费公开视频 | 国产精品99爱 | 久久国产一区二区三区 | 欧美精品在线观看 | 午夜美女福利直播 | 一级免费av | 不卡视频在线 | 中文字幕观看av | av在线免费观看不卡 | 人人干,人人爽 | 怡红院av久久久久久久 | 久久av中文字幕片 | 黄色在线免费观看网址 | 免费观看国产精品视频 | 深夜男人影院 | 色婷婷电影网 | 夜夜干夜夜 | 亚洲国产经典视频 | 国产一区二区中文字幕 | 国产欧美精品一区二区三区 | 日本中文字幕在线观看 | 自拍超碰在线 | 91亚洲精品久久久中文字幕 | 四虎8848免费高清在线观看 | 欧美日韩国产综合一区二区 | 黄色大片入口 | 久久情网 | 国产一级片在线播放 | 天天综合中文 | 中文字幕国产亚洲 | 成人a视频在线观看 | 久久久精品国产免费观看一区二区 | 欧美一二三专区 | 视频在线观看国产 | a天堂最新版中文在线地址 久久99久久精品国产 | 亚洲人人射 | av资源在线观看 | 国产综合在线视频 | 日韩欧美在线影院 | 特级西西444www大精品视频免费看 | 国产精品完整版 | 免费人人干 | 伊人五月天综合 | 午夜精品麻豆 | 久久黄色小说视频 | 99福利影院 | 99在线观看免费视频精品观看 | 在线视频精品 | 久久久69| 久久亚洲热 | 久精品在线 | 91香蕉视频 | 国产在线欧美 | 国产日韩一区在线 | 五月婷亚洲| 人人爽人人看 | 激情av五月婷婷 | 在线看黄色av | 99久久这里有精品 | www操操| 91av在线国产 | 国产亚洲日本 | 亚洲在线视频免费观看 | 免费在线观看亚洲视频 | 色偷偷888欧美精品久久久 | 中文字幕专区高清在线观看 | av一区二区三区在线 | 综合精品在线 | 亚洲黄色av一区 | 三上悠亚在线免费 | 在线看v片 | 激情久久五月天 | 人人插人人射 | 四虎在线影视 | www.超碰| 91x色| 久久精品久久99 | 久久久亚洲精华液 | 国产午夜精品一区二区三区四区 | 久草视频在线免费播放 | 7777xxxx | 亚洲五月六月 | 色婷婷九月| 亚洲视频免费视频 | 欧美午夜性生活 | 精品欧美小视频在线观看 | 激情五月亚洲 | 97超在线视频 | 日b黄色片 | 免费观看www视频 | 最近中文字幕mv免费高清在线 | 久久99国产综合精品 | 日本中文字幕免费观看 | 国产精品18久久久久白浆 | 天天操天天射天天 | 国产中文字幕在线看 | 激情综合狠狠 | 美女网站黄免费 | 国产成人精品一区二区三区福利 | 国产精品日韩久久久久 | 久草在线最新 | 成人国产精品久久久春色 | 成人午夜免费福利 | 日韩视频一区二区三区在线播放免费观看 | 999久久久免费视频 午夜国产在线观看 | 国产精品久久久久久久久久久久午夜 | 亚洲精品国产片 | 99这里只有久久精品视频 | 日韩一级片网址 | 国产1区在线 | 亚洲精品视 | 久久久久北条麻妃免费看 | 精品在线观看一区二区 | 久久久久久国产精品999 | 亚洲精品国产品国语在线 | 91香蕉久久 | 国产精品不卡在线播放 | 日韩系列在线 | 黄色大全视频 | 国内精品久久久久久久久 | 国产精品精品久久久 | 黄污网站在线观看 | 久久久美女 | a√天堂中文在线 | 日韩中文字幕一区 | 中文字幕久久网 | 最近免费在线观看 | 国产九九精品视频 | 亚洲精品在线免费播放 | 免费视频xnxx com | 99久久国产免费免费 | 三级av小说| 欧美最猛性xxxxx(亚洲精品) | 91欧美精品 | 中文字幕乱在线伦视频中文字幕乱码在线 | 久久久精品小视频 | 黄色软件大全网站 | 中文在线a∨在线 | 精品999在线观看 | 91大神精品视频在线观看 | 成人av影视 | 久久与婷婷 | 国产一区二区不卡在线 | 日本公妇在线观看 | 四虎在线观看视频 | 亚洲精品a区 | 日韩视频二区 | 欧美性直播| 黄色成人av | 99久久婷婷国产综合亚洲 | 中文字幕视频播放 | 国产精品18久久久久久久久久久久 | 久草精品在线观看 | 激情av综合 | 91黄色在线观看 | 成人av电影在线 | 亚洲精品自在在线观看 | 欧美视频一区二 | 国产精品岛国久久久久久久久红粉 | 日韩一级片网址 | 91探花国产综合在线精品 | 日韩电影在线视频 | 中文字幕一区二区三区乱码不卡 | 在线观看亚洲精品视频 | 久久精品毛片基地 | 久久99精品久久久久久 | 国产精品一区二区久久精品爱涩 | 国产精品久久久久久久久久三级 | www.在线观看av | 成人小视频在线免费观看 | 中文字幕在线观看免费高清电影 | 91精品国产91热久久久做人人 | 91精品一区二区三区久久久久久 | 日韩av资源在线观看 | 91精品国产综合久久福利不卡 | 久久亚洲精品电影 | www.啪啪.com | 亚洲干 | 99九九免费视频 | 欧亚日韩精品一区二区在线 | 国产精品99爱 | 亚洲精品美女在线观看 | 欧美精品久久久久久久久老牛影院 | 久久免费视频网 | 在线观看香蕉视频 | 欧美极品xxx | 成人综合日日夜夜 | 国产精品va在线观看入 | 韩国在线一区二区 | 国产韩国日本高清视频 | 在线91色| 成人黄色免费观看 |