通過這兩篇文章
http://topic.csdn.net/u/20110312/11/62e21a94-195b-48c8-85d3-ea2689ed693f.html?seed=582570045&r=72861243#r_72861243
http://blog.sina.com.cn/s/blog_4d66a3cb0100prfe.html
總算實現了目標。通過在androidmanifest.xml中的application標簽中加入android:persistent="true" 屬性后的確就能夠達到保證該應用程序所在進程不會被LMK殺死。但有個前提就是應用程序必須是系統應用,也就是說應用程序不能采用通常的安裝方式。必須將應用程序的apk包直接放到/system/app目錄下。而且必須重啟系統后才能生效。
除了一般的幾種優先級外,還存在着coreserver,system這樣的永遠不會被LMK回收的優先級。系統中的電話應用就是coreserver優先級的。
通過查看源代碼可以知道,只有應用程序的flag同時為FLAG_SYSTEM和FLAG_PERSISTENT時,才會被設置為coreserver優先級
if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
app.persistent = true;
app.maxAdj = CORE_SERVER_ADJ;
}
FLAG_SYSTEM在應用程序apk放在/system/app下時會被設置。所以才會出現只設置android:persistent="true"仍然會被殺死的情況。
測試時發現,將應用程序放到/system/app后不重啟系統,仍然會被識別為普通的進程。當系統重新啟動時,會在一開始就啟動該進程並把它優先級設置為coreserver。
通過dumpsys activity命令能夠很明顯的看出其中差別。
Running processes (most recent first):
App # 3: adj= 2/1 ProcessRecord{30858c20 1877:com.android.email/10014} (started-services)
PERS # 2: adj=-100/0 ProcessRecord{308fb390 1713:system/1000} (fixed)
App # 1: adj= 0/0 ProcessRecord{30908198 1794:android.process.acore/10005} (top-activity)
PERS # 0: adj= -12/0 ProcessRecord{3090d488 1789:xiao.xiong.test/10026} (fixed)
而且adj=-12時,這個進程通過ddms手動stop后會立即啟動
