AOSP Android v5.1.1环境下实现永久后台服务的技术问询
嘿,针对你在AOSP 5.1.1嵌入式设备上遇到的后台Service被系统随意终止的问题,我整理了几个专属AOSP定制的解决方案,这些都是Google原生Android没有的操作,能帮你彻底解决这个痛点:
1. 改系统进程管理逻辑,给你的应用开“后台豁免权”
Android 5.1的后台查杀主要靠ActivityManagerService(AMS)和Low Memory Killer(LMK),咱们可以直接修改AOSP源码,让系统绕开对目标应用的清理:
- 拉高进程优先级:找到
frameworks/base/services/core/java/com/android/server/am/ProcessList.java,这里面负责计算每个进程的oom_adj值(数值越低优先级越高)。给你的应用包名加个特殊判断,把它的oom_adj设成和系统核心服务一样的级别(比如OOM_ADJ_SYSTEM),这样系统会优先保住它。 - 禁止主动查杀:在AMS的
killBackgroundProcesses()或者trimApplications()方法里,加个包名判断——如果是你的应用进程,直接跳过查杀逻辑。 - 调整LMK触发阈值:要是遇到内存不足触发的LMK查杀,你可以修改
system/core/rootdir/init.rc里的LMK参数,或者在frameworks/base/services/core/java/com/android/server/am/LowMemoryKiller.java中,把目标进程的内存阈值设得远高于其他应用,让LMK永远不会选中它。
2. 把应用升级成系统级应用,自带“免死金牌”
系统级应用的进程优先级天生比普通应用高,AMS和LMK都会优先保留它们,步骤也很简单:
- 在应用的
AndroidManifest.xml里加一行android:sharedUserId="android.uid.system"。 - 用AOSP源码里的系统签名文件(
build/target/product/security/下的platform.x509.pem和platform.pk8)给应用签名。 - 把安装包放到设备的
/system/app/或者/system/priv-app/目录(后者优先级更高)。
这样一来,你的应用就和系统自带的服务平起平坐了,除非内存极端不足,系统根本不会动它。
3. 定制系统级自动重启,被杀了也能原地复活
要是还是担心意外终止,咱们可以在系统层面做强制重启逻辑,比应用内的监听靠谱多了:
- 监听进程死亡自动重启:在AMS的
handleAppDiedLocked()方法里,判断死亡进程的包名是不是你的应用,如果是,直接调用startProcessLocked()重启它——这是系统级的监听,完全不受应用自身状态影响。 - 加个系统白名单:可以修改Settings应用的源码,在系统设置里加一个后台进程白名单功能,把你的应用加进去,然后在AMS的清理逻辑里,跳过白名单里的所有应用。
- AlarmManager定期检测(系统+应用结合):在应用里用AlarmManager每隔几分钟检查Service是否在运行,没运行就启动;同时在AOSP里调整AlarmManager的优先级,确保你的应用的闹钟不会被系统忽略。
要注意的是,这些操作都需要你能修改AOSP源码,然后重新编译系统镜像刷入设备——不过你是做嵌入式设备的,这应该完全没问题。AOSP的优势就是高度定制,咱们完全可以根据需求把系统改成自己想要的样子。
内容的提问来源于stack exchange,提问作者andrewedgar
相关产品推荐
相关产品推荐

