[关闭]
@EricJing 2017-07-07T00:54:30.000000Z 字数 2732 阅读 2344

禁止App唤醒机制技术调研

Android


目前涉及到的省电软件:
image.png-35.4kB

所以我们其实需要的一台诺基亚
image.png-557.9kB

主流解决方案

  1. 强制休眠,杀掉进程
  2. Xposed,禁止App唤醒
  3. 禁用特性

黑域(非Root)

Android Doze和App Standby机制

Doze

满足条件
1. 关屏
2. 未插接电源
3. 预计30分钟

系统会定期(30分钟)退出低电耗模式一会儿(30秒),好让应用完成其已推迟的 Activity。在此维护时段内,系统会运行所有待定同步、作业和闹铃并允许应用访问网络。
image.png-58.3kB

限制:
1. 暂停访问网络。
2. 系统将忽略 wake locks。
3. 标准 AlarmManager 闹铃(包括 setExact() 和 setWindow())推迟到下一维护时段。
4. 如果您需要设置在低电耗模式下触发的闹铃,请使用 setAndAllowWhileIdle() 或 setExactAndAllowWhileIdle()。
5. 一般情况下,使用 setAlarmClock() 设置的闹铃将继续触发 — 但系统会在这些闹铃触发之前不久退出低电耗模式。
6. 系统不执行 Wi-Fi 扫描。
7. 系统不允许运行同步适配器。
8. 系统不允许运行 JobScheduler。

App Standby

当用户不触摸使用应用程序一段时间时,该应用程序处于App Standby状态,系统将把该App标志为空闲状态。除非触发以下任意条件,应用程序将退出App Standby状态:
1. 用户主动启动该App;
2. 该App当前有一个前台进程(或包含一个活动的前台服务,或被另一个activity或前台service使用);
3. App生成一个用户所能在锁屏或通知托盘看到的Notification, 而当用户设备插入电源时,系统将会释放App的待机状态,允许他们自由的连接网络及其执行未完成的工作和同步。如果设备空闲很长一段时间,系统将允许空闲App一天一次访问网络。

原理

息屏后,黑域高度利用 Android 6.0 的休眠(App Standby)特性,强行停止恶意唤醒或者真的不再使用的应用。

流程图

点击返回

Created with Raphaël 2.1.2Start点击返回进入休眠休眠是否超时停止应用Endyesno

点击Home

Created with Raphaël 2.1.2Start点击Home等待休眠等待是否超时进入休眠休眠是否超时停止应用Endyesnoyesno

无界面的唤醒,只要没有打开过,都将强制停止

架构图

image.png-34.6kB

命令

  1. 进入休眠
    dumpsys battery unplug
    am set-inactive true

  2. 停止应用
    am force-stop 包名
    ActivityManagerService.forceStopPackage

  3. 稳定持有权限
    adb shell app_process /system/bin --nice-name=别名 moe.shizuku.server.Server

阻止运行(Root+Xposed)

原理

点击返回退出应用,利用Xposed拦截系统Api阻止程序自动启动和后台运行
杀掉黑名单的进程
1. 拦截ActivityManagerService,包括创建新进程、清理任务、Activity启动、广播、开启服务、绑定服务

  1. private void hookActivityManagerServiceStartProcessLocked(Class<?> activityManagerService) {
  2. String method = "startProcessLocked";
  3. XC_MethodHook hook = new ProcessHook();
  4. try {
  5. hookMethods(activityManagerService, method, "ProcessRecord", hook);
  6. } catch (LinkageError e) {
  7. //省略
  8. }
  9. }
  10. public static void forceStopPackage(Context context, String packageName) {
  11. try {
  12. ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  13. activityManager.forceStopPackage(packageName);
  14. AlarmManagerServiceUtils.releaseAlarm(context, packageName);
  15. } catch (Throwable t) { // NOSONAR
  16. PreventLog.e("cannot force stop package" + packageName, t);
  17. }
  18. }
  1. 拦截Activity生命周期,pause状态(例如Home),加入leavingPackages清单,destroy状态,杀掉进程
  2. 拦截IntentFilter, 对于需要阻拦的Intent设置NO_MATCH_ACTION
  3. 拦截Intent,对于非阻拦的Intent设置isExcludingStopped为false,将处于停止状态的应用将也可以接受到该标志的广播
  4. 关屏后,一段时候后杀掉leavingPackages清单里的进程

冰箱(Root,最近推出免Root版本,利用设备策略管理)

原理

利用禁用特性,告诉系统这个应用不存在
http://blog.csdn.net/commonslok/article/details/8150018
禁用应用:
pm disable PACKAGE_OR_COMPONENT
恢复应用:
pm disable-user PACKAGE_OR_COMPONENT
pm enable PACKAGE_OR_COMPONENT

绿色守护(非Root, Root, Root+Xposed)

原理

黑屏后统一处理
非Root版:
1. 模拟用户强行停止应用
2. 把整个设备放入 Doze 模式
dumpsys battery unplug
dumpsys deviceidle step

ROOT版本:
1. 休眠
2. Xposed 模式,保留通知消息,唤醒追踪与路径切断,

Xposed目前不支持7.0以及以上,并且存在适配问题

island(非Root,利用5.0以上的工作空间,沙箱环境)

https://forum.xda-developers.com/android/apps-games/closed-beta-test-incoming-companion-app-t3366295

island 对其控制范围内的应用执行冻结不需要 root (因为 island 是 Android for work 的 supervisor 应用),杀进程可能也不需要。

黑域 & 绿色守护 & 安卓最好的省电工具?

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注