怎樣使一個Android應用不被殺死?

參考:http://blog.csdn.net/windskier/article/details/6560925
http://blog.csdn.net/zmyde2010/article/details/6756368
http://blog.sina.com.cn/s/blog_514048cb0100wi2j.html

方法
對於放在/system/app下的應用,需要在其Manifest.xml文件中設置persistent屬性,如應用程序'Phone'的AndroidManifest.xml文件:
    <application android:name="PhoneApp"
                android:persistent="true"
                 android:label="@string/dialerIconLabel"
                 android:icon="@drawable/ic_launcher_phone">
         ...
    </application>
設置後app提升爲系統核心級別,任何情況下不會被kill掉, settings->applications裏面也會屏蔽掉stop操作。

這樣
設置前的log:   Proc #19: adj=svc  /B 4067b028 255:com.xxx.xxx/10001 (started-services)
    # cat /proc/255/oom_adj
    4
設置後的log:  PERS #19: adj=core /F 406291f0 155:com.xxx.xxx/10001 (fixed)
    # cat /proc/155/oom_adj
     -12                # 這是CORE_SERVER_ADJ
注:init進程的oom_adj爲-16(即SYSTEM_ADJ): cat  /proc/1/oom_adj

在文件frameworks/base/services/java/com/android/server/am/ActivityManagerService.java中有以下的代碼:
    final ProcessRecord addAppLocked(ApplicationInfo info) {
        ProcessRecord app = getProcessRecordLocked(info.processName, info.uid);

        if (app == null) {
            app = newProcessRecordLocked(null, info, null);
            mProcessNames.put(info.processName, info.uid, app);
            updateLruProcessLocked(app, true, true);
        }    

        if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
                == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
            app.persistent = true;
            app.maxAdj = CORE_SERVER_ADJ;             // 這個常數值爲-12。
        }    
        if (app.thread == null && mPersistentStartingProcesses.indexOf(app) < 0) {
            mPersistentStartingProcesses.add(app);
            startProcessLocked(app, "added application", app.processName);
        }    

        return app;
    }

可見要想成爲core service (即app.maxAdj = CORE_SERVER_ADJ(-12)),應用程序需要FLAG_SYSTEM和FLAG_PERSISTENT兩個標誌,FLAG_SYSTEM指的是應用位於/system/app下,FLAG_PERSISTENT就是指persistent屬性。

而對於frameworks/base/services/java/com/android/server/SystemServer.java,則調用
       ActivityManagerService.setSystemProcess();
把自己的 app.maxAdj 設置成SYSTEM_ADJ,即-16。

原理
Android中的進程是託管的,當系統進程空間緊張的時候,會依照優先級自動進行進程的回收。由此帶來三個問題:
    1)回收規則:  什麼時候回收與回收哪一個?
  
發佈了1 篇原創文章 · 獲贊 0 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章