ANDROID使程序进程不被LMK杀死

通过设置AndroidManifest.xml中的application标签属性android:persistent=true,可以使应用程序所在进程变为持久化进程,避免被LMK机制清理。但需注意的是,此设置仅对置于/system/app目录下的系统应用有效,并且在系统重启后生效。

通过这两篇文章
http://topic.youkuaiyun.com/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后会立即启动


<think>我们正在讨论Android系统中的低内存终止守护进程LMK)。用户的问题是:LMK进程进程重启的原因及解决方法。根据提供的引用材料,我们可以分析如下: 原因分析: 1. 进程被设计为自动重启:某些应用(如服务、后台任务关键型应用)可能被设计为在被杀死后自动重启,以维持其功能(引用[3]提到“开俩个进程相互唤起”)。 2. 系统机制:引用[3]提到了一种策略,即两个进程相互唤醒,当一个被杀死时,另一个会立即重启它。但这种方法在Android 8.0以上受到限制。 3. 进程优先级调整当:如果应用的进程优先级(adj值)设置当,可能导致其容易被LMK杀死,而应用又尝试重启(引用[4]提到可以通过调整oom_adj来缓解)。 4. 内存管理机制:当LMK杀死进程后,如果应用没有正确释放资源,或者应用的设计要求它持续运行,那么它可能会被重新启动(引用[2]提到在内存足时系统会先通知应用减少内存分配,最后才进程)。 解决方法: 1. 优化应用内存使用:减少内存占用,使应用易被LMK杀死(引用[4]建议减少应用各层级的内存占用,并帮助内存释放)。 2. 调整进程优先级:根据引用[4],可以通过设置应用进程的oom_adj为更低的值(即提高优先级)来降低被杀死的概率。但要注意,对于普通应用开发者,可能无法直接修改底层参数。 3. 使用前台服务:对于需要长期运行的后台任务,使用前台服务并显示通知(引用[3]提到在Android 8.0以上使用startForegroundService,但会有通知栏显示)。 4. 避免相互唤醒策略:引用[3]提到相互唤醒在Android 8.0以上被限制,因此推荐使用。应寻找更合规的保活方法。 5. 响应内存足通知:应用应响应onTrimMemory()回调,及时释放必要的内存(引用[2]提到系统会通过onTrimMemory()通知应用内存足)。 6. 优化GC行为:根据引用[5],调整进程状态以使用合适的GC算法,可能有助于更有效地管理内存。 总结: 进程LMK杀死后重启的原因主要是应用自身的设计(如保活机制)和内存使用当。解决方法应集中在优化内存使用、调整进程优先级、使用前台服务以及响应系统内存事件上。 基于以上分析,我们给出以下回答: </think> ### LMK进程进程重启的原因及解决方法 #### **一、进程重启的核心原因** 1. **应用自启动机制** - 应用通过**双进程相互唤醒**实现保活:当LMK杀死进程A时,进程B立即重启A(反之亦然)。这种设计常见于需要常驻后台的应用(如即时通讯、定位服务)[^3]。 - **局限性**:Android 8.0+ 限制后台服务启动,相互唤醒策略失效(需改用`startForegroundService`并显示通知栏)。 2. **系统服务依赖** - 关键系统服务(如输入法、无障碍服务)被标记为**高优先级进程**(adj值≤200)。若被LMK,系统会自动重启以维持功能[^1][^4]。 3. **内存回收机制缺陷** - 应用未正确响应`onTrimMemory()`回调,未能及时释放内存。当LMK杀死进程后,系统可能因功能依赖尝试重启[^2]。 --- #### **二、解决方案** ##### **1. 优化应用行为(开发者侧)** - **减少内存占用** - 优化数据结构,避免内存泄漏,及时释放无用资源(如Bitmap)。 - 使用高效GC策略:前台进程采用**低延迟GC**(避免碎片),后台进程用**高压缩GC**(减少内存占用)[^5]。 - **调整进程优先级** - 后台服务改用**前台服务**(`startForegroundService`),提升adj值至≤200(需显示通知栏)[^3]。 - 关键进程声明`android:persistent="true"`(需系统签名权限)。 - **响应内存事件** ```java public class MyApp extends Application { @Override public void onTrimMemory(int level) { if (level == TRIM_MEMORY_COMPLETE) { releaseNonCriticalResources(); // 紧急释放非关键资源 } } } ``` ##### **2. 系统级调优(需Root权限)** - **修改LMK阈值** 调整`/sys/module/lowmemorykiller/parameters/minfree`文件,降低后台进程概率: ```bash # 示例:增大缓存进程的保留内存(单位:页) echo "18432,23040,27648,32256,36864,46080" > minfree ``` - **调整进程adj值** 通过`proc/<pid>/oom_adj`文件提高优先级(值越小越易被): ```bash echo -100 > /proc/1234/oom_adj # 1234为进程ID ``` ##### **3. 规避系统限制** - **Android 8.0+ 保活方案** - 使用**前台服务+通知栏**(用户可见)。 - 利用`JobScheduler`在空闲时段执行任务,减少后台活跃时间。 --- #### **三、根治建议** - **避免激进保活**:频繁重启会加剧内存竞争,触发LMK连锁反应。 - **优先优化内存**:LMK阈值是硬指标,**内存占用越低越安全**。参考引用[4]的实践: > *“提高应用各层级的阀值,锲而舍地减少应用各个部分所占用的内存...才是开发内存占用小、运行稳定应用的核心素质。”* [^4] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值