乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      【轉】怎樣使一個Android應用不被殺死?(整理)

       techres 2012-02-13

      怎樣使一個Android應用不被殺死?(整理)

      (2011-12-02 18:50:54)
      標簽:

      it

      參考: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提升為系統(tǒng)核心級別,任何情況下不會被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            // 這個常數(shù)值為-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兩個標志,F(xiàn)LAG_SYSTEM指的是應用位于/system/app下,F(xiàn)LAG_PERSISTENT就是指persistent屬性。

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

      原理
      Android中的進程是托管的,當系統(tǒng)進程空間緊張的時候,會依照優(yōu)先級自動進行進程的回收。由此帶來三個問題:
          1) 回收規(guī)則:  什么時候回收與回收哪一個?
          2) 避免誤殺:  如何阻止被回收?
          3) 數(shù)據(jù)恢復與保存:  被回收了怎么辦?
       
      Android將進程分為6個等級,它們按優(yōu)先級順序由高到低依次是:
         1.前臺進程( FOREGROUND_APP)
         2.可視進程(VISIBLE_APP )
         3. 次要服務進程(SECONDARY_SERVER )
         4.后臺進程 (HIDDEN_APP)
         5.內容供應節(jié)點(CONTENT_PROVIDER)
         6.空進程(EMPTY_APP)
       
      特征:
      1.如果一個進程里面同時包含service和可視的activity,那么這個進程應該歸于可視進程,而不是service進程。
      2.另外,如果其他進程依賴于它的話,一個進程的等級可以提高。例如,一個A進程里的service被綁定到B進程里的組件上,進程A將總被認為至少和B進程一樣重要。
      3.系統(tǒng)中的phone服務被劃分到前臺進程而不是次要服務進程.
       
      在android中,進程的oom_adj值也就代表了它的優(yōu)先級。oom_adj值越高代表該進程優(yōu)先級越低。文件/init.rc中有以下屬性設置:
          setprop ro.FOREGROUND_APP_ADJ       0
          setprop ro.VISIBLE_APP_ADJ                     1
          setprop ro.SECONDARY_SERVER_ADJ   2
          setprop ro.HIDDEN_APP_MIN_ADJ           7
          setprop ro.CONTENT_PROVIDER_ADJ  14
          setprop ro.EMPTY_APP_ADJ                    15
      /init.rc中,將PID為1的進程(init進程)的oom_adj設置為SYSTEM_ADJ(-16)。

      查看本機設置:
      cat /sys/module/lowmemorykiller/parameters/adj
      0,1,2,7,14,15
       
      回收時機:
      文件/init.rc中:
         setprop ro.FOREGROUND_APP_MEM       1536      //    6M
         setprop ro.VISIBLE_APP_MEM                     2048     //    8M
         setprop ro.SECONDARY_SERVER_MEM   4096     //  16M
         setprop ro.HIDDEN_APP_MEM                     5120     //  20M
         setprop ro.CONTENT_PROVIDER_MEM    5632     //  22.4M
         setprop ro.EMPTY_APP_MEM                      6144     //  24M
      這些數(shù)字也就是對應的內存閾值,一旦低于該值,Android便開始按順序關閉相應等級的進程。
      注意這些數(shù)字的單位是page: 1 page = 4 kB。所以上面的六個數(shù)字對應的就是(MB): 6,8,16,20,22,24。
       
      查看現(xiàn)在的內存閾值設置:
      cat /sys/module/lowmemorykiller/parameters/minfree

      要想重新設置該值(對應不同的需求):
      echo   "1536,2048,4096,5120,15360,23040">/sys/module/lowmemorykiller/parameters/minfree
      這樣當可用內存低于90MB的時候便開始殺死"空進程",而當可用內存低于60MB的時候才開始殺死"內容供應節(jié)點"類進程。
       
      具體的回收實現(xiàn)在ActivityManagerService.java中的函數(shù)trimApplications():
         1.首先移除package已被卸載的無用進程;
         2.基于進程當前狀態(tài),更新oom_adj值,然后進行以下操作:
               1) 移除沒有activity在運行的進程;
               2) 如果AP已經(jīng)保存了所有的activity狀態(tài),結束這個AP。
         3. 最后,如果目前還是有很多activities 在運行,那么移除那些activity狀態(tài)已經(jīng)保存好的activity。
       

      更新oom_adj的值:
      在ActivityManagerService.java文件的ComputeOomAdjLocked() 中計算出進程的oom_adj,例如:
           if (app == TOP_APP) {
                  // The last app on the list is the foreground app.
                  adj = FOREGROUND_APP_ADJ;
                  app.adjType = "top-activity";
              }
       
      Android kernel中的low memory killer
      Android的Low Memory Killer根據(jù)需要(當系統(tǒng)內存短缺時)殺死進程釋放其內存,源代碼在kernel/drivers/misc/lowmemorykiller.c中。簡單說,就是尋找一個最合適的進程殺死,從而釋放它占用的內存。
      最合適的進程是:
           oom_adj越大
           占用物理內存越多
       
      一旦一個進程被選中,內核會發(fā)送SIGKILL信號將之殺死:
         for_each_process(p) {
              ……
              if(selected == NULL ||   p->oomkilladj > selected->oomkilladj ||
                    (p->oomkilladj == selected->oomkilladj && tasksize > selected_tasksize))
              {
                   selected = p;
              }
         }
         if(selected != NULL) {
              force_sig(SIGKILL, selected);
         }
       
      查看LRU列表:adb shell dumpsys activity
      當activitydemo在前臺時: 
      包含Service的進程的優(yōu)先級比較高,在computeOomAdjLocked中將其分為了兩小類:
            static final int MAX_SERVICE_INACTIVITY = 30*60*1000;                 
            if (now < (s.lastActivity+MAX_SERVICE_INACTIVITY)) {
                     if (adj > SECONDARY_SERVER_ADJ) {
                                  adj = SECONDARY_SERVER_ADJ;
                                  app.adjType = "started-services";
                                  app.hidden = false;
                     }
            }
            if (adj > SECONDARY_SERVER_ADJ) {
                              app.adjType = "started-bg-services";
            }
       

      完全讓進程不被kill是不可能的,我們可以通過一些操作,使進程被kill的幾率變?。?br>   1) 提高進程的優(yōu)先級:
              * 后臺操作采用Service形式,因為一個運行著service的進程比一個運行著后臺activity的等級高;
              * 按back鍵使得進程中的activity在后臺運行而不是destory,需重載back按鍵(沒有任何activity在運行的進程優(yōu)先被殺).
              * 依賴于其他優(yōu)先級高的進程;

        2) 強制修改進程屬性:
              * 在進程中設置:setPersistent(true);
              * 在Manifest文件中設置(如上)。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多