进程保活 daemon
进程知识
oom_adj对应优先级,oom_adj应用层面最高级可设置0
adb shell 进入手机终端
su获取权限
显示将要被杀死的进程
cat /sys/module/lowmemorykiller/parameters/minfree
查看当前进程的oom_adj的值
cat /proc/进程id/oom_adj
保活
是oom_adj值在0-3,
1像素保活法 现在很多手机不支持这种方式了
keep activity中创建1像素window 广播注册
关屏的时候启动activity
开屏的时候关闭activity
activity存在弱引用中
manifestAndroid的activity中配置
// 不显示在最近任务中 android:excludeFromRecents="true" // 在另一个进程启动 android:taskAffinity="com.xxx.xxx.keep" // 设置主题 背景空、透明true
缺点: 存在一个activity 不干净
需要锁屏
有些手机不适配
前台service保活
- 启动一个前台service oom_adj的值是3
缺点: 通知栏有个提示(产品有这方面的需求就不算缺点,可以使用此种方式)
7.0 api < 18(4.3 17 以下)直接启动前台服务
7.0 api>=18 && api < 26 及以后版本启动前台服务会在通知栏通知,但是可以在创建个内部前台服务启动这个内部前台服务后在把这个内部前台服务关闭,这样通知id一样,会把前面启动的前台服务的通知关闭。
8.0 api>=26 之后同一个id只能创建一个前台服务,这种方式就不能隐藏通知了
添加白名单
需要和厂商谈合作添加到白名单里
拉活
广播拉活 基本不能用
7.0 24 广播就进行了限制
8.0 26 广播限制的更加严格
全家桶拉活 一个公司多个app互相拉活 自己的app可以通过查看大公司app广播拉活 注册个相同的广播实现拉活自己app
service sticky拉活
启动个服务,targetSdkVersion不小于5就是 START_STICKY service系统机制拉活
缺点: 不稳定
真机上第一次被杀死很快被重启,第二次会比第一次慢,第三次又会比第二次慢,一旦短时间内service被杀死4-5次,则系统不再拉起。
账户拉活 最常用
- 创建账户 AccountAuthenticator
- 设置同步 15分钟系统会同步一次 每个手机时间不同
- 设置自动同步
- 设置同步周期
- 添加头像和名字xml manifest里引用此xml
- 账号service返回IBinder给系统用
优点: 系统唤醒
缺点: 时间不能把控
JobScheduler拉活 (是个定时器) 最常用
这个5.0才有
弥补账户拉活
需要在manifest service里添加 BIND_JOB_SERVICE权限
小于7.0 直接设置setPerodic(1000)
大于等于7.0 延迟1秒去掉用onStartJob
缺点: 耗电
双进程守护
app图标到活动时间自动变化是怎么做到的
https://www.jb51.net/article/103167.htm
https://blog.csdn.net/qq_30716173/article/details/79423409
进程保活、拉活
https://blog.csdn.net/qq_37199105/article/details/81224842
https://blog.csdn.net/LVXIANGAN/article/details/85776130
https://www.jianshu.com/p/b51e2dbf2311
https://www.jianshu.com/p/f2bb9975dc3b
https://www.jianshu.com/p/ce60fcedd3d6
什么是进程保活
在Android系统中, 进程保活 是一种关键的优化策略,旨在确保应用程序即使在后台也能维持一定程度的活跃状态。这一技术的核心目标是 提高用户体验 ,特别是在处理即时通讯或需要持续接收更新的应用场景下。通过巧妙的设计和实现,开发者可以显著提升应用的稳定性和可靠性,使其能够在复杂的系统环境中长期运行而不被轻易终止。
进程保活的重要性体现在以下几个方面:
- 提高用户体验 :确保应用在后台持续运行,减少重新加载等待时间。
- 保障核心功能 :特别适用于即时通讯和实时更新类应用,保证消息及时送达和服务连续性。
- 优化系统资源分配 :合理使用系统资源,在保证应用功能的同时不影响整体性能。
通过有效的进程保活策略,开发者可以在系统资源管理和用户体验之间找到平衡点,创造出更加智能和高效的应用程序。
系统杀死进程的原因
Android系统为了优化资源利用和延长设备续航,实施了一系列严格的进程管理策略。这些策略的核心目标是在保证用户体验的前提下,最大化系统资源利用率。系统杀死后台进程的主要原因包括:
- 内存压力
当系统检测到内存资源紧张时,会按照预定义的进程优先级列表逐级终止进程。这个列表通常遵循“Least Recently Used (LRU)”原则,即最先终止最近最少使用的进程。值得注意的是,系统会优先保护前台进程和可见进程,只有在极端情况下才会终止这些重要进程。
- CPU资源限制
如果一个后台进程持续占用大量CPU资源,系统可能会判定其为异常行为并予以终止。这种机制有助于防止单个进程过度消耗系统资源,从而保护整个系统的稳定性。
- 后台任务超时
Android系统对后台任务执行时间有严格限制。如果一个后台任务未能在规定时间内完成,系统可能会强制终止相关进程。这一机制不仅提高了系统响应速度,还有效降低了因长时间运行的后台任务而导致的性能瓶颈风险。
- 电量优化
为了延长设备续航时间,Android系统会根据电池状态动态调整进程管理策略。在低电量模式下,系统可能会更积极地终止非关键后台进程,以节省电力。
- 安全考量
如果系统检测到某个进程存在安全隐患,如频繁触发安全警告或表现出恶意行为,可能会主动终止该进程以保护设备和用户数据安全。
这些机制共同构成了Android系统复杂的进程管理系统,旨在平衡资源利用效率、用户体验和设备性能。开发者在设计应用时,需要充分考虑这些因素,合理安排应用的资源使用和后台行为,以提高应用的稳定性和用户体验。
前台服务
在Android系统中,前台服务是一种强大的工具,可以帮助应用维持较高的系统优先级,从而实现更好的保活效果。这种方法尤其适合那些需要持续运行或执行重要后台任务的应用程序。
前台服务的核心在于 创建并显示一个持久性的通知 。这个通知不仅是用户感知服务存在的窗口,更是系统评估服务重要性的关键依据。通过在服务启动时调用startForeground()方法,我们可以将服务置于系统的特殊保护之下。
以下是一个典型的前台服务实现示例:
public class MyForegroundService extends Service {
private static final int NOTIFICATION_ID = 1;
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Notification notification = createNotification();
startForeground(NOTIFICATION_ID, notification);
return START_STICKY;
}
private Notification createNotification() {
Intent mainActivityIntent = new Intent(this, MainActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(this, 0, mainActivityIntent, 0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("My Foreground Service")
.setContentText("Service is running in foreground")
.setSmallIcon(R.drawable.ic_notification)
.setContentIntent(contentIntent)
.setPriority(NotificationCompat.PRIORITY_LOW)
.setCategory(NotificationCompat.CATEGORY_SERVICE);
return builder.build();
}
}
在这个例子中,我们创建了一个简单的前台服务,它在启动时会显示一个带有标题和内容的通知。这个通知链接到应用的主活动,用户可以通过点击通知直接回到应用界面。
值得注意的是,从Android 12 (API级别31)开始,系统对前台服务的使用进行了更为严格的限制。 只有在特定情况下,后台应用才能启动前台服务 。这些特殊情况主要包括:
- 媒体播放 :音乐播放器等应用
- 语音通话 :VoIP应用
- 位置追踪 :地图或运动追踪应用
对于不符合这些标准的应用,系统可能会阻止其启动前台服务,以防止滥用系统资源和影响用户体验。在这种情况下,开发者需要考虑使用其他替代方案,如WorkManager或JobScheduler,来实现类似的后台任务执行。
尽管如此,前台服务仍然是Android应用保活的重要手段之一。通过合理使用前台服务,开发者可以在保证应用功能的同时,最大限度地提高应用在系统中的生存几率,从而为用户提供更稳定、可靠的服务体验。
双进程守护
双进程守护是一种高效的Android进程保活策略,通过创建两个相互独立又紧密协作的进程来提高应用的生存能力。这种方法的核心思想是 利用两个进程相互监视和保护 ,形成一个稳定的保活机制。
在双进程守护模型中,通常包含一个主进程和一个专门的守护进程。这两个进程各自承担不同的职责:
进程类型主要职责主进程执行应用的核心功能守护进程监视主进程状态,必要时重启主进程
为了实现这种互惠互利的关系,双进程守护通常采用以下关键技术:
- AIDL (Android Interface Definition Language) :用于实现进程间通信,允许两个进程交换数据和调用方法。
- ServiceConnection :用于建立和维护两个进程之间的绑定关系。当一个进程被系统终止时,另一个进程可以通过ServiceConnection的回调方法检测到这一事件,并采取相应的恢复措施。
- 信号处理 :在Linux内核层面,子进程终止时会向父进程发送SIG_CHLD信号。通过安装信号处理函数,父进程可以在子进程终止时立即采取行动,如重新启动子进程。
- 轮询机制 :子进程(监护进程)通过定期检查父进程(主进程)的PID来判断其是否存在。一旦检测到父进程消失,子进程会立即重新启动父进程。
值得注意的是,双进程守护虽然能显著提高应用的存活率,但也可能导致一些副作用,如增加系统资源消耗和略微降低设备续航能力。因此,在实际应用中,开发者需要权衡利弊,根据应用的具体需求和系统环境来决定是否采用这种方法。
此外,随着Android系统的不断升级,一些新的保活机制如JobScheduler和WorkManager也逐渐成为主流选择。这些现代机制在保证应用功能的同时,更能兼顾系统资源的合理利用和用户设备的性能表现。
JobScheduler
在Android系统中,JobScheduler作为一种高效的后台任务调度机制,为开发者提供了强大的工具来管理应用的后台执行。它的主要作用是 在满足特定条件时执行后台任务 ,同时最大限度地减少对设备性能和电池寿命的影响。
JobScheduler的核心优势在于其 灵活性和精确性 。开发者可以通过设置多种约束条件来控制任务的执行时机,包括:
- 网络状态 :仅在网络可用或Wi-Fi连接时执行任务
- 设备充电状态 :仅在设备充电时执行任务
- 设备空闲状态 :仅在设备处于空闲状态时执行任务
这种精细的控制不仅有助于优化应用的资源使用,还能显著提高任务执行的成功率,尤其是在处理需要网络连接或大量计算资源的任务时。
在实现过程中,开发者需要创建一个继承自JobService的类,并实现两个关键方法:
public class MyJobService extends JobService {
@Override
public boolean onStartJob(JobParameters params) {
// 在这里执行后台任务
return false;
}
@Override
public boolean onStopJob(JobParameters params) {
// 任务被取消时执行
return false;
}
}
通过这种方式,开发者可以确保任务在适当的时间执行,同时充分利用系统资源。这种方法不仅提高了应用的效率,还有助于延长设备的电池寿命,从而改善整体用户体验。
值得注意的是,JobScheduler还支持 周期性任务 的执行。这使得开发者可以轻松地安排需要定期执行的后台操作,如数据同步或缓存清理。通过合理设置任务的执行频率和条件,可以在保证应用功能的同时,最大限度地减少对系统资源的占用。
通过合理使用JobScheduler,开发者可以在Android系统中实现更加智能和高效的后台任务管理,从而提高应用的稳定性和用户体验,同时优化系统资源的使用。
WorkManager
在Android系统中,WorkManager作为一种强大的后台任务调度机制,为开发者提供了灵活可靠的解决方案。它不仅能确保任务的执行,还能适应各种系统限制和设备状态变化,从而提高应用的进程存活率。
WorkManager的核心优势在于其 高度的灵活性和可靠性 。它允许开发者定义复杂的任务执行规则,同时保证任务在各种条件下都能得到执行。这种特性使得WorkManager成为实现进程保活的有效工具。
为了充分发挥WorkManager的保活能力,开发者可以采取以下策略:
- 合理设置约束条件 :通过
Constraints类,可以指定任务执行的前提条件,如网络状态、设备充电状态等。这不仅可以优化资源使用,还能提高任务执行的成功率。 - 使用周期性任务 :通过
PeriodicWorkRequest,可以设置需要定期执行的任务。这种方法特别适合需要持续运行的服务型应用,如IM应用的消息推送。 - 利用任务链 :通过
Chain,可以将多个任务串联起来,形成复杂的任务流程。这有助于实现更高级的功能,如数据同步后的本地数据库更新。 - 设置重试策略 :通过
BackoffPolicy,可以定义任务失败后的重试机制。这可以显著提高任务执行的可靠性,间接提高应用的存活率。 - 使用LiveData观察任务状态 :通过
WorkInfo的LiveData,可以实时监控任务的执行状态。这有助于及时发现和处理潜在的问题,提高应用的稳定性和用户体验。
通过这些策略,开发者可以构建出更加健壮和可靠的Android应用,有效提高进程的存活率。然而,需要注意的是,WorkManager虽然强大,但并非适用于所有场景。对于需要立即执行或对执行时间有严格要求的任务,可能需要考虑其他方案,如前台服务。
系统白名单
在Android生态系统中,系统白名单是一种强大的保活策略,能够显著提高应用在后台的存活率。这种机制允许特定应用绕过系统的一些限制,如内存管理和电池优化,从而保持更长时间的运行状态。
将应用加入系统白名单的方法因设备制造商而异。以下是几个主要Android设备厂商的操作指南:
设备品牌操作方法华为设置 > 应用和服务 > 应用启动管理 > 选择应用 > 开启自启动开关小米安全中心 > 权限 > 自启动管理 > 选择应用 > 添加至白名单OPPO/VIVO设置 > 电池 > 电池优化 > 选择应用 > 关闭电池优化
值得注意的是,从Android 12.0版本开始,Google在系统层面上引入了官方的进程保活白名单功能。这一功能通过在IActivityManager.aidl文件中增加相关接口实现,允许应用请求加入白名单。然而,由于涉及到系统权限和资源管理,此功能的实际应用仍受到严格限制。
对于开发者而言,除了依赖系统白名单,还可以通过以下方式提高应用的保活能力:
- 合理使用前台服务 :对于需要持续运行的任务,如音乐播放或位置跟踪,使用前台服务可以显著提高应用的存活率。
- 优化后台任务 :利用WorkManager或JobScheduler等机制,可以在不影响系统性能的情况下执行必要的后台操作。
- 用户教育 :通过应用内的提示,引导用户将应用添加到系统白名单中,也是一种有效的保活策略。
通过综合运用这些方法,开发者可以在保证应用功能的同时,最大限度地提高应用在复杂系统环境下的存活率。
关闭电池优化
在Android系统中,关闭电池优化是一种强有力的保活策略,能够显著提高应用在后台的存活率。这一机制允许应用绕过系统为延长电池寿命而实施的部分限制,从而保持更长时间的运行状态。
为了实现这一功能,开发者需要在应用中集成相应的代码。以下是一个简化的实现示例:
public static void disableBatteryOptimization(Context context) {
PowerManager powerManager = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
if (!powerManager.isIgnoringBatteryOptimizations(context.getPackageName())) {
Intent intent = new Intent(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}
}
这段代码首先检查应用是否已经被排除在电池优化之外。如果没有,它会启动一个系统对话框,请求用户将应用添加到电池优化的白名单中。
值得注意的是,从Android 12 (API级别31)开始,系统对前台服务的使用进行了更为严格的限制。 只有在特定情况下,后台应用才能启动前台服务 。这些特殊情况主要包括:
- 媒体播放 :音乐播放器等应用
- 语音通话 :VoIP应用
- 位置追踪 :地图或运动追踪应用
对于不符合这些标准的应用,系统可能会阻止其启动前台服务,以防止滥用系统资源和影响用户体验。在这种情况下,关闭电池优化成为了维持应用后台运行的关键策略。
然而,关闭电池优化也可能带来一些负面影响。由于应用不再受系统电池优化的限制,它可能会 增加设备的电量消耗 。因此,在实现这一功能时,开发者需要权衡应用的需求和设备的性能,确保在保活和节能之间找到合适的平衡点。
通知栏常驻
在Android系统中,创建持久性通知是一种有效的保活策略。通过在通知中设置FLAG_ONGOING_EVENT和FLAG_NO_CLEAR标志,可以使通知始终停留在状态栏,提高应用的系统优先级。这种方法不仅增强了应用的可见性,还能让系统将其视为正在进行的重要任务,从而降低被系统自动终止的风险。例如:
Notification notification = new Notification.Builder(this)
.setOngoing(true)
.setAutoCancel(false)
.build();
通过这种方式,开发者可以巧妙地提升应用在系统中的地位,确保关键功能持续运行。
定时唤醒
在Android系统中,定时唤醒是一种常用的保活策略。通过使用AlarmManager,开发者可以设置定期执行的任务,有效地保持应用的活跃状态。这种方法的核心优势在于其灵活性和精确性,允许开发者根据应用需求设定不同的触发时间和间隔。
然而,值得注意的是,过度使用定时唤醒可能会对设备电池寿命产生不利影响。因此,在实施此类策略时,开发者需要权衡应用需求和用户体验,谨慎设置唤醒频率和执行时间,以达到最佳的保活效果。
合理使用资源
在Android应用开发中,合理使用资源是提高进程存活率的关键策略。通过优化内存使用、最小化CPU占用和精简网络请求,开发者可以显著降低应用被系统终止的风险。具体而言,应关注以下几点:
- 按需加载资源 :采用懒加载技术,只在必要时加载图片或其他大型资源。
- 释放闲置资源 :及时释放不再使用的Bitmap或其他大对象,避免内存泄漏。
- 使用轻量级数据存储 :优选SQLite或SharedPreferences,避免频繁使用耗电的网络请求。
通过这些优化措施,应用能在系统资源紧张时更好地自保,提高在复杂系统环境下的生存能力。
遵循系统规范
在Android应用开发中,遵循系统规范至关重要。开发者应当 避免使用不当的保活手段 ,如滥用前台服务或双进程守护机制,因为这些做法可能违反Android系统的设计初衷,损害用户体验和设备性能。相反,应该专注于优化应用的核心功能,合理使用系统提供的合法保活机制,如 WorkManager和JobScheduler 。这些官方推荐的方法不仅能有效提高应用的存活率,还能确保应用符合系统规范,提供良好的用户体验。