æ¹æ³ï¼
对äºä¸ä¸ªserviceï¼å¯ä»¥é¦å
æå®è®¾ä¸ºå¨åå°è¿è¡ï¼
public void MyService.onCreate() {
super.onCreate();
Notification notification = new Notification(android.R.drawable.my_service_icon,
"my_service_name",
System.currentTimeMillis());
PendingIntent p_intent = PendingIntent.getActivity(this, 0,
new Intent(this, MyMainActivity.class), 0);
notification.setLatestEventInfo(this, "MyServiceNotification, "MyServiceNotification is Running!", p_intent);
Log.d(TAG, String.format("notification = %s", notification));
startForeground(0x1982, notification); // notification ID: 0x1982, you can name it as you will.
}
éè¦è®¾ç½®-------------------------------
ç¸è¾äº/data/appä¸çåºç¨ï¼æ¾å¨/system/appä¸çåºç¨äº«åæ´å¤çç¹æï¼æ¯å¦è¥å¨å
¶Manifest.xmlæ件ä¸è®¾ç½®persistentå±æ§ä¸ºtrueï¼åå¯ä½¿å
¶å
åout-of-memory killerçå½±åãå¦åºç¨ç¨åº'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
设置åç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
Androidç¸å
³é¨ååæï¼
å¨æ件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ï¼ åæ¶è§å: ä»ä¹æ¶ååæ¶ä¸åæ¶åªä¸ä¸ªï¼
2ï¼ é¿å
误æ: å¦ä½é»æ¢è¢«åæ¶ï¼
3ï¼ æ°æ®æ¢å¤ä¸ä¿å: 被åæ¶äºæä¹åï¼
Androidå°è¿ç¨å为6个ç级,å®ä»¬æä¼å
级顺åºç±é«å°ä½ä¾æ¬¡æ¯:
1.åå°è¿ç¨( FOREGROUND_APP)
2.å¯è§è¿ç¨(VISIBLE_APP )
3. 次è¦æå¡è¿ç¨(SECONDARY_SERVER )
4.åå°è¿ç¨ (HIDDEN_APP)
5.å
容ä¾åºèç¹(CONTENT_PROVIDER)
6.空è¿ç¨(EMPTY_APP)
ç¹å¾ï¼
1.å¦æä¸ä¸ªè¿ç¨éé¢åæ¶å
å«serviceåå¯è§çactivityï¼é£ä¹è¿ä¸ªè¿ç¨åºè¯¥å½äºå¯è§è¿ç¨ï¼èä¸æ¯serviceè¿ç¨ã
2.å¦å¤ï¼å¦æå
¶ä»è¿ç¨ä¾èµäºå®çè¯ï¼ä¸ä¸ªè¿ç¨çç级å¯ä»¥æé«ãä¾å¦ï¼ä¸ä¸ªAè¿ç¨éçservice被ç»å®å°Bè¿ç¨éçç»ä»¶ä¸ï¼è¿ç¨Aå°æ»è¢«è®¤ä¸ºè³å°åBè¿ç¨ä¸æ ·éè¦ã
3.ç³»ç»ä¸çphoneæå¡è¢«ååå°åå°è¿ç¨èä¸æ¯æ¬¡è¦æå¡è¿ç¨.
å¨androidä¸ï¼è¿ç¨çoom_adjå¼ä¹å°±ä»£è¡¨äºå®çä¼å
级ãoom_adjå¼è¶é«ä»£è¡¨è¯¥è¿ç¨ä¼å
级è¶ä½ãæ件/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):
# Set init its forked children's oom_adj.
write /proc/1/oom_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
è¿äºæ°åä¹å°±æ¯å¯¹åºçå
åéå¼ï¼ä¸æ¦ä½äºè¯¥å¼ï¼Android便å¼å§æ顺åºå
³éç¸åºç级çè¿ç¨ã
注æè¿äºæ°åçåä½æ¯pageï¼ 1 page = 4 kBãæ以ä¸é¢çå
个æ°å对åºçå°±æ¯(MB): 6,8,16,20,22,24ã
æ¥çç°å¨çå
åéå¼è®¾ç½®ï¼
cat /sys/module/lowmemorykiller/parameters/minfree
è¦æ³éæ°è®¾ç½®è¯¥å¼ï¼å¯¹åºä¸åçéæ±ï¼:
echo "1536,2048,4096,5120,15360,23040">/sys/module/lowmemorykiller/parameters/minfree
è¿æ ·å½å¯ç¨å
åä½äº90MBçæ¶å便å¼å§ææ»"空è¿ç¨"ï¼èå½å¯ç¨å
åä½äº60MBçæ¶åæå¼å§ææ»"å
容ä¾åºèç¹"ç±»è¿ç¨ã
å
·ä½çåæ¶å®ç°å¨ActivityManagerService.javaä¸çå½æ°trimApplications()ï¼
1.é¦å
移é¤package已被å¸è½½çæ ç¨è¿ç¨ï¼
2.åºäºè¿ç¨å½åç¶æï¼æ´æ°oom_adjå¼ï¼ç¶åè¿è¡ä»¥ä¸æä½ï¼
1) 移é¤æ²¡æactivityå¨è¿è¡çè¿ç¨;
2) å¦æAPå·²ç»ä¿åäºææçactivityç¶æï¼ç»æè¿ä¸ªAPã
3. æåï¼å¦æç®åè¿æ¯æå¾å¤activities å¨è¿è¡ï¼é£ä¹ç§»é¤é£äºactivityç¶æå·²ç»ä¿å好ç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æ ¹æ®éè¦ï¼å½ç³»ç»å
åç缺æ¶ï¼ææ»è¿ç¨éæ¾å
¶å
åï¼æºä»£ç å¨kernel/drivers/misc/lowmemorykiller.cä¸ãç®å说ï¼å°±æ¯å¯»æ¾ä¸ä¸ªæåéçè¿ç¨ææ»ï¼ä»èéæ¾å®å ç¨çå
åã
æåéçè¿ç¨æ¯:
• oom_adjè¶å¤§
• å ç¨ç©çå
åè¶å¤
ä¸æ¦ä¸ä¸ªè¿ç¨è¢«éä¸ï¼å
æ ¸ä¼åé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çè¿ç¨çä¼å
级æ¯è¾é«ï¼å¨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çå çåå°ï¼
1) æé«è¿ç¨çä¼å
级:
* åå°æä½éç¨è¿è¡äºåå°çServiceå½¢å¼ï¼å 为ä¸ä¸ªè¿è¡çserviceçè¿ç¨æ¯ä¸ä¸ªè¿è¡çåå°activityçç级é«ï¼
* æbacké®ä½¿å¾è¿ç¨ä¸çactivityå¨åå°è¿è¡èä¸æ¯destoryï¼ééè½½backæé®(没æä»»ä½activityå¨è¿è¡çè¿ç¨ä¼å
被æ).
* ä¾èµäºå
¶ä»ä¼å
级é«çè¿ç¨ï¼
2) 强å¶ä¿®æ¹è¿ç¨å±æ§ï¼
* å¨è¿ç¨ä¸è®¾ç½®ï¼setPersistent(true);
* å¨Manifestæ件ä¸è®¾ç½®ï¼å¦ä¸ï¼ã
温馨提示:答案为网友推荐,仅供参考