日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android进程保活招式大全

發布時間:2025/4/16 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android进程保活招式大全 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

原文出處:http://dev.qq.com/topic/57ac4a0ea374c75371c08ce8

作者:騰訊——張興華

目前市面上的應用,貌似除了微信和手Q都會比較擔心被用戶或者系統(廠商)殺死問題。本文對 Android 進程拉活進行一個總結。

Android 進程拉活包括兩個層面:

A. 提供進程優先級,降低進程被殺死的概率

B. 在進程被殺死后,進行拉活

本文下面就從這兩個方面做一下總結。

1. 進程的優先級

Android 系統將盡量長時間地保持應用進程,但為了新建進程或運行更重要的進程,最終需要清除舊進程來回收內存。 為了確定保留或終止哪些進程,系統會根據進程中正在運行的組件以及這些組件的狀態,將每個進程放入“重要性層次結構”中。 必要時,系統會首先消除重要性最低的進程,然后是清除重要性稍低一級的進程,依此類推,以回收系統資源。

進程的重要性,劃分5級:

  • 前臺進程(Foreground process)

  • 可見進程(Visible process)

  • 服務進程(Service process)

  • 后臺進程(Background process)

  • 空進程(Empty process)

  • 前臺進程的重要性最高,依次遞減,空進程的重要性最低,下面分別來闡述每種級別的進程

    1.1. 前臺進程 —— Foreground process

    用戶當前操作所必需的進程。通常在任意給定時間前臺進程都為數不多。只有在內存不足以支持它們同時繼續運行這一萬不得已的情況下,系統才會終止它們。

    A. 擁有用戶正在交互的 Activity(已調用 onResume())

    B. 擁有某個 Service,后者綁定到用戶正在交互的 Activity

    C. 擁有正在“前臺”運行的 Service(服務已調用 startForeground())

    D. 擁有正執行一個生命周期回調的 Service(onCreate()、onStart() 或 onDestroy())

    E. 擁有正執行其 onReceive() 方法的 BroadcastReceiver

    1.2. 可見進程 —— Visible process

    沒有任何前臺組件、但仍會影響用戶在屏幕上所見內容的進程。可見進程被視為是極其重要的進程,除非為了維持所有前臺進程同時運行而必須終止,否則系統不會終止這些進程。

    A. 擁有不在前臺、但仍對用戶可見的 Activity(已調用 onPause())。

    B. 擁有綁定到可見(或前臺)Activity 的 Service

    1.3. 服務進程 —— Service process

    盡管服務進程與用戶所見內容沒有直接關聯,但是它們通常在執行一些用戶關心的操作(例如,在后臺播放音樂或從網絡下載數據)。因此,除非內存不足以維持所有前臺進程和可見進程同時運行,否則系統會讓服務進程保持運行狀態。

    A. 正在運行 startService() 方法啟動的服務,且不屬于上述兩個更高類別進程的進程。

    1.4. 后臺進程 —— Background process

    后臺進程對用戶體驗沒有直接影響,系統可能隨時終止它們,以回收內存供前臺進程、可見進程或服務進程使用。 通常會有很多后臺進程在運行,因此它們會保存在 LRU 列表中,以確保包含用戶最近查看的 Activity 的進程最后一個被終止。如果某個 Activity 正確實現了生命周期方法,并保存了其當前狀態,則終止其進程不會對用戶體驗產生明顯影響,因為當用戶導航回該 Activity 時,Activity 會恢復其所有可見狀態。

    A. 對用戶不可見的 Activity 的進程(已調用 Activity的onStop() 方法)

    1.5. 空進程 —— Empty process

    保留這種進程的的唯一目的是用作緩存,以縮短下次在其中運行組件所需的啟動時間。 為使總體系統資源在進程緩存和底層內核緩存之間保持平衡,系統往往會終止這些進程。

    A. 不含任何活動應用組件的進程

    詳情參見:http://developer.android.com/intl/zh-cn/guide/components/processes-and-threads.html

    2. Android 進程回收策略

    Android 中對于內存的回收,主要依靠 Lowmemorykiller 來完成,是一種根據 OOM_ADJ 閾值級別觸發相應力度的內存回收的機制。

    關于 OOM_ADJ 的說明如下:

    其中紅色部分代表比較容易被殺死的 Android 進程(OOM_ADJ>=4),綠色部分表示不容易被殺死的 Android 進程,其他表示非 Android 進程(純 Linux 進程)。在 Lowmemorykiller 回收內存時會根據進程的級別優先殺死 OOM_ADJ 比較大的進程,對于優先級相同的進程則進一步受到進程所占內存和進程存活時間的影響。

    Android 手機中進程被殺死可能有如下情況:

    綜上,可以得出減少進程被殺死概率無非就是想辦法提高進程優先級,減少進程在內存不足等情況下被殺死的概率。

    3. 提升進程優先級的方案

    3.1. 利用 Activity 提升權限

    3.1.1. 方案設計思想

    監控手機鎖屏解鎖事件,在屏幕鎖屏時啟動1個像素的 Activity,在用戶解鎖時將 Activity 銷毀掉。注意該 Activity 需設計成用戶無感知。

    通過該方案,可以使進程的優先級在屏幕鎖屏時間由4提升為最高優先級1。

    3.1.2. 方案適用范圍

    適用場景: 本方案主要解決第三方應用及系統管理工具在檢測到鎖屏事件后一段時間(一般為5分鐘以內)內會殺死后臺進程,已達到省電的目的問題。

    適用版本: 適用于所有的 Android 版本。

    3.1.3. 方案具體實現

    首先定義 Activity,并設置 Activity 的大小為1像素:

    其次,從 AndroidManifest 中通過如下屬性,排除 Activity 在 RecentTask 中的顯示:

    最后,控制 Activity 為透明:

    Activity 啟動與銷毀時機的控制:

    3.2. 利用 Notification 提升權限

    3.2.1. 方案設計思想

    Android 中 Service 的優先級為4,通過 setForeground 接口可以將后臺 Service 設置為前臺 Service,使進程的優先級由4提升為2,從而使進程的優先級僅僅低于用戶當前正在交互的進程,與可見進程優先級一致,使進程被殺死的概率大大降低。

    3.2.2. 方案實現挑戰

    從 Android2.3 開始調用 setForeground 將后臺 Service 設置為前臺 Service 時,必須在系統的通知欄發送一條通知,也就是前臺 Service 與一條可見的通知時綁定在一起的。

    對于不需要常駐通知欄的應用來說,該方案雖好,但卻是用戶感知的,無法直接使用。

    3.2.3. 方案挑戰應對措施

    通過實現一個內部 Service,在 LiveService 和其內部 Service 中同時發送具有相同 ID 的 Notification,然后將內部 Service 結束掉。隨著內部 Service 的結束,Notification 將會消失,但系統優先級依然保持為2。

    3.2.4. 方案適用范圍

    適用于目前已知所有版本。

    3.2.5. 方案具體實現

    4. 進程死后拉活的方案

    4.1. 利用系統廣播拉活

    #####4.1.1. 方案設計思想

    在發生特定系統事件時,系統會發出響應的廣播,通過在 AndroidManifest 中“靜態”注冊對應的廣播監聽器,即可在發生響應事件時拉活。

    常用的用于拉活的廣播事件包括:

    4.1.2. 方案適用范圍

    適用于全部 Android 平臺。但存在如下幾個缺點:

    1) 廣播接收器被管理軟件、系統軟件通過“自啟管理”等功能禁用的場景無法接收到廣播,從而無法自啟。

    2) 系統廣播事件不可控,只能保證發生事件時拉活進程,但無法保證進程掛掉后立即拉活。

    因此,該方案主要作為備用手段。

    4.2. 利用第三方應用廣播拉活

    4.2.1. 方案設計思想

    該方案總的設計思想與接收系統廣播類似,不同的是該方案為接收第三方 Top 應用廣播。

    通過反編譯第三方 Top 應用,如:手機QQ、微信、支付寶、UC瀏覽器等,以及友盟、信鴿、個推等 SDK,找出它們外發的廣播,在應用中進行監聽,這樣當這些應用發出廣播時,就會將我們的應用拉活。

    4.2.2. 方案適用范圍

    該方案的有效程度除與系統廣播一樣的因素外,主要受如下因素限制:

    1) 反編譯分析過的第三方應用的多少

    2) 第三方應用的廣播屬于應用私有,當前版本中有效的廣播,在后續版本隨時就可能被移除或被改為不外發。

    這些因素都影響了拉活的效果。

    4.3. 利用系統Service機制拉活

    4.3.1. 方案設計思想

    將 Service 設置為 START_STICKY,利用系統機制在 Service 掛掉后自動拉活:

    4.3.2. 方案適用范圍

    如下兩種情況無法拉活:

  • Service 第一次被異常殺死后會在5秒內重啟,第二次被殺死會在10秒內重啟,第三次會在20秒內重啟,一旦在短時間內 Service 被殺死達到5次,則系統不再拉起。

  • 進程被取得 Root 權限的管理工具或系統工具通過 forestop 停止掉,無法重啟。

  • 4.4. 利用Native進程拉活

    #####4.4.1. 方案設計思想

    **主要思想:**利用 Linux 中的 fork 機制創建 Native 進程,在 Native 進程中監控主進程的存活,當主進程掛掉后,在 Native 進程中立即對主進程進行拉活。

    **主要原理:**在 Android 中所有進程和系統組件的生命周期受 ActivityManagerService 的統一管理。而且,通過 Linux 的 fork 機制創建的進程為純 Linux 進程,其生命周期不受 Android 的管理。

    #####4.4.2. 方案實現挑戰

    挑戰一:在 Native 進程中如何感知主進程死亡。

    要在 Native 進程中感知主進程是否存活有兩種實現方式:

  • 在 Native 進程中通過死循環或定時器,輪訓判斷主進程是否存活,檔主進程不存活時進行拉活。該方案的很大缺點是不停的輪詢執行判斷邏輯,非常耗電。

  • 在主進程中創建一個監控文件,并且在主進程中持有文件鎖。在拉活進程啟動后申請文件鎖將會被堵塞,一旦可以成功獲取到鎖,說明主進程掛掉,即可進行拉活。由于 Android 中的應用都運行于虛擬機之上,Java 層的文件鎖與 Linux 層的文件鎖是不同的,要實現該功能需要封裝 Linux 層的文件鎖供上層調用。

  • 封裝 Linux 文件鎖的代碼如下:

    Native 層中堵塞申請文件鎖的部分代碼:

    挑戰二:在 Native 進程中如何拉活主進程。

    通過 Native 進程拉活主進程的部分代碼如下,即通過 am 命令進行拉活。通過指定“–include-stopped-packages”參數來拉活主進程處于 forestop 狀態的情況。

    挑戰三:如何保證 Native 進程的唯一。

    從可擴展性和進程唯一等多方面考慮,將 Native 進程設計層 C/S 結構模式,主進程與 Native 進程通過 Localsocket 進行通信。在Native進程中利用 Localsocket 保證 Native 進程的唯一性,不至于出現創建多個 Native 進程以及 Native 進程變成僵尸進程等問題。

    4.4.3. 方案適用范圍

    該方案主要適用于 Android5.0 以下版本手機。

    該方案不受 forcestop 影響,被強制停止的應用依然可以被拉活,在 Android5.0 以下版本拉活效果非常好。

    對于 Android5.0 以上手機,系統雖然會將native進程內的所有進程都殺死,這里其實就是系統“依次”殺死進程時間與拉活邏輯執行時間賽跑的問題,如果可以跑的比系統邏輯快,依然可以有效拉起。記得網上有人做過實驗,該結論是成立的,在某些 Android 5.0 以上機型有效。

    4.5. 利用 JobScheduler 機制拉活

    4.5.1. 方案設計思想

    Android5.0 以后系統對 Native 進程等加強了管理,Native 拉活方式失效。系統在 Android5.0 以上版本提供了 JobScheduler 接口,系統會定時調用該進程以使應用進行一些邏輯操作。

    在本項目中,我對 JobScheduler 進行了進一步封裝,兼容 Android5.0 以下版本。封裝后 JobScheduler 接口的使用如下:

    4.5.2. 方案適用范圍

    該方案主要適用于 Android5.0 以上版本手機。

    該方案在 Android5.0 以上版本中不受 forcestop 影響,被強制停止的應用依然可以被拉活,在 Android5.0 以上版本拉活效果非常好。

    僅在小米手機可能會出現有時無法拉活的問題。

    4.6. 利用賬號同步機制拉活

    #####4.6.1. 方案設計思想

    Android 系統的賬號同步機制會定期同步賬號進行,該方案目的在于利用同步機制進行進程的拉活。添加賬號和設置同步周期的代碼如下:

    該方案需要在 AndroidManifest 中定義賬號授權與同步服務。

    ####4.6.2. 方案適用范圍

    該方案適用于所有的 Android 版本,包括被 forestop 掉的進程也可以進行拉活。

    最新 Android 版本(Android N)中系統好像對賬戶同步這里做了變動,該方法不再有效。

    5. 其他有效拉活方案

    經研究發現還有其他一些系統拉活措施可以使用,但在使用時需要用戶授權,用戶感知比較強烈。

    這些方案包括:

  • 利用系統通知管理權限進行拉活

  • 利用輔助功能拉活,將應用加入廠商或管理軟件白名單。

  • 這些方案需要結合具體產品特性來搞。

    上面所有解釋這些方案都是考慮的無 Root 的情況。

    其他還有一些技術之外的措施,比如說應用內 Push 通道的選擇:

  • 國外版應用:接入 Google 的 GCM。

  • 國內版應用:根據終端不同,在小米手機(包括 MIUI)接入小米推送、華為手機接入華為推送;其他手機可以考慮接入騰訊信鴿或極光推送與小米推送做 A/B Test。


  • 總結

    以上是生活随笔為你收集整理的Android进程保活招式大全的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    主站蜘蛛池模板: 国产精品一区二区三区久久久 | 久久女人网 | 可乐操亚洲 | 日本熟妇毛茸茸丰满 | 亚洲天堂成人网 | 91高跟黑色丝袜呻吟动态图 | 黄色片网站在线 | 国产欧美久久久久久 | 国产原创在线播放 | 中文字幕色图 | 一级性生活毛片 | 成人性生交生交视频 | 性感美女在线观看 | 97视频在线看 | 五月天婷婷激情网 | 欧美另类高清 | 中文字幕第九页 | 久久性生活视频 | a网址 | 男女视频网站 | 北条麻妃一二三区 | 91污片| 和漂亮岳做爰3中文字幕 | 91天天看 | 北条麻妃在线一区 | 狠狠操在线视频 | 亚洲欧美一区二区三区 | 另类小说亚洲色图 | 日美韩av| 自拍偷拍第1页 | 美女在线播放 | 国产专区在线播放 | 自拍偷拍亚洲视频 | 色优久久 | 亚洲精品国产一区 | 亚洲孕交 | 另类av小说 | 草草屁屁影院 | 欧美日韩资源 | 在线免费国产视频 | 日韩和一区二区 | 日韩一级免费看 | www插插插无码免费视频网站 | 日韩欧美视频免费在线观看 | 久久综合婷婷国产二区高清 | 人妻互换一区二区三区四区五区 | 在线观看视频中文字幕 | 一区二区三区欧美日韩 | 超碰在线免费观看97 | 二区三区视频 | 中文字幕精品国产 | 精品国内自产拍在线观看视频 | 熟女国产精品一区二区三 | 99国产精品久久久久 | 精品午夜视频 | 大奶子情人| jvid视频| 夜夜cao| 亚洲黄网站在线观看 | 少妇特黄a一区二区三区 | 日韩精品――色哟哟 | 99er热精品视频 | caoporn超碰97| 午夜啪视频 | 午夜精品久久久久久久第一页按摩 | 亚洲大片| 国产成人av一区二区三区不卡 | 日韩女优网站 | 亚洲 激情 | 欧美性生交xxxxx久久久缅北 | 都市激情一区 | 男生坤坤放进女生坤坤里 | 少妇太紧太爽又黄又硬又爽小说 | 极品销魂美女一区二区 | 国产高潮流白浆喷水视频 | 对白超刺激精彩粗话av | a级片免费视频 | 成人av电影在线播放 | 91天天 | 无码人妻精品一区二区三 | 伊人超碰 | 欧美高清 | 动漫玉足吸乳羞免费网站玉足 | 美女被揉胸视频 | 999这里有精品 | 亚洲男人天堂av | 在线视频观看一区 | 欧美日一区二区 | 激情久久视频 | 中文字幕日韩电影 | 中文字幕一区二区三区夫目前犯 | 婷婷狠狠操 | 亚洲视频一区在线观看 | 久久女 | 二级毛片 | 亚洲av无码国产精品永久一区 | 一区二区在线视频免费观看 | 亚洲热在线视频 | 日本不卡视频在线播放 |