Android platform App priyoridad ng proseso

Android Platform App Process Priority



Alam nating lahat na maraming mga app ang maaaring mai-install sa mga Android phone, at ang bawat app ay mayroong kahit isang proseso. Ang paglikha ng isang proseso ay isang mahirap at masinsinang gawain. Upang mas mabilis ang pagsisimula ng Android, i-cache ng Android ang proseso ng app na hindi ginagamit nang ilang sandali, ngunit limitado ang memorya. Hindi pinapayagan na ilagay ang lahat ng mga proseso. Sa memorya, ang Android ay may mekanismo ng pag-aalis, na magtatakda ng priyoridad ng isang proseso (oom_adj) alinsunod sa tumatakbo na estado ng app, at pagkatapos ay papatayin ang mga proseso na may mababang priyoridad (malaking halaga ng oom_adj) ayon sa pag-igting ng memorya . Upang matiyak na ang iba pang mga proseso ay maaaring magkaroon ng sapat na paggamit ng memorya.

proseso

  1. Proseso ng Zygote
    Ito ang pangunahing proseso ng balangkas ng Android. Ang lahat ng mga proseso ng App at proseso ng serbisyo sa system Ang SystemServer ay nabuo ng proseso ng Zygote na Fork.
  2. Ang pangunahing proseso ng app
    Ang bawat app ay pinapatakbo sa isang hiwalay na proseso. Ang pangalan ng proseso ay ang pangalan ng package ng app. Ang mga prosesong ito ay nagmula sa proseso ng Zygote Fork at pinamamahalaan ng AMS (ActivityManagerService).
  3. Proseso ng pandiwang pantulong ng App
    maaaring payagan ang app na magkaroon ng maraming proseso. I-configure ang android: proseso ng katangian sa AndroidManifest.xml upang buksan ang maraming proseso. Ang mga pangalan ng proseso na ito ay packagename: pangalan upang makilala Aling app, sa pangkalahatan ay tinawag ko itong isang proseso ng helper. Ngunit ang mga prosesong ito ay kapareho rin ng pangunahing proseso, ngunit din mula sa proseso ng Zygote na Fork, at pinamamahalaan ng AMS.
  4. Katutubong proseso
    Ang Android maliban sa Java, at NDK, maaari mong gamitin ang C / C + + upang paunlarin, at pagkatapos ay maaari din itong proseso ng Fork, sa pangkalahatan ay tinawag kong Native na proseso, ang Native na proseso ay maaaring malaya mula sa AMS Management, ang kalayaan ay napakalaki, ang artikulong ito ay hindi kausap sa pansamantala

prayoridad

Ang priyoridad ng proseso ng app ay com.android.server.am.ProcessList Tukuyin sa loob ng klase, ang klase na ito ay hindi matagpuan sa Android API, upang makita ang pagpapatupad sa loob ay maaaring pumunta sa Android SDK upang mahanap, matatagpuan ${android-sdk-path}sourcesandroid-23comandroidserveramProcessList.java



Pangunahin ang maraming mga priyoridad (mga halaga ng oom_adj):



  • UNKNOWN_ADJ = 16
    Ang pinakamababang antas na nakareserba, karaniwang posible para sa naka-cache na proseso na maitakda sa antas na ito.

Ginamit ang pagsasaayos sa ilang mga lugar kung saan hindi pa namin alam ito. (Pangkalahatan ito ay isang bagay na mai-cache, ngunit hindi namin alam ang eksaktong halaga sa naka-cache na saklaw upang italaga.)



  • CACHED_APP_MAX_ADJ = 15
    ang proseso ng cache, walang laman na proseso, papatayin muna sakaling walang sapat na memorya

Ito ay isang proseso lamang sa mga aktibidad sa pagho-host na hindi nakikita, kaya maaari itong pumatay nang walang anumang pagkagambala.

  • CACHED_APP_MIN_ADJ = 9
    proseso ng cache, na kung saan ay isang walang laman na proseso
  • SERVICE_B_ADJ = 8
    hindi aktibong proseso

Ang listahan ng B ng SERVICE_ADJ - ito ang mga luma at malungkot na serbisyo na hindi kasing makintab at kawili-wili tulad ng nasa listahan ng A.

  • PREVIOUS_APP_ADJ = 7
    proseso ng paglipat

Ito ang proseso ng nakaraang aplikasyon kung saan naroon ang gumagamit. Ang prosesong ito ay itinatago sa itaas ng iba pang mga bagay, sapagkat napakakaraniwan na bumalik sa nakaraang app. Ito ay mahalaga kapwa para sa kamakailang paglipat ng gawain (pag-toggle sa pagitan ng dalawang nangungunang mga kamakailang app) pati na rin ang normal na daloy ng UI tulad ng pag-click sa isang URI sa e-mail app upang tingnan ang browser, at pagkatapos ay pindutin ang bumalik upang bumalik sa e- mail



  • HOME_APP_ADJ = 6
    Proseso na nakikipag-ugnay sa Home

Ito ay isang proseso na humahawak sa application ng bahay - nais naming subukang iwasan ang pagpatay dito, kahit na normal ito ay nasa background, sapagkat ang gumagamit ay nakikipag-ugnay dito nang labis.

  • SERVICE_ADJ = 5
    Iproseso sa Serbisyo

Ito ay isang proseso na humahawak sa isang serbisyo sa aplikasyon - ang pagpatay dito ay hindi magkakaroon ng malaking epekto hanggang sa mag-alala ang gumagamit.

  • HEAVY_WEIGHT_APP_ADJ = 4
    proseso ng mataas na timbang

Ito ay isang proseso sa isang mabibigat na application na aplikasyon. Nasa likuran ito, ngunit nais naming subukang iwasan itong patayin. Nakatakda ang halaga sa system / rootdir / init.rc sa pagsisimula.

  • BACKUP_APP_ADJ = 3
    Ang proseso ay nai-back up

Ito ay isang proseso na kasalukuyang nagho-host ng isang backup na operasyon. Ang pagpatay dito ay hindi ganap na nakamamatay ngunit sa pangkalahatan ay isang masamang ideya.

  • PERCEPTIBLE_APP_ADJ = 2
    Isang napapansin na proseso, tulad ng pagtugtog ng musika

Ito ay isang proseso na nagho-host lamang ng mga bahagi na napapansin ng gumagamit, at nais talaga naming iwasan ang pagpatay sa kanila, ngunit hindi kaagad ito nakikita. Ang isang halimbawa ay pag-playback ng musika sa background.

  • VISIBLE_APP_ADJ = 1
    nakikitang proseso

Ito ay isang proseso na nagho-host lamang ng mga aktibidad na nakikita ng gumagamit, kaya mas gugustuhin naming hindi sila mawala.

  • FOREGROUND_APP_ADJ = 0
    proseso sa harapan

Ito ang proseso na nagpapatakbo ng kasalukuyang foreground app. Mas pipiliin talaga naming hindi ito patayin!

  • PERSISTENT_SERVICE_ADJ = -11
    mahalagang proseso

Ito ay isang proseso na nakakonekta sa system o isang paulit-ulit na proseso, at ipinahiwatig na ito ay mahalaga.

  • PERSISTENT_PROC_ADJ = -12
    pangunahing proseso

Ito ay isang nagpapatuloy na proseso ng system, tulad ng telephony. Tiyak na ayaw itong patayin, ngunit ang paggawa nito ay hindi ganap na nakamamatay.

  • SYSTEM_ADJ = -16
    proseso ng system

Tumatakbo ang proseso ng system sa default na pagsasaayos.

  • NATIVE_ADJ = -17
    Ang katutubong proseso mula sa system

Espesyal na code para sa mga katutubong proseso na hindi pinamamahalaan ng system (kaya't huwag magkaroon ng isang oom adj na itinalaga ng system).

Ang walang laman na proseso sa Android-18 at sa ibaba ay hindi tinatawag na CACHED_APP_MIN_ADJ, na tinatawag na HIDDEN_APP_MIN_ADJ, mayroong isang pagkakaiba, ngunit ang mga halaga ay pareho.

Paano tingnan ang priyoridad ng proseso ng app

Para sa proseso ng App, dahil sa pamamahala ng AMS, magkakaroon ng isang file na oom_adj na nagtatala ng halaga ng oom_adj, ngunit para sa prosesong Katutubo, hindi mapamahalaan ito ng AMS.

// The value of oom_adj is the priority of the process. / / View oom_adj value cat /proc/${pid}/oom_adj

Mekanismo ng Lowmemorykiller

Ang mekanismong ito ay nasa goldpis Sa antas, kung nais mong malaman nang eksakto kung paano pipiliin ang proseso ng pagpatay, kailangan mong makita Lowmemorykiller.c code sa ilalim ng mga driver ng Android .

Ang mga nag-ipon ng goldpis ay dapat malaman na ito ay talagang isang kernel ng Linux. Dahil ang Android ay isang operating system na nakabatay sa Linux, ang kernel ay talagang sumusunod sa Linux kernel, ngunit may isang bagay na kailangang paunlarin (o streamline) para sa Android. Ang Lowmemorykiller ay bahagi nito, ito ay isang driver. Tulad ng para sa ilalagay drivers/staging Sa ilalim ng direktoryo, maaari kang mag-refer sa susunod na artikulo. 'Maliit na puno ng pagtatanghal ng Linux'

Mayroong ilang mga pangunahing puntos:

  1. Irehistro ang callback ng lowmem_shrinker sa system, at tawagan ito kapag ang system ay walang sapat na libreng memorya.
  2. Patayin natin ang antas ng proseso, tinatawag kong diskarte.
  3. Ang diskarte sa pagpatay ay tinukoy ng layer ng application alinsunod sa katayuan ng memorya, at ang file na magsulat ay naipasa sa driver.
  4. Kalkulahin ang min_score_adj batay sa diskarte
  5. Ang bawat proseso ng App ay may halaga na oom_adj, at ang oom_score_adj (halaga ng puntos) ay kinakalkula ayon sa halaga ng oom_adj. Ang mas malaki ang oom_adj ay, mas mataas ang oom_score_adj, at mas mataas ang min_score_adj ay kasama sa listahan ng kamatayan.
  6. Pumili ng isa sa pinakamahal na proseso sa listahan ng kamatayan upang pumatay

Samakatuwid, kapag ang memorya ay hindi sapat, ang priyoridad ng proseso ay mas mababa (mas malaki ang oom_adj), at ang proseso ng app na tumatagal ng memorya ay papatayin muna.

Tulad ng para sa diskarteng ito, ang bawat ROM ay maaaring hindi pantay, ayon sa laki ng memorya, ang pagiging mahigpit ng system, ngunit maaari lamang nahahati sa 6 na antas.


718073-ba0190d497cb5d26.pngTingnan ang file ng patakaran na naipasa sa driver ng lowmemorykiller

Minfree: Naglista ng 6 na mga threshold ng memorya.
Halimbawa: 32768, 61440, 73728, 129024, 147456, 184320
adj: Inililista ang mga antas ng 6 oom_adj.
Halimbawa: 0,1,2,3,9,15
Ang dalawang halagang ito ay tumutugma sa bawat isa. Kapag ang dami ng libreng memorya ay mas mababa kaysa doon, ang proseso sa antas na iyon ay papatayin.

718073-8d5bac28f27e9b69.pngAng mga parameter ng patakaran na tinukoy sa ProcessList.java

Siyempre, ang ilang mga ROM ay tutukuyin din ang parameter na ito sa init.rc, at pagkatapos ay isulat ang minfree at pag-aayos ng mga file sa driver pagkatapos ng pag-boot.

mekanismo ng trimApplications

Patayin lamang ang proseso na may mababang memorya lamang? Malinaw na hindi, maraming mga sitwasyon para sa pagpapatakbo ng App, tulad ng Crash, App Exit, System Cleanup, Uninstall.

Ang trimApplications ay isang pamamaraan, na tinukoy sa ActivityManagerService, walang ganoong klase sa Android API, kailangan mong pumunta sa loob ng SDK, matatagpuan ${android-sdk-path}sourcesandroid-23comandroidserveramActivityManagerService.java

Ang mekanismong ito ay marahil ay may ilang mga pangunahing punto:

  1. Ang walang silbi na proseso na na-uninstall ang package ay papatayin
  2. Mapangangalagaan ang mga paulit-ulit na app, ang priyoridad ng proseso ay nakatakda sa PERSISTENT_PROC_ADJ = -12
  3. Ang app na tumatakbo lamang sa pangunahing proseso ay isasaalang-alang na isang proseso ng mataas na timbang, HEAVY_WEIGHT_APP_ADJ = 4
  4. Ang proseso lang sa harapan ang FOREGROUND_APP_ADJ = 0, ang proseso sa harapan ay hindi papatayin
  5. Kailan man magbabago ang siklo ng buhay ng Aktibidad, Serbisyo, atbp, magdudulot ito ng pagsasaayos ng proseso oo_adj.
  6. Walang aktibidad sa proseso, ang pagkakaroon ng aktibidad ay pinapatay muna.
  7. Ang mga walang laman na proseso ay ang pinakamadaling pumatay

Paano mapapabuti ang priyoridad ng proseso ng background app

Sa katunayan, ang ideya ng balangkas ng Android ay napakahusay. Para sa walang laman na proseso, ang proseso na walang kinalaman ay direktang papatayin. Hindi ito makakaapekto sa karanasan ng gumagamit, ngunit madalas ang aming app ay magkakaroon ng pagpapaandar na ito, na kung saan ang GCM (Google Cloud Messaging) ay hindi maaaring gamitin sa China, kaya sa maraming mga kaso inaasahan din namin na hindi mapatay ang app kapag nasa likuran ito.

Isaalang-alang ang pagtaas ng priyoridad ng proseso ng background ng App. Narito ang ilang mga paraan:

  • I-configure ang paulit-ulit na katangian sa AndroidManifest.xml
|_+_|
  • Sobra ang kaganapan sa back button, hayaan ang aktibidad na tumakbo sa background, huwag tanggalin
  • Buksan ang Serbisyo at itakda ang foreground mode
  • Makipag-ugnay sa NotificationManager upang gawing isang kapansin-pansin na proseso ang proseso
  • Magpadala / makatanggap ng mga pag-broadcast, huwag hayaan ang iyong sarili na maging isang walang laman na proseso

Malinaw na gugugol ito ng higit na lakas, at ito ay magiging medyo nauulaw. Ang ilan sa mga kinakailangan ay maaaring hindi magawa.