正确引导用户添加白名单,这个方法可以非常有效的进行保活,使用了这个库:https://github.com/xingda920813/HelloDaemon 代码位置在:Daemon-simple\daemonsdk\src\main\java\com\revenco\daemon\java 包
native层的暴力监听保活方案,也可以达到较好的效果,但是对于新的机型版本有可能失效,使用了这个库:https://github.com/Marswin/MarsDaemon 代码位置在:Daemon-simple\daemonsdk\src\main\java\com\revenco\daemon\natives 包
添加了一些提高进程优先级的方案,比如不可见的notifycation,锁屏情况下的一个像素透明的activity,账户同步功能
使用了第三方app开启的唤醒功能,反编译了各大主流的app,添加ACTION配置,仿造他们的service,以便可能被隐式启动
添加了第三方的推送服务配置,包括极光推送,小米推送,华为推送,信鸽推送,百度推送,个推推送,以便可以在同一个设备上有可能集成相同推送的app启动时候可以唤醒
特性功能:
如果同一个设备有多个APP集成了这个保活库,则启动任何一个APP将会通过隐式启动的方式唤醒未启动的服务。
1、引导用户添加白名单的方式,这种方式是最可靠最友好的保活方式,并且不受Android系统版本的限制。
2、native层的保活方式,可以参照原作者的博客,有详细讲解,虽然实际测试中有部分的机型达不到预期的效果,但是这不失为一个非常好的解决方案。
3、根据不同的Android系统版本,利用Android的系统漏洞,或者一些系统的特性的保活手段
3.1、在API19 以下,设置空的notification,而不显示在通知栏的方式漏洞,可以提升进程的优先级。
3.2、在锁屏时候,启动一个一个像素的Activity,提升进程优先级,避免在某些机型在锁屏时候进程被kill,适用于任何的系统版本。
3.3、增加了账户同步功能,此账户同步功能为空实现,仅仅是让系统定时触发同步功能一达到唤醒我们的服务,适用于任何的系统版本,弊端是,1、在系统设置下面可以看到账户信息,2、系统的下拉快捷方式那里关闭了自动同步功能的话,将失效,但是,此方案还是不错的。
3.4、增加了看门狗守护服务(在第一点中实现),定时查看服务的状态。
4、反编译各大主流app,在AndroidManifest上配置ACTION,可以在一定的程度上唤醒,适用于任何的系统版本,有测试成功案例:被百度云盘唤醒。
5、添加第三方推送的配置,仿造一些服务和接收器,可以在一定的程度上唤醒,适用于任何的系统版本,有测试成功案例:启动了集成极光推送的app,可以被唤醒。
compile 'com.idba:daemonsdk:1.0'
2.1 配置核心业务Service 和一个 辅助的 receive(注意:必须配置在同一个进程中)
<receiver
android:name=".wakeup.assistantReceiver"
android:enabled="true"
android:exported="true"
android:process=":business">
</receiver>
<service
android:name=".TraceServiceImpl"
android:enabled="true"
android:exported="true"
android:process=":business">
</service>
2.2 配置核心的广播接收器,
<receiver
android:name=".wakeup.WakeUpReceiver"
android:process=":watch">
<intent-filter>
<action android:name="com.revenco.daemon.java.CANCEL_JOB_ALARM_SUB"/>
<action android:name="com.revenco.daemon.java.ACTION_WAKE_UP_BY_MORE_METHOD"/>
</intent-filter>
</receiver>
/**
* 在子线程配置,避免阻塞主线程
*/
private void Start() {
new Thread(new Runnable() {
@Override
public void run() {
//主要的业务逻辑进程
String processName = "com.revenco.app:business";
String serviceName = TraceServiceImpl.class.getCanonicalName();
String receiveName = assistantReceiver.class.getCanonicalName();
DaemonManager.INSTANCE.init(MainActivity.this, processName, serviceName, receiveName);
if (BuildConfig.DEBUG)
//Debug模式开启控制台LOG日志,部分唤醒日志则会记录到SDCard,方便观察app如何被唤醒的日志
DaemonManager.INSTANCE.initLogFile(MainActivity.this);
//配置
DaemonEnv.initialize(MainActivity.this, TraceServiceImpl.class, DaemonEnv.DEFAULT_WAKE_UP_INTERVAL);
try {
//启动
startService(new Intent(MainActivity.this, TraceServiceImpl.class));
} catch (Exception e) {
}
}
}).start();
}
assistantReceiver 类 :
/**
* 辅助接收器,空实现即可
*/
public class assistantReceiver extends BroadcastReceiver {
public assistantReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
}
}
WakeUpReceiver 类:
/**
* 这个接收器唤醒业务服务,这里唤醒业务服务
*/
public class WakeUpReceiver extends BroadcastReceiver {
private static final String TAG = "WakeUpReceiver";
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null && Constant.ACTION_CANCEL_JOB_ALARM_SUB.equals(intent.getAction())) {
WatchDogService.cancelJobAlarmSub();
return;
}
//动态注册屏幕解锁开锁ACTION,等等以及自定义的其他广播,以唤醒app
try {
XLog.log2Sdcard(TAG, "ACTION = " + intent.getAction() + " --> 唤醒业务服务!");
context.startService(new Intent(context, TraceServiceImpl.class));
} catch (Exception e) {
e.printStackTrace();
}
}
}
radio.ysh@qq.com
$ claude mcp add Daemon-simple \
-- python -m otcore.mcp_server <graph>