Android應用程式防止被LMK乾掉

2021-08-27 19:57:18 字數 2284 閱讀 3189

二、調查:

[quote]

android 系統對於記憶體管理有自己的一套方法,為了保障系統有序穩定的運信,系統內部會自動分配,控制程式的記憶體使用。當系統覺得當前的資源非常有限的時候,為了保 證一些優先順序高的程式能執行,就會殺掉一些他認為不重要的程式或者服務來釋放記憶體。這樣就能保證真正對使用者有用的程式仍然再執行。如果你的 service 碰上了這種情況,多半會先被殺掉。但如果你增加 service 的優先順序就能讓他多留一會,我們可以用 setforeground(true) 來設定 service 的優先順序。

為什麼是 foreground ? 預設啟動的 service 是被標記為 background,當前執行的 activity 一般被標記為 foreground,也就是說你給 service 設定了 foreground 那麼他就和正在執行的 activity 類似優先順序得到了一定的提高。當讓這並不能保證你得 service 永遠不被殺掉,只是提高了他的優先順序。

有乙個方法可以給你更清晰的演示,進入 $sdk/tools 執行命令

**:# adb shell dumpsys activity|grep oom_adj

running norm proc # 6: oom_adj= 0 processrecord

running norm proc # 5: oom_adj= 7 processrecord

running norm proc # 4: oom_adj= 8 processrecord

running pers proc # 1: oom_adj=-12 processrecord

running pers proc # 0: oom_adj=-100 processrecord

返 回的一大堆東西,觀察 oom_adj 的值,如果是大於 8 一般就是屬於 backgroud 隨時可能被乾掉,數值越小證明優先順序越高,被乾掉的時間越晚。你看phone的程式是 -12 說明**就是**,其他什麼都幹了了,也的能接**對吧。另外還有乙個 -100 的,更邪乎因為是 system 如果他也完蛋了,你得系統也就掛了,嘿嘿。

[/quote]

[quote]

除了一般的幾種優先順序外,還存在著coreserver,system這樣的永遠不會被lmk**的優先順序。系統中的**應用就是coreserver優先順序的。

通過檢視源**可以知道,只有應用程式的flag同時為flag_system和flag_persistent時,才會被設定為coreserver優先順序

}通過dumpsys activity命令能夠很明顯的看出其中差別。

running processes (most recent first):

pers # 2: adj=-100/0 processrecord (fixed)

pers # 0: adj= -12/0 processrecord (fixed)

而且adj=-12時,這個程序通過ddms手動stop後會立即啟動

[/quote]

三、解決方案:

綜上我們可以得到下面的結論:

關於提高android程式service優先順序的實踐

方法一:在service的ondestroy中重啟service;這種方法不可行,因為service被kill掉時根本不執行ondestroy方法;

方法二:onstartcommand(intent,int,int)方法中更改flags為start_sticky

[quote]

每次呼叫startservice(intent)的時候,都會呼叫該service物件的onstartcommand(intent,int,int)方法,這個方法return 乙個int值,return 的值有四種:

start_sticky:如果service程序被kill掉,保留service的狀態為開始狀態,但不保留遞送的intent物件。隨後系統會嘗試重新建立service,由於服務狀態為開始狀態,所以建立服務後一定會呼叫onstartcommand(intent,int,int)方法。如果在此期間沒有任何啟動命令被傳遞到service,那麼引數intent將為null。

start_not_sticky:「非粘性的」。使用這個返回值時,如果在執行完onstartcommand後,服務被異常kill掉,系統不會自動重啟該服務。

start_redeliver_intent:重傳intent。使用這個返回值時,如果在執行完onstartcommand後,服務被異常kill掉,系統會自動重啟該服務,並將intent的值傳入。

start_sticky_compatibility:start_sticky的相容版本,但不保證服務被kill後一定能重啟。

[/quote]

如何防止應用程式洩密?

黑客或攻擊者總能找到一些可以利用的媒介或要素。例如,員工越來越多地在工作場合使用移動裝置,各種應用商店提供了五花八門的移動應用。由於這些應用的源頭不一,質量參差不齊,所以普通使用者很難判斷哪些是最新的,更難以判斷其是否有惡意目的。黑客深諳此道,因而可以設計一些看似善意的功能強大的應用,其中卻可能包含...

防止應用程式被網路操作失敗卡死的演算法

在某個同事留下的網路操作 中,如果使用者試圖從網路開啟乙個實際並不存在的url,走到internetopenurl這步,應用程式就一命嗚呼了。這個api並沒有按照文件上說的那樣返回乙個null給檔案handle,而是完全停止 響應。他嘗試使用internetsetoption來設定超時的時限,裡這樣...

Android應用程式簽名

android系統要求所有的程式經過數字簽名才能安裝,如果沒有可用的數字簽名,系統將不許安裝執行此程式,不管是模擬器還是真實手機。因此,在裝置或者是模擬器上執行除錯程式之前,必須為應用程式設定數字簽名。android 系統僅僅會在安裝的時候測試簽名證書的有效期,如果應用程式的簽名是在安裝之後才到期,...