Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Try to suspend the process--墓碑模式探索 #455

Open
countrysideboy opened this issue Apr 5, 2022 · 77 comments
Open

Try to suspend the process--墓碑模式探索 #455

countrysideboy opened this issue Apr 5, 2022 · 77 comments
Assignees
Labels

Comments

@countrysideboy
Copy link
Contributor

countrysideboy commented Apr 5, 2022

如题,觉得目前的乖巧模式的不太压得住流氓们,app切换到后台后仍然占用cpu,于是探索使用冻结进程的方式,看作者大神后续能否增强(需要那种前台能用,后台压得死死的,切换回前台又恢复之前的会话)

在全局变量中添加 pause,把要压制的app添加进去;或者在目标应用详情,将电池设置为受限(为了检验效果,脚本与乖巧模式互斥,会自动关闭乖巧)

20220729更新:
1.修复未添加全局变量pause时脚本出错的bug;
2.添加参数自定义调整功能,其中DELAY = 45000,对应实现应用切回后台进入墓碑的等待时长(毫秒);修改为SU_EXE = 1,则使用kill -19命令来压制进程,需打开su插件支持(默认SU_EXE = 0,使用系统api进行压制,无需su插件)。
情景模式脚本

[
  {
        "name": "ForceIdle: auto pause or continue App",
        "description": "通过全局变量[pause]添加应用列表,或设置电池用量为受限,对回到后台的应用强制压制(墓碑)。\nForce pause the app while it switchs to backgroud, you need to pick app list in the global val name [pause].",
        "priority": 1,
        "condition": "frontPkgChanged == true",
        "actions": [
            "if(thanos.getActivityManager().isBlockAllService(to)){thanos.getActivityManager().setBlockAllService(to,false)};",
            "if(thanos.getActivityManager().isBlockAllReceiver(to)){thanos.getActivityManager().setBlockAllReceiver(to,false)};",
            "if(thanos.getActivityManager().isBlockAllProvider(to)){thanos.getActivityManager().setBlockAllProvider(to,false)};",
            "if(context.getSystemService(context.APP_OPS_SERVICE).unsafeCheckOp(android.app.AppOpsManager.OPSTR_RUN_ANY_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(to), to) == android.app.AppOpsManager.MODE_IGNORED || (thanos.getProfileManager().isGlobalRuleVarByNameExists(\"pause\") && globalVarOf$pause.contains(to))){foreach(proc:context.getSystemService(context.ACTIVITY_SERVICE).getRunningAppProcesses()){if(proc.processName.contains(to)){android.os.Process.sendSignal(proc.pid,18);}}; context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_WAKE_LOCK, thanos.getPkgManager().getUidForPkgName(to), to, android.app.AppOpsManager.MODE_DEFAULT); context.getSystemService(context.USAGE_STATS_SERVICE).setAppStandbyBucket(to,android.app.usage.UsageStatsManager.STANDBY_BUCKET_RARE); if(thanos.getActivityManager().isPkgSmartStandByEnabled(to)){thanos.getActivityManager().setPkgSmartStandByEnabled(to,false)}; if(thanos.getActivityManager().isPkgBgRestricted(to)){thanos.getActivityManager().setPkgBgRestrictEnabled(to,false)}};",
            "DELAY = 45000; if(context.getSystemService(context.APP_OPS_SERVICE).unsafeCheckOp(android.app.AppOpsManager.OPSTR_RUN_ANY_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(from), from) == android.app.AppOpsManager.MODE_IGNORED || (thanos.getProfileManager().isGlobalRuleVarByNameExists(\"pause\") && globalVarOf$pause.contains(from))){context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_WAKE_LOCK, thanos.getPkgManager().getUidForPkgName(from), from, android.app.AppOpsManager.MODE_IGNORED); thanos.getActivityManager().setBlockAllService(from,true); thanos.getActivityManager().setBlockAllReceiver(from,true); thanos.getActivityManager().setBlockAllProvider(from,true); actor.delayed(DELAY,\"if(activity.getFrontAppPackage()!=from){if(thanos.getActivityManager().isPackageIdle(from)==false){context.getSystemService(context.ACTIVITY_SERVICE).getService().makePackageIdle(from,android.os.UserHandle.USER_ALL)}; if(activity.isInactive(from)==false){activity.setInactive(from)}; context.getSystemService(context.USAGE_STATS_SERVICE).setAppStandbyBucket(from,android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED); SU_EXE = 0; foreach(proc:context.getSystemService(context.ACTIVITY_SERVICE).getRunningAppProcesses()){if(proc.processName.contains(from)){if(SU_EXE == 1){su.exe(\\\"kill -19 \\\" + proc.pid);};if(SU_EXE != 1){android.os.Process.sendSignal(proc.pid,20);};}}}\")};"
         ]
     }
]
@countrysideboy
Copy link
Contributor Author

目前已知问题:
1.好像压不住关联唤醒,压不住广播
2.使用冻结进程的方式,原脚本是用kill -19的方式,现在换成cgroup feeeze的方式,但从日志看,进程似乎仍会anr。

也许要写Xposed模块hook相关操作才能搞定上面的问题,但要处理后台自启,广播,wakelock,alarm,想想就麻烦,期待作者出暴力压制模式。目前thanox的权限管理够好用了,要是能压制后台,原生系统就更省电了。

@Tornaco
Copy link
Owner

Tornaco commented Apr 5, 2022

都是人才啊,我会抽时间学习研究一下。

@Tornaco Tornaco self-assigned this Apr 5, 2022
@Tornaco
Copy link
Owner

Tornaco commented Apr 5, 2022

我编辑了一下这个issue,调整了一下代码格式化。

@tzfljuv
Copy link

tzfljuv commented Apr 10, 2022

最近我恰好在探索相关内容,但无奈自己没有安卓开发的能力,目前仅能做到脚本级别的冰冻后台(效率极度低下,基本就是暴力轮询)。Thanox在安卓平台层面应该能更好地处理相关功能实现。

@countrysideboy 你应该用到了cgroupv2的freezer功能,这个功能要求内核版本大于5.4、或者OEM将相关功能移植回低版本内核。而如果你的内核本来就支持了cgroupv2的freezer,那么你可以前往开发者选项 -> 对缓存应用暂停执行(Suspend execution for cached apps)

相关功能分析: https://juejin.cn/post/7078957393446453285

kill -SIGCONT会导致父进程异常,相关问题介绍: https://www.kernel.org/doc/Documentation/cgroup-v1/freezer-subsystem.txt
但不知道先用freezer冻结之后再用SIGSTOP冻结,并且在唤醒时先用SIGCONT解除掉SIGSTOP、再把freezer的冰冻状态解除,这样能不能规避父进程崩溃的问题。

@Tornaco cgroupv2 freezer有较高的内核版本要求,请考虑一下如果cgroupv2 freezer不可用的时候fallback回cgroupv1 freezer(支持这个的设备应该更加广泛)

freezer冻结和解冻请以整个应用为单位来进行,不然可能发生异常,比如应用的其它进程的异常捕捉认为应用未响应了于是尝试重启应用(脚本里的逐个pid冰冻是有问题的)。更好的做法是创建一个新的cgroup,并以应用包(或uid)为单位划分,冻结时将整个节点冻结而不是单独一个一个pid来。

最后,如果有其它通讯平台的联系方式可能会更方便些。

@countrysideboy
Copy link
Contributor Author

看来研究得很深入啊。一开始我是直接冻结整个uid 而非pid,但是发现应用异常退出后,无论是否解冻,app都无法再打开,很奇怪,才转而冻结pid

@countrysideboy
Copy link
Contributor Author

至于kill -19的方式,可能比较通用,但会anr,我试过去hook相关函数但没有成功。

另外就算能冻结成功,唤醒锁,闹钟,广播需要解决,不然还是会被关联唤醒。

@myflavor
Copy link
Contributor

myflavor commented May 3, 2022

通过Hook安卓系统屏蔽ANR
Screenshot_2022-05-03-08-02-14-587_me simpleHook

@myflavor
Copy link
Contributor

myflavor commented May 3, 2022

[
    {
        "name": "冻结进程",
        "description": "当应用进入后台时冻结进程",
        "priority": 1,
        "condition": "frontPkgChanged == true && thanos.getActivityManager().isPkgSmartStandByEnabled(from)==true && !globalVarOf$whiteApps.contains(from)",
        "actions": [
            "su.exe(\"appops set \" +from + \" RUN_ANY_IN_BACKGROUND ignore\");",
            "su.exe(\"appops set \" +from + \" RUN_IN_BACKGROUND ignore\");",
            "su.exe(\"appops set \" +from + \" WAKE_LOCK ignore\");",
            "activity.setInactive(from);",
            "su.exe(\"am make-uid-idle \" +from);",
            "su.exe(\"am set-standby-bucket \" +from +\" restricted\");", "actor.delayed(2000,\"if(activity.getFrontAppPackage()!=from){su.exe(\\\"kill -19 `pgrep -f \\\"+ from+ \\\"`\\\")}\");"
        ]
    }
]



[
    {
        "name": "解冻进程",
        "description": "当应用进入前台时解冻进程",
        "priority": 1,
        "condition": "frontPkgChanged == true && thanos.getActivityManager().isPkgSmartStandByEnabled(to)==true && !globalVarOf$whiteApps.contains(to)",
        "actions": [
            "su.exe(\"appops set \" +to + \" RUN_ANY_IN_BACKGROUND default\");",
            "su.exe(\"appops set \" +to + \" RUN_IN_BACKGROUND default\");",
            "su.exe(\"appops set \" +to + \" WAKE_LOCK default\");",
"su.exe(\"kill -18 `pgrep -f \"+ to + \"`\");",
            "su.exe(\"am set-standby-bucket \" +to +\" rare\");"
        ]
    }
]

@countrysideboy

This comment was marked as outdated.

@myflavor
Copy link
Contributor

OP_WAKE_LOCK应该是没用的
OP_RUN_ANY_IN_BACKGROUND比OP_RUN_IN_BACKGROUND限制多
下面的广播服务提供者阻止,不知道没有NoANR能不能正常了

@countrysideboy
Copy link
Contributor Author

OP_WAKE_LOCK应该是没用的 OP_RUN_ANY_IN_BACKGROUND比OP_RUN_IN_BACKGROUND限制多 下面的广播服务提供者阻止,不知道没有NoANR能不能正常了

初步测试了一下,不使用NoANR模块好像可以,thanox作者似乎有处理这个问题。

@myflavor
Copy link
Contributor

有看过/data/anr的日志吗

@myflavor
Copy link
Contributor

也不知道Thanox怎么阻止的广播,我的NoANR是在分到APP之前去掉了广播,但是已经在执行的广播没去干扰,看这个情景模式也是延迟了15s,前台广播超时好像是10s,这样应该不存在后台后还有广播在执行了

@countrysideboy
Copy link
Contributor Author

countrysideboy commented May 24, 2022

有看过/data/anr的日志吗

昨天我把文件清空了,要测久一点才能确认了

@myflavor
Copy link
Contributor

冻结APP之后,直接锁屏,触发息屏广播,过个几秒,看看/data/anr有没有日志,如果有就是广播阻止的不彻底,如果没有,广播就成功阻止了,然后还有服务的ANR,就是挂后台,挂久一点,如果没有出现,那就没啥问题了,提供者的ANR我没看过了,NoANR去掉广播之后,屏蔽NoANR就没有任何问题了,所以我就没继续研究了

@myflavor
Copy link
Contributor

用Thanox的阻止广播还有服务和提供者,会导致比如美团支付使用支付宝,而支付宝以及被阻止了,就会显示找不到支付宝

@countrysideboy
Copy link
Contributor Author

用Thanox的阻止广播还有服务和提供者,会导致比如美团支付使用支付宝,而支付宝以及被阻止了,就会显示找不到支付宝

是吧,我试了下闲鱼跳转淘宝授权登录,好像也不行

@countrysideboy
Copy link
Contributor Author

冻结APP之后,直接锁屏,触发息屏广播,过个几秒,看看/data/anr有没有日志,如果有就是广播阻止的不彻底,如果没有,广播就成功阻止了,然后还有服务的ANR,就是挂后台,挂久一点,如果没有出现,那就没啥问题了,提供者的ANR我没看过了,NoANR去掉广播之后,屏蔽NoANR就没有任何问题了,所以我就没继续研究了

测试了几下,暂时没发现有文件。

@myflavor
Copy link
Contributor

还有就是,感觉15s延迟是不是太久了,进入后台那一会是最活跃的,如果改成3s还能不能正常,会不会就触发ANR了

@countrysideboy
Copy link
Contributor Author

还有就是,感觉15s延迟是不是太久了,进入后台那一会是最活跃的,如果改成3s还能不能正常,会不会就触发ANR了

我试试。等待时间久些,是希望程序能进缓存。之前测试,短时间内发送make-uid-idle没有效果,要有那么一段时间后执行才有效

@hanxin1997
Copy link

以下为使用kill方式冻结的脚本,做了一些禁用广播接收器方面的尝试
情景模式脚本1

[
  {
    "name": "ForceIdle: continue App",
    "description": "切回前台,取消压制",
    "priority": 1,
    "condition": "frontPkgChanged == true && globalVarOf$pause.contains(to)",
    "actions": [
    "su.exe(\"kill -CONT `pgrep -f \"+ to + \"`\");",
    "if(thanos.getActivityManager().isBlockAllService(to)){thanos.getActivityManager().setBlockAllService(to,false)};",
    "if(thanos.getActivityManager().isBlockAllReceiver(to)){thanos.getActivityManager().setBlockAllReceiver(to,false)};",
    "if(thanos.getActivityManager().isBlockAllProvider(to)){thanos.getActivityManager().setBlockAllProvider(to,false)};",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(to), to, android.app.AppOpsManager.MODE_DEFAULT);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(to), to, android.app.AppOpsManager.MODE_DEFAULT);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_WAKE_LOCK, thanos.getPkgManager().getUidForPkgName(to), to, android.app.AppOpsManager.MODE_DEFAULT);",
    "if(thanos.getActivityManager().isPkgSmartStandByEnabled(to)){thanos.getActivityManager().setPkgSmartStandByEnabled(to,false)};",
    "su.exe(\"am set-standby-bucket \" +to +\" rare\");"
    ]
  }
]

情景模式脚本2

[
  {
    "name": "ForceIdle: pause App",
    "description": "切到后台,自动压制",
    "priority": 2,
    "condition": "frontPkgChanged == true && globalVarOf$pause.contains(from) && activity.getFrontAppPackage()!=\"android\" ",
    "actions": [ 
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(from), from, android.app.AppOpsManager.MODE_IGNORED);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(from), from, android.app.AppOpsManager.MODE_IGNORED);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_WAKE_LOCK, thanos.getPkgManager().getUidForPkgName(from), from, android.app.AppOpsManager.MODE_IGNORED);",
    "if(thanos.getActivityManager().isBlockAllService(from)==false){thanos.getActivityManager().setBlockAllService(from,true)};",
    "if(thanos.getActivityManager().isBlockAllReceiver(from)==false){thanos.getActivityManager().setBlockAllReceiver(from,true)};",
    "if(thanos.getActivityManager().isBlockAllProvider(from)==false){thanos.getActivityManager().setBlockAllProvider(from,true)};",
    "su.exe(\"am send-trim-memory \" +from+ \" TRIM_MEMORY_RUNNING_CRITICAL\");",
    "if(activity.isInactive(from)==false){activity.setInactive(from)};",
    "if(thanos.getActivityManager().isPackageIdle(from)==false){thanos.getActivityManager().idlePackage(from)};",
    "actor.delayed(15000,\"if(activity.getFrontAppPackage()!=from){su.exe(\\\"am make-uid-idle \\\" +from);su.exe(\\\"am set-standby-bucket \\\" +from +\\\" restricted\\\");su.exe(\\\"kill -STOP `pgrep -f \\\"+ from+ \\\"`\\\")}\");"
    ] 
  }
]

已更新,希望最终能不用su.exe,调用系统api实现,比如sendsignal等

发现如果直接把全局变量的软件取消后会出现奇怪的问题 比如qq和微信是连不上网 接不到新消息,停止应用和重新开机都不行恢复,只有停止冻结的那个情景模式,而且解冻的那个情景模式得开启,再打开一次软件才恢复正常,如果有人看到这个问题,请使用这个方法恢复app。

@myflavor
Copy link
Contributor

这个问题就是阻止广播还有服务以及提供者导致的,你可以关闭冻结脚本,开一遍被冻结过的脚本,然后移除冻结名单

@countrysideboy

This comment was marked as outdated.

@Teddy-Zhu
Copy link

以下为使用kill方式冻结的脚本,做了一些禁用广播接收器方面的尝试
情景模式脚本1

[
  {
    "name": "ForceIdle: continue App",
    "description": "切回前台,取消压制",
    "priority": 1,
    "condition": "frontPkgChanged == true && globalVarOf$pause.contains(to)",
    "actions": [
    "su.exe(\"kill -CONT `pgrep -f \"+ to + \"`\");",
    "if(thanos.getActivityManager().isBlockAllService(to)){thanos.getActivityManager().setBlockAllService(to,false)};",
    "if(thanos.getActivityManager().isBlockAllReceiver(to)){thanos.getActivityManager().setBlockAllReceiver(to,false)};",
    "if(thanos.getActivityManager().isBlockAllProvider(to)){thanos.getActivityManager().setBlockAllProvider(to,false)};",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(to), to, android.app.AppOpsManager.MODE_DEFAULT);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(to), to, android.app.AppOpsManager.MODE_DEFAULT);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_WAKE_LOCK, thanos.getPkgManager().getUidForPkgName(to), to, android.app.AppOpsManager.MODE_DEFAULT);",
    "if(thanos.getActivityManager().isPkgSmartStandByEnabled(to)){thanos.getActivityManager().setPkgSmartStandByEnabled(to,false)};",
    "su.exe(\"am set-standby-bucket \" +to +\" rare\");"
    ]
  }
]

情景模式脚本2

[
  {
    "name": "ForceIdle: pause App",
    "description": "切到后台,自动压制",
    "priority": 2,
    "condition": "frontPkgChanged == true && globalVarOf$pause.contains(from) && activity.getFrontAppPackage()!=\"android\" ",
    "actions": [ 
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_ANY_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(from), from, android.app.AppOpsManager.MODE_IGNORED);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_RUN_IN_BACKGROUND, thanos.getPkgManager().getUidForPkgName(from), from, android.app.AppOpsManager.MODE_IGNORED);",
    "context.getSystemService(context.APP_OPS_SERVICE).setMode(android.app.AppOpsManager.OP_WAKE_LOCK, thanos.getPkgManager().getUidForPkgName(from), from, android.app.AppOpsManager.MODE_IGNORED);",
    "if(thanos.getActivityManager().isBlockAllService(from)==false){thanos.getActivityManager().setBlockAllService(from,true)};",
    "if(thanos.getActivityManager().isBlockAllReceiver(from)==false){thanos.getActivityManager().setBlockAllReceiver(from,true)};",
    "if(thanos.getActivityManager().isBlockAllProvider(from)==false){thanos.getActivityManager().setBlockAllProvider(from,true)};",
    "su.exe(\"am send-trim-memory \" +from+ \" TRIM_MEMORY_RUNNING_CRITICAL\");",
    "if(activity.isInactive(from)==false){activity.setInactive(from)};",
    "if(thanos.getActivityManager().isPackageIdle(from)==false){thanos.getActivityManager().idlePackage(from)};",
    "actor.delayed(15000,\"if(activity.getFrontAppPackage()!=from){su.exe(\\\"am make-uid-idle \\\" +from);su.exe(\\\"am set-standby-bucket \\\" +from +\\\" restricted\\\");su.exe(\\\"kill -STOP `pgrep -f \\\"+ from+ \\\"`\\\")}\");"
    ] 
  }
]

已更新,希望最终能不用su.exe,调用系统api实现,比如sendsignal等

发现如果直接把全局变量的软件取消后会出现奇怪的问题 比如qq和微信是连不上网 接不到新消息,停止应用和重新开机都不行恢复,只有停止冻结的那个情景模式,而且解冻的那个情景模式得开启,再打开一次软件才恢复正常,如果有人看到这个问题,请使用这个方法恢复app。

这个阻止广播还有服务以及提供者还会因为开关vpn之后网络异常, 副作用挺大的 , 比如软件开着vpn 回到桌面, 关闭vpn,15s后再打开软件,软件依旧无法上网,需要重新打开vpn之后才能正常连接网络

@countrysideboy

This comment was marked as outdated.

@Moderpach
Copy link

现在thanox能实现识别显示在应用上层的服务和前台服务以防止这些应用被墓碑吗

@countrysideboy
Copy link
Contributor Author

现在thanox能实现识别显示在应用上层的服务和前台服务以防止这些应用被墓碑吗

不清楚,暂时没找到方法

@countrysideboy

This comment was marked as outdated.

@simplerick-simplefun
Copy link

simplerick-simplefun commented Jul 7, 2022

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。 程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

不是那么简单。wifi环境下网络流量不走手机基带,也会有基带耗电。说白了就是手机维持一个电信信号就要耗电。手机离信号基站越近、接收的信号越强,耗电越少。耗电上5G>4G>3G。这方面我怀疑联发科的优化做得也没有高通好。

你看清我说的是拔sim和插sim对比,和WIFI一点关系都没有

拔掉sim卡,或者直接在手机里面禁用sim,比如飞行模式,确实可以省电,但是这样就无法接打电话了。 保留电话信号的话,应用使用网络流量带来的耗电则是可以忽略的;主要是要限制唤醒和后台前台服务。

牛头不对马嘴的回复,能请您看完别人打的字再回吗?如果您不看就回,就请您不要再回了,您是把github issues当论坛闲聊板块了吗?

是你自己讲: 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。 我给你的回复是说你的这个思路在实际使用中没有用处。你拔了sim就不用让那些app认为无网络。你插上sim让那些app认为无网络也不省电,因为基带保持电话信号就是耗电的主体,而使用这个信号于一些后台app的网络流量对于基带维持信号的耗电相比可以忽略。更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

谁告诉您基带待机很费电的?恢复出厂后4g待机就挺省电的,安装一大堆软件后待机就很费电,拔sim卡后待机特别省电,这还不能说明问题?您去看看运营商规定的4g/5g终端待机电流是多少?谁告诉您或者说您是经过什么测试后认为“一些后台app的网络流量对于基带维持信号的耗电相比可以忽略”?而且毒瘤软件在后台持续、频繁、反复联网还会导致系统无法正常休眠,这也是大量垃圾软件在后台联网间接导致的费电,所以只要让它们认为当前手机无网络自然就省电了。

更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

最后我再说一遍,我一开始就说了我是根据自己的实测,提供一个思路:让APP认为系统无网络。我可没说让大家拔sim卡省电。您的理解能力是谁遗传给您的?

请不要把国内中文社区的抬杠文化搬到github。我一直都是在给出信息,尝试在帮助大家。
首先,就像几小时前countrysideboy提出的:

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。
程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。
提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

我怀疑就是基带耗电,因为实验机不插卡只开着wifi也挺省电。另外,理论上说,暂停了进程,应该对app来说网络活动也暂停,不走流量的

当我们通过各种方式,包括但不限于:thanox乖巧模式、冻结应用、绿色守护、thanox情景模式脚本等方式,减少、降低乃至停止了应用在后台的服务和唤醒,那么应用在后台就没有计算,没有cpu使用,也不会有网络开销。

其次,手机的基带耗电这件事,从10年前就有这方面的新闻和研究。具体的来讲,1.用户手机终端与信号塔基站越远、信号越弱,耗电越高。2.普遍的来讲,2G<3G<4G<5G。3.不同的信号频段的连接耗电也不同。4.不同的运营商的在手机和信号基站两边的配置、优化也影响耗电。5.不同的soc芯片,基带耗电也不同·。只能说,如果想要基带省电,可以根据自己的情况,自己调整设置3G/4G/5G。我前面最开始说的就是这个意思,限于手机回复,没说得很详细。根据我实际测试和网上的网友反馈,在信号强度都相对较好的情况下,5G换到4G、4G换到3G都是能有明显省电的。不推荐2G第一是因为2G下的SMS有安全缺陷,会被攻击,第二是因为现在2G几乎没有了。我之前没有说得很详细,还有一个原因是5G和4G分别有对应的VoNR和VoLTE,如果5G换到4G,或5G/4G换到3G,就会丢失这个功能,那就需要用户自己考虑自己的需求自己判断如何使用。

第三,一般手机休眠状态下,经过手机系统和用户手动设置的对于流氓软件的压制,后台的网络流量不会太多:一般都是微信这样的保持长连接,时不时发送几个小packet。这种情况下的应用网络流量,即便走的手机信号基带,也不会明显增大基带耗电。在这种情况下,主要的基带耗电在于维持手机信号,少许的网络流量的增加耗电与之相比可以忽略不计。如果是像手机网游那样一直传输数据,或者有应用在后台不断上传下载文件/数据,那么才会明显增大耗电。因此,你的情况不代表别人的情况。

第四,大部分人的使用场景是平时户外用流量,室内连wifi。而手机休眠大部分情况是室内。所以wifi下无需考虑应用后台流量走基带耗电。另一方面,既然在这个issue讨论,那么大家都是尽量限制应用的后台活动。你把活动限制住了,也就没有网络资源消耗了,也就没有基带耗电了。根据你的反馈,很有可能你手机上的应用在后台的活动比较多,网络资源使用比较多,超出了正常合理的(此处合理以google的推荐标准为准)活动量和网络使用量。那么正当的应对策略应该是限制这些应用的后台活动:把不必要的活动限制掉了,自然也就没有那么多网络使用,剩下的那一点push notification的流量还不至于有明显耗电。
另外,你说的情况,还有可能是你的手机后台应用不断地活动打扰了安卓正常的doze,使得手机没有使用时依然保持较高的cpu和ram的频率。这时如果把网络彻底关掉,有的应用是能够监测到网络关闭或网络连接失败的,那么这些应用就会暂停后台活动,等网络恢复再恢复后台。很多广告联盟模块和聚合推送模块都有乱七八糟的骚操作。尤其是聚合推送,你网络都没有了它自然就暂停了。
我建议你在手机上安装一个betterbatterystats,监测一下,就能看出来,是什么耗电的了。

最后,有什么想法,建议首先google搜索一下,自己研究一下。不要上来就开喷。github是用来分享知识合作建设的,不是用来抬杠的。然后,回复你最初的思路:“让APP认为系统无网络”没有实际操作价值。

@Gokou-Ruri
Copy link

Gokou-Ruri commented Jul 7, 2022

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。 程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

不是那么简单。wifi环境下网络流量不走手机基带,也会有基带耗电。说白了就是手机维持一个电信信号就要耗电。手机离信号基站越近、接收的信号越强,耗电越少。耗电上5G>4G>3G。这方面我怀疑联发科的优化做得也没有高通好。

你看清我说的是拔sim和插sim对比,和WIFI一点关系都没有

拔掉sim卡,或者直接在手机里面禁用sim,比如飞行模式,确实可以省电,但是这样就无法接打电话了。 保留电话信号的话,应用使用网络流量带来的耗电则是可以忽略的;主要是要限制唤醒和后台前台服务。

牛头不对马嘴的回复,能请您看完别人打的字再回吗?如果您不看就回,就请您不要再回了,您是把github issues当论坛闲聊板块了吗?

是你自己讲: 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。 我给你的回复是说你的这个思路在实际使用中没有用处。你拔了sim就不用让那些app认为无网络。你插上sim让那些app认为无网络也不省电,因为基带保持电话信号就是耗电的主体,而使用这个信号于一些后台app的网络流量对于基带维持信号的耗电相比可以忽略。更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

谁告诉您基带待机很费电的?恢复出厂后4g待机就挺省电的,安装一大堆软件后待机就很费电,拔sim卡后待机特别省电,这还不能说明问题?您去看看运营商规定的4g/5g终端待机电流是多少?谁告诉您或者说您是经过什么测试后认为“一些后台app的网络流量对于基带维持信号的耗电相比可以忽略”?而且毒瘤软件在后台持续、频繁、反复联网还会导致系统无法正常休眠,这也是大量垃圾软件在后台联网间接导致的费电,所以只要让它们认为当前手机无网络自然就省电了。

更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

最后我再说一遍,我一开始就说了我是根据自己的实测,提供一个思路:让APP认为系统无网络。我可没说让大家拔sim卡省电。您的理解能力是谁遗传给您的?

请不要把国内中文社区的抬杠文化搬到github。我一直都是在给出信息,尝试在帮助大家。 首先,就像几小时前countrysideboy提出的:

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。
程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。
提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

我怀疑就是基带耗电,因为实验机不插卡只开着wifi也挺省电。另外,理论上说,暂停了进程,应该对app来说网络活动也暂停,不走流量的

当我们通过各种方式,包括但不限于:thanox乖巧模式、冻结应用、绿色守护、thanox情景模式脚本等方式,减少、降低乃至停止了应用在后台的服务和唤醒,那么应用在后台就没有计算,没有cpu使用,也不会有网络开销。

其次,手机的基带耗电这件事,从10年前就有这方面的新闻和研究。具体的来讲,1.用户手机终端与信号塔基站越远、信号越弱,耗电越高。2.普遍的来讲,2G<3G<4G<5G。3.不同的信号频段的连接耗电也不同。4.不同的运营商的在手机和信号基站两边的配置、优化也影响耗电。5.不同的soc芯片,基带耗电也不同·。只能说,如果想要基带省电,可以根据自己的情况,自己调整设置3G/4G/5G。我前面最开始说的就是这个意思,限于手机回复,没说得很详细。根据我实际测试和网上的网友反馈,在信号强度都相对较好的情况下,5G换到4G、4G换到3G都是能有明显省电的。不推荐2G第一是因为2G下的SMS有安全缺陷,会被攻击,第二是因为现在2G几乎没有了。我之前没有说得很详细,还有一个原因是5G和4G分别有对应的VoNR和VoLTE,如果5G换到4G,或5G/4G换到3G,就会丢失这个功能,那就需要用户自己考虑自己的需求自己判断如何使用。

第三,一般手机休眠状态下,经过手机系统和用户手动设置的对于流氓软件的压制,后台的网络流量不会太多:一般都是微信这样的保持长连接,时不时发送几个小packet。这种情况下的应用网络流量,即便走的手机信号基带,也不会明显增大基带耗电。在这种情况下,主要的基带耗电在于维持手机信号,少许的网络流量的增加耗电与之相比可以忽略不计。如果是像手机网游那样一直传输数据,或者有应用在后台不断上传下载文件/数据,那么才会明显增大耗电。因此,你的情况不代表别人的情况。

第四,大部分人的使用场景是平时户外用流量,室内连wifi。而手机休眠大部分情况是室内。所以wifi下无需考虑应用后台流量走基带耗电。另一方面,既然在这个issue讨论,那么大家都是尽量限制应用的后台活动。你把活动限制住了,也就没有网络资源消耗了,也就没有基带耗电了。根据你的反馈,很有可能你手机上的应用在后台的活动比较多,网络资源使用比较多,超出了正常合理的(此处合理以google的推荐标准为准)活动量和网络使用量。那么正当的应对策略应该是限制这些应用的后台活动:把不必要的活动限制掉了,自然也就没有那么多网络使用,剩下的那一点push notification的流量还不至于有明显耗电。 另外,你说的情况,还有可能是你的手机后台应用不断地活动打扰了安卓正常的doze,使得手机没有使用时依然保持较高的cpu和ram的频率。这时如果把网络彻底关掉,有的应用是能够监测到网络关闭或网络连接失败的,那么这些应用就会暂停后台活动,等网络恢复再恢复后台。很多广告联盟模块和聚合推送模块都有乱七八糟的骚操作。尤其是聚合推送,你网络都没有了它自然就暂停了。 我建议你在手机上安装一个betterbatterystats,监测一下,就能看出来,是什么耗电的了。

最后,有什么想法,建议首先google搜索一下,自己研究一下。不要上来就开喷。github是用来分享知识合作建设的,不是用来抬杠的。然后,回复你最初的思路:“让APP认为系统无网络”没有实际操作价值。

github是用来分享知识合作建设的,不是用来抬杠的。

您可真行,您自己正在干的事不让别人干?

最后,有什么想法,建议首先google搜索一下,自己研究一下。不要上来就开喷。

凡事想当然然后反咬对方应该多Google多研究?

您上面这堆废话大部分与我的论点毫无关系,例如您反复扯3g/4g/5g网络切换这跟我的观点有任何关系吗?您是不是认为字多就能占理?
Thanox要是能压得住后台APP耗电情况,您认为本issue为何存在?
在多人均反馈待机时APP后台联网导致耗电且有实测的情况下,您为何依旧想当然地固执己见认为APP只要服务和进程被限制,待机就能省电?您敢不敢拔sim卡待机试试?动嘴永远比动手容易。
连suspend和force-stop都压不住部分毒瘤软件更何况是您所谓的“限制服务和进程”?您就是Android之父?
请您倒回去看看您第一次回复我的那条评论,您当真认为您对其他用户给予了最起码的尊重认真看完对方的话再评论?搁那儿自说自话加戏我好心劝您认真看完再回,结果您马上又来个光速回帖并且再次做到了不看先回,先杠完再考虑其它?或者根本不考虑其它?

您的讨论于我、于其他用户有价值,我不至于屡次三番劝您认真看完再回我,我是最后一次请您不要再回复一些和我的观点毫无关系的内容了,也请您不要反咬。您第一次回我时的内容就非常莫名其妙,后面更是变本加厉,要说喷也是您在喷我。
无论结果如何我不会再参与和您的讨论,因为您在浪费我的时间。如果您认为自己的时间没有价值,您可以继续,但我不会再参与,您自便。

@jiwangyihao
Copy link

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。 程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

不是那么简单。wifi环境下网络流量不走手机基带,也会有基带耗电。说白了就是手机维持一个电信信号就要耗电。手机离信号基站越近、接收的信号越强,耗电越少。耗电上5G>4G>3G。这方面我怀疑联发科的优化做得也没有高通好。

你看清我说的是拔sim和插sim对比,和WIFI一点关系都没有

拔掉sim卡,或者直接在手机里面禁用sim,比如飞行模式,确实可以省电,但是这样就无法接打电话了。 保留电话信号的话,应用使用网络流量带来的耗电则是可以忽略的;主要是要限制唤醒和后台前台服务。

牛头不对马嘴的回复,能请您看完别人打的字再回吗?如果您不看就回,就请您不要再回了,您是把github issues当论坛闲聊板块了吗?

是你自己讲: 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。 我给你的回复是说你的这个思路在实际使用中没有用处。你拔了sim就不用让那些app认为无网络。你插上sim让那些app认为无网络也不省电,因为基带保持电话信号就是耗电的主体,而使用这个信号于一些后台app的网络流量对于基带维持信号的耗电相比可以忽略。更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

谁告诉您基带待机很费电的?恢复出厂后4g待机就挺省电的,安装一大堆软件后待机就很费电,拔sim卡后待机特别省电,这还不能说明问题?您去看看运营商规定的4g/5g终端待机电流是多少?谁告诉您或者说您是经过什么测试后认为“一些后台app的网络流量对于基带维持信号的耗电相比可以忽略”?而且毒瘤软件在后台持续、频繁、反复联网还会导致系统无法正常休眠,这也是大量垃圾软件在后台联网间接导致的费电,所以只要让它们认为当前手机无网络自然就省电了。

更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

最后我再说一遍,我一开始就说了我是根据自己的实测,提供一个思路:让APP认为系统无网络。我可没说让大家拔sim卡省电。您的理解能力是谁遗传给您的?

请不要把国内中文社区的抬杠文化搬到github。我一直都是在给出信息,尝试在帮助大家。 首先,就像几小时前countrysideboy提出的:

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。
程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。
提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

我怀疑就是基带耗电,因为实验机不插卡只开着wifi也挺省电。另外,理论上说,暂停了进程,应该对app来说网络活动也暂停,不走流量的

当我们通过各种方式,包括但不限于:thanox乖巧模式、冻结应用、绿色守护、thanox情景模式脚本等方式,减少、降低乃至停止了应用在后台的服务和唤醒,那么应用在后台就没有计算,没有cpu使用,也不会有网络开销。

其次,手机的基带耗电这件事,从10年前就有这方面的新闻和研究。具体的来讲,1.用户手机终端与信号塔基站越远、信号越弱,耗电越高。2.普遍的来讲,2G<3G<4G<5G。3.不同的信号频段的连接耗电也不同。4.不同的运营商的在手机和信号基站两边的配置、优化也影响耗电。5.不同的soc芯片,基带耗电也不同·。只能说,如果想要基带省电,可以根据自己的情况,自己调整设置3G/4G/5G。我前面最开始说的就是这个意思,限于手机回复,没说得很详细。根据我实际测试和网上的网友反馈,在信号强度都相对较好的情况下,5G换到4G、4G换到3G都是能有明显省电的。不推荐2G第一是因为2G下的SMS有安全缺陷,会被攻击,第二是因为现在2G几乎没有了。我之前没有说得很详细,还有一个原因是5G和4G分别有对应的VoNR和VoLTE,如果5G换到4G,或5G/4G换到3G,就会丢失这个功能,那就需要用户自己考虑自己的需求自己判断如何使用。

第三,一般手机休眠状态下,经过手机系统和用户手动设置的对于流氓软件的压制,后台的网络流量不会太多:一般都是微信这样的保持长连接,时不时发送几个小packet。这种情况下的应用网络流量,即便走的手机信号基带,也不会明显增大基带耗电。在这种情况下,主要的基带耗电在于维持手机信号,少许的网络流量的增加耗电与之相比可以忽略不计。如果是像手机网游那样一直传输数据,或者有应用在后台不断上传下载文件/数据,那么才会明显增大耗电。因此,你的情况不代表别人的情况。

第四,大部分人的使用场景是平时户外用流量,室内连wifi。而手机休眠大部分情况是室内。所以wifi下无需考虑应用后台流量走基带耗电。另一方面,既然在这个issue讨论,那么大家都是尽量限制应用的后台活动。你把活动限制住了,也就没有网络资源消耗了,也就没有基带耗电了。根据你的反馈,很有可能你手机上的应用在后台的活动比较多,网络资源使用比较多,超出了正常合理的(此处合理以google的推荐标准为准)活动量和网络使用量。那么正当的应对策略应该是限制这些应用的后台活动:把不必要的活动限制掉了,自然也就没有那么多网络使用,剩下的那一点push notification的流量还不至于有明显耗电。 另外,你说的情况,还有可能是你的手机后台应用不断地活动打扰了安卓正常的doze,使得手机没有使用时依然保持较高的cpu和ram的频率。这时如果把网络彻底关掉,有的应用是能够监测到网络关闭或网络连接失败的,那么这些应用就会暂停后台活动,等网络恢复再恢复后台。很多广告联盟模块和聚合推送模块都有乱七八糟的骚操作。尤其是聚合推送,你网络都没有了它自然就暂停了。 我建议你在手机上安装一个betterbatterystats,监测一下,就能看出来,是什么耗电的了。

最后,有什么想法,建议首先google搜索一下,自己研究一下。不要上来就开喷。github是用来分享知识合作建设的,不是用来抬杠的。然后,回复你最初的思路:“让APP认为系统无网络”没有实际操作价值。

github是用来分享知识合作建设的,不是用来抬杠的。

您可真行,您自己正在干的事不让别人干?

最后,有什么想法,建议首先google搜索一下,自己研究一下。不要上来就开喷。

凡事想当然然后反咬对方应该多Google多研究?

您上面这堆废话大部分与我的论点毫无关系,例如您反复扯3g/4g/5g网络切换这跟我的观点有任何关系吗?您是不是认为字多就能占理?
Thanox要是能压得住后台APP耗电情况,您认为本issue为何存在?
在多人均反馈待机时APP后台联网导致耗电且有实测的情况下,您为何依旧想当然地固执己见认为APP只要服务和进程被限制,待机就能省电?您敢不敢拔sim卡待机试试?动嘴永远比动手容易。
连suspend和force-stop都压不住部分毒瘤软件更何况是您所谓的“限制服务和进程”?您就是Android之父?
请您倒回去看看您第一次回复我的那条评论,您当真认为您对其他用户给予了最起码的尊重认真看完对方的话再评论?搁那儿自说自话加戏我好心劝您认真看完再回,结果您马上又来个光速回帖并且再次做到了不看先回,先杠完再考虑其它?或者根本不考虑其它?

您的讨论于我、于其他用户有价值,我不至于屡次三番劝您认真看完再回我,我是最后一次请您不要再回复一些和我的观点毫无关系的内容了,也请您不要反咬。您第一次回我时的内容就非常莫名其妙,后面更是变本加厉,要说喷也是您在喷我。
无论结果如何我不会再参与和您的讨论,因为您在浪费我的时间。如果您认为自己的时间没有价值,您可以继续,但我不会再参与,您自便。

他的意思应该是APP后台联网的确会导致耗电,但是在正常合理的情况下APP的这一部分耗电不管走WIFI还是走流量都没有区别。

关于拔sim卡的问题,他也解释了:拔sim卡的确能省电,但这不是因为APP的网络请求走WIFI导致省电或者说APP的网络请求减少导致省电,而主要是因为手机不插sim卡无需连接电信信号减少了功耗(我并未实际测试,不确定这个说法的正确性)

最后,就我个人而言,您二位说的都很有道理。
simplefun的观点是:插拔sim卡区别在于电信信号的连接而非网络请求的多少,以及如果能限制住进程活动自然就没有了网络请求,因此无需研究这种方法。
您的观点是:在实验中拔SIM卡的确增加了省电效果,据此推断限制APP的后台网络请求可以更好的省电。
我的看法是,省电的核心依然是限制后台进程的活动。但是,在无法完全压制毒瘤的情况下,限制网络请求当然也是限制后台活动的一个重要部分。

最后的最后,感觉您二位压根没在一个频道上😂,大家应该都多点耐心才是。

@simplerick-simplefun
Copy link

simplerick-simplefun commented Jul 8, 2022

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。 程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

不是那么简单。wifi环境下网络流量不走手机基带,也会有基带耗电。说白了就是手机维持一个电信信号就要耗电。手机离信号基站越近、接收的信号越强,耗电越少。耗电上5G>4G>3G。这方面我怀疑联发科的优化做得也没有高通好。

你看清我说的是拔sim和插sim对比,和WIFI一点关系都没有

拔掉sim卡,或者直接在手机里面禁用sim,比如飞行模式,确实可以省电,但是这样就无法接打电话了。 保留电话信号的话,应用使用网络流量带来的耗电则是可以忽略的;主要是要限制唤醒和后台前台服务。

牛头不对马嘴的回复,能请您看完别人打的字再回吗?如果您不看就回,就请您不要再回了,您是把github issues当论坛闲聊板块了吗?

是你自己讲: 提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。 我给你的回复是说你的这个思路在实际使用中没有用处。你拔了sim就不用让那些app认为无网络。你插上sim让那些app认为无网络也不省电,因为基带保持电话信号就是耗电的主体,而使用这个信号于一些后台app的网络流量对于基带维持信号的耗电相比可以忽略。更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

谁告诉您基带待机很费电的?恢复出厂后4g待机就挺省电的,安装一大堆软件后待机就很费电,拔sim卡后待机特别省电,这还不能说明问题?您去看看运营商规定的4g/5g终端待机电流是多少?谁告诉您或者说您是经过什么测试后认为“一些后台app的网络流量对于基带维持信号的耗电相比可以忽略”?而且毒瘤软件在后台持续、频繁、反复联网还会导致系统无法正常休眠,这也是大量垃圾软件在后台联网间接导致的费电,所以只要让它们认为当前手机无网络自然就省电了。

更何况大部分人不可能拔sim,大家要接电话的。 这样说是否清楚?

最后我再说一遍,我一开始就说了我是根据自己的实测,提供一个思路:让APP认为系统无网络。我可没说让大家拔sim卡省电。您的理解能力是谁遗传给您的?

请不要把国内中文社区的抬杠文化搬到github。我一直都是在给出信息,尝试在帮助大家。 首先,就像几小时前countrysideboy提出的:

我发现只要把sim卡拔了待机就特别省电,插卡(4g待机)就特别费电。
程序在后台费电不一定是因为吃CPU,也可能是因为网络传输导致基带费电,现如今基带耗电并不比CPU低多少,高速传输甚至比CPU还费电。
提供一个压后台思路:对某些网络依赖不太高的非IM软件可不可以让它们在待机时认为手机处于“无网络”状态?这样的话APP估计就不会频繁进行网络传输消耗电量了。

我怀疑就是基带耗电,因为实验机不插卡只开着wifi也挺省电。另外,理论上说,暂停了进程,应该对app来说网络活动也暂停,不走流量的

当我们通过各种方式,包括但不限于:thanox乖巧模式、冻结应用、绿色守护、thanox情景模式脚本等方式,减少、降低乃至停止了应用在后台的服务和唤醒,那么应用在后台就没有计算,没有cpu使用,也不会有网络开销。
其次,手机的基带耗电这件事,从10年前就有这方面的新闻和研究。具体的来讲,1.用户手机终端与信号塔基站越远、信号越弱,耗电越高。2.普遍的来讲,2G<3G<4G<5G。3.不同的信号频段的连接耗电也不同。4.不同的运营商的在手机和信号基站两边的配置、优化也影响耗电。5.不同的soc芯片,基带耗电也不同·。只能说,如果想要基带省电,可以根据自己的情况,自己调整设置3G/4G/5G。我前面最开始说的就是这个意思,限于手机回复,没说得很详细。根据我实际测试和网上的网友反馈,在信号强度都相对较好的情况下,5G换到4G、4G换到3G都是能有明显省电的。不推荐2G第一是因为2G下的SMS有安全缺陷,会被攻击,第二是因为现在2G几乎没有了。我之前没有说得很详细,还有一个原因是5G和4G分别有对应的VoNR和VoLTE,如果5G换到4G,或5G/4G换到3G,就会丢失这个功能,那就需要用户自己考虑自己的需求自己判断如何使用。
第三,一般手机休眠状态下,经过手机系统和用户手动设置的对于流氓软件的压制,后台的网络流量不会太多:一般都是微信这样的保持长连接,时不时发送几个小packet。这种情况下的应用网络流量,即便走的手机信号基带,也不会明显增大基带耗电。在这种情况下,主要的基带耗电在于维持手机信号,少许的网络流量的增加耗电与之相比可以忽略不计。如果是像手机网游那样一直传输数据,或者有应用在后台不断上传下载文件/数据,那么才会明显增大耗电。因此,你的情况不代表别人的情况。
第四,大部分人的使用场景是平时户外用流量,室内连wifi。而手机休眠大部分情况是室内。所以wifi下无需考虑应用后台流量走基带耗电。另一方面,既然在这个issue讨论,那么大家都是尽量限制应用的后台活动。你把活动限制住了,也就没有网络资源消耗了,也就没有基带耗电了。根据你的反馈,很有可能你手机上的应用在后台的活动比较多,网络资源使用比较多,超出了正常合理的(此处合理以google的推荐标准为准)活动量和网络使用量。那么正当的应对策略应该是限制这些应用的后台活动:把不必要的活动限制掉了,自然也就没有那么多网络使用,剩下的那一点push notification的流量还不至于有明显耗电。 另外,你说的情况,还有可能是你的手机后台应用不断地活动打扰了安卓正常的doze,使得手机没有使用时依然保持较高的cpu和ram的频率。这时如果把网络彻底关掉,有的应用是能够监测到网络关闭或网络连接失败的,那么这些应用就会暂停后台活动,等网络恢复再恢复后台。很多广告联盟模块和聚合推送模块都有乱七八糟的骚操作。尤其是聚合推送,你网络都没有了它自然就暂停了。 我建议你在手机上安装一个betterbatterystats,监测一下,就能看出来,是什么耗电的了。
最后,有什么想法,建议首先google搜索一下,自己研究一下。不要上来就开喷。github是用来分享知识合作建设的,不是用来抬杠的。然后,回复你最初的思路:“让APP认为系统无网络”没有实际操作价值。

github是用来分享知识合作建设的,不是用来抬杠的。

您可真行,您自己正在干的事不让别人干?

最后,有什么想法,建议首先google搜索一下,自己研究一下。不要上来就开喷。

凡事想当然然后反咬对方应该多Google多研究?

您上面这堆废话大部分与我的论点毫无关系,例如您反复扯3g/4g/5g网络切换这跟我的观点有任何关系吗?您是不是认为字多就能占理? Thanox要是能压得住后台APP耗电情况,您认为本issue为何存在? 在多人均反馈待机时APP后台联网导致耗电且有实测的情况下,您为何依旧想当然地固执己见认为APP只要服务和进程被限制,待机就能省电?您敢不敢拔sim卡待机试试?动嘴永远比动手容易。 连suspend和force-stop都压不住部分毒瘤软件更何况是您所谓的“限制服务和进程”?您就是Android之父? 请您倒回去看看您第一次回复我的那条评论,您当真认为您对其他用户给予了最起码的尊重认真看完对方的话再评论?搁那儿自说自话加戏我好心劝您认真看完再回,结果您马上又来个光速回帖并且再次做到了不看先回,先杠完再考虑其它?或者根本不考虑其它?

您的讨论于我、于其他用户有价值,我不至于屡次三番劝您认真看完再回我,我是最后一次请您不要再回复一些和我的观点毫无关系的内容了,也请您不要反咬。您第一次回我时的内容就非常莫名其妙,后面更是变本加厉,要说喷也是您在喷我。 无论结果如何我不会再参与和您的讨论,因为您在浪费我的时间。如果您认为自己的时间没有价值,您可以继续,但我不会再参与,您自便。

大家都在讨论。我给出的内容都是informative,没有人在喷你。
根据你反馈的情况,我认为可以拆解成两个问题:
1.使用thanox及市场上现在存在的手段,能否压住应用后台活动。2.是否存在压不住或需要允许应用后台活动,同时需要关闭应用联网来省电的情景。
对于1.,我的看法是可以压住。请尝试以下的办法:
1)使用本issue中网友们提供的脚本,当应用退回后台时,appops 设置RUN_ANY_IN_BACKGROUND为ignore,START_FOREGROUND为deny,INSTALL_PACKAGES为deny。使用thanox关闭掉receiver、provider、service,设置AppStandbyBucket为RESTRICTED,(到这里应该已经足够切断息屏下应用后台网络使用了。后面都是干掉后台活动和wakelock/alarm
。)设置inactive,设置sendSignal(proc.pid,20)或kill -STOP。其他也许有用的还包括绿色守护的阻止关联启动功能、忽略内存优化的休眠功能(等同于直接kill)和deepsleep/nowakelock的干掉唤醒锁、同步、服务、闹钟功能。
2)对于不常用的,或不需要后台驻留的,或可以接受冷启动的应用,可以用thanox进行冻结(PM disable)+快捷方式+启动活检。这也是对付流氓应用的终极杀招之一(另一个就是直接kill,也就是kill -9,相当于设置里面结束运行)。
根据我的经验,使用这样的设置,可以做到应用退到后台后,经过5-10分钟,就可以做到完全没有后台活动了。
3)如果压不住,请附上betterbatterystats的数据,包含network、alarm、partial wakelock、cpu states、process几个tab的截图,你的手机系统信息,我们可以一起研究下。
对于2.,我的看法是基本不存在这种场景。首先,我没见过经过上述措施压不住的情况;既然要限制耗电,那就把后台活动限制掉,那网络活动自然也就限制掉了。其次,应用后台耗电的主要比重是使安卓退出doze模式,进而使cpu和ram的频率升高,并且使其他应用也开始活动。最后,有什么应用是既要保持后台运行,又要阻止联网的呢?我想绝大部分人都不使用。可以想到的只有播放下载好的音乐的应用。这种用个vlc之类的播放也不会有多余的后台活动。一定要限制联网,可以用安卓自带的系统设置功能限制。
最后,如果你想证明应用后台使用信号流量会导致严重耗电,请做一个比较:相同后台使用的情况下,都有正常电信信号,也就是wifi关闭,手机数据打开,建议设置4G模式。然后一个有电信网络开销,一个没有。可以使用iperf来测试。在本机打开两个iperf,一个用来发送,一个接收,设置每15分钟发送接收3次64KB模拟推送。使用网络开销的用互联网ip地址来发送接收,不用的情况用本机local不同端口的地址来发送接收。
插拔sim的耗电对比:由于维持信号的耗电量较大,并且无网络连接会导致很多应用减少后台活动,所以不能用插拔sim的耗电对比来说明问题。

@countrysideboy
Copy link
Contributor Author

@simplerick-simplefun @Gokou-Ruri 两位都是高手,我觉得说的都有道理。抛去基带待机耗电及流量耗电,我有点怀疑,是不是一些流氓SDK(那些分析引擎),检测到手机有sim卡,认为这手机更有价值就更活跃地在获取信息?未来想折腾一个方向,就是伪装(非全局,只针对应用)电量不足、无sim卡无服务、内存不足,以此验证猜想。

@countrysideboy

This comment was marked as duplicate.

@rc2md3
Copy link

rc2md3 commented Jul 23, 2022

使用最新版本的在线情景模式规则noactive,出现报错,看起来好像是break不支持解析,大佬帮忙看下是啥问题
@myflavor
情景模式日志
profile.log

@myflavor
Copy link
Contributor

@rc2md3 这是正常的,break是想跳出情景模式,但是实际上不支持,不过报错也可以中断执行

@rc2md3
Copy link

rc2md3 commented Jul 23, 2022

@rc2md3 这是正常的,break是想跳出情景模式,但是实际上不支持,不过报错也可以中断执行

原来是这样跳出的,谢谢

@uniking
Copy link

uniking commented Jul 27, 2022

用的最新的情景模式, 大概率发现twitter一有新消息弹窗就会卡死.
挂起的状态
OnePlus7Pro:/ # ps -A |grep twi
u0_a304 22244 758 16355392 307112 do_signal_stop 0 T com.twitter.android

启动后提示新消息弹窗的状态(这时卡死)
OnePlus7Pro:/ # ps -A |grep twi
u0_a304 22244 758 16355392 307112 binder_ioctl 0 S com.twitter.android

正常状态
OnePlus7Pro:/ # ps -A |grep twi
u0_a304 12695 758 16877004 310964 SyS_epoll_wait 0 S com.twitter.android

@simplerick-simplefun
Copy link

simplerick-simplefun commented Jul 27, 2022

用的最新的情景模式, 大概率发现twitter一有新消息弹窗就会卡死. 挂起的状态 OnePlus7Pro:/ # ps -A |grep twi u0_a304 22244 758 16355392 307112 do_signal_stop 0 T com.twitter.android

启动后提示新消息弹窗的状态(这时卡死) OnePlus7Pro:/ # ps -A |grep twi u0_a304 22244 758 16355392 307112 binder_ioctl 0 S com.twitter.android

正常状态 OnePlus7Pro:/ # ps -A |grep twi u0_a304 12695 758 16877004 310964 SyS_epoll_wait 0 S com.twitter.android

试一下这个思路:
为twitter单独添加规则,用pm suspend/disable的方式,然后手动添加检查fcm的规则,发现twitter的推送给twitter解冻一小会。

@countrysideboy
Copy link
Contributor Author

@uniking @simplerick-simplefun 再加一个情景模式感知fcm推送?我想下怎么处理好一些

@simplerick-simplefun
Copy link

simplerick-simplefun commented Jul 27, 2022

@uniking @simplerick-simplefun 再加一个情景模式感知fcm推送?我想下怎么处理好一些

其实从现实的角度考虑,没有必要在手机解锁的情况下对一些app进行冻结。尤其是有及时消息功能的应用。
因为你关闭屏幕时省电是靠doze,有应用在后台就会减少doze时间(也就是cpu超低频率运行的时间),增加cpu使用唤醒频率运行的时间。但是你解锁亮屏了本来就是唤醒的cpu频率,这时候增加一点运算和网络消耗对于耗电的影响比息屏时小。

所以设置成自动冻结,然后加一个情景模式,手机解锁后自动把自定义列表中的app拉起解冻就好了。

微信是一个特例,即便手机解锁微信在后台仍然消耗会大一些,因为腾讯用微信去给别的app推送消息,而且那些群、公众号等等即便设置成消息免打扰,微信也会实时拉取新消息。但是存在锁屏后微信语音视频通话的场景。我目前没有想出可以在锁屏后微信语音视频通话完结后自动冻结微信的办法。可能视频可以检测前端应用,但是黑屏下的语音通话怎么解决?

@uniking
Copy link

uniking commented Jul 28, 2022

就刚开始使用情景时卡过两次, 到现在也没出现过, 可能概率很低, 可以不用管了. 效果很好, 给好评.

我微信主要后台接语音, 不能墓碑. 想熄屏语音后再墓碑的, 是不是可以看语音activity组件退出后在墓碑?

@uniking
Copy link

uniking commented Jul 28, 2022

可不可以给微信等聊天软件弄个专用情景, 学习android的doze, 后台后每隔墓碑2分钟, 给20秒出墓碑的时间.这样聊天不会漏, 语音视频最多延迟2分钟,拨过去就好了.

@uniking
Copy link

uniking commented Jul 28, 2022

反馈个问题, 腾讯新闻主进程压不住, 其他进程已经stop了.

OnePlus7Pro:/ # ps -A |grep new
u0_a332 6588 763 2650384 438820 SyS_epoll_wait 0 S com.tencent.news
u0_a332 29890 763 2065736 103456 do_signal_stop 0 T com.tencent.news:wnsnetservice
u0_a332 30094 763 2054028 108872 do_signal_stop 0 T com.tencent.news:xg_vip_service

@countrysideboy
Copy link
Contributor Author

反馈个问题, 腾讯新闻主进程压不住, 其他进程已经stop了.

OnePlus7Pro:/ # ps -A |grep new u0_a332 6588 763 2650384 438820 SyS_epoll_wait 0 S com.tencent.news u0_a332 29890 763 2065736 103456 do_signal_stop 0 T com.tencent.news:wnsnetservice u0_a332 30094 763 2054028 108872 do_signal_stop 0 T com.tencent.news:xg_vip_service

请问安卓版本是?用的是顶楼最新合并版的脚本吗?另外是否有等待45秒?晚点我也去装个客户端试试

@uniking
Copy link

uniking commented Jul 28, 2022

反馈个问题, 腾讯新闻主进程压不住, 其他进程已经stop了.
OnePlus7Pro:/ # ps -A |grep new u0_a332 6588 763 2650384 438820 SyS_epoll_wait 0 S com.tencent.news u0_a332 29890 763 2065736 103456 do_signal_stop 0 T com.tencent.news:wnsnetservice u0_a332 30094 763 2054028 108872 do_signal_stop 0 T com.tencent.news:xg_vip_service

请问安卓版本是?用的是顶楼最新合并版的脚本吗?另外是否有等待45秒?晚点我也去装个客户端试试

android 11, lineageOS18.1, 用的最新的那个, 等了4,5秒, 腾讯新闻的其他进程已经停止了. app从应用宝下的.

@countrysideboy
Copy link
Contributor Author

@uniking 试下在线规则里最新的单合并脚本?我在安卓13下测试了,主进程可以压住,某安下的程序。等待四十五秒后,看下是始终压不住,还是一开始可以后面又不行了?

@uniking
Copy link

uniking commented Jul 28, 2022

@uniking 试下在线规则里最新的单合并脚本?我在安卓13下测试了,主进程可以压住,某安下的程序。等待四十五秒后,看下是始终压不住,还是一开始可以后面又不行了?

我shell下敲kill命令, 信号20对主进程不管用, 信号19可以让主进程stop, 我系统的事?

@uniking
Copy link

uniking commented Jul 28, 2022

@uniking 试下在线规则里最新的单合并脚本?我在安卓13下测试了,主进程可以压住,某安下的程序。等待四十五秒后,看下是始终压不住,还是一开始可以后面又不行了?

我shell下敲kill命令, 信号20对主进程不管用, 信号19可以让主进程stop, 我系统的事?

OnePlus7Pro:/ # ps -A |grep news
u0_a332 4752 763 2642636 426188 SyS_epoll_wait 0 S com.tencent.news
u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service
u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice
OnePlus7Pro:/ # kill -s 20 4752
OnePlus7Pro:/ # ps -A |grep news
u0_a332 4752 763 2639208 435912 SyS_epoll_wait 0 S com.tencent.news
u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service
u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice
OnePlus7Pro:/ # kill -s 19 4752
OnePlus7Pro:/ # ps -A |grep news
u0_a332 4752 763 2639648 439272 do_signal_stop 0 T com.tencent.news
u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service
u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice

@uniking
Copy link

uniking commented Jul 28, 2022

@uniking 试下在线规则里最新的单合并脚本?我在安卓13下测试了,主进程可以压住,某安下的程序。等待四十五秒后,看下是始终压不住,还是一开始可以后面又不行了?

我shell下敲kill命令, 信号20对主进程不管用, 信号19可以让主进程stop, 我系统的事?

OnePlus7Pro:/ # ps -A |grep news u0_a332 4752 763 2642636 426188 SyS_epoll_wait 0 S com.tencent.news u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice OnePlus7Pro:/ # kill -s 20 4752 OnePlus7Pro:/ # ps -A |grep news u0_a332 4752 763 2639208 435912 SyS_epoll_wait 0 S com.tencent.news u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice OnePlus7Pro:/ # kill -s 19 4752 OnePlus7Pro:/ # ps -A |grep news u0_a332 4752 763 2639648 439272 do_signal_stop 0 T com.tencent.news u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice

其他应用没这个问题, 唯一的解释可能是腾讯新闻捕获了SIGTSTP但没有停止, SIGSTOP强行让它停止了.

@uniking
Copy link

uniking commented Jul 28, 2022

@uniking 试下在线规则里最新的单合并脚本?我在安卓13下测试了,主进程可以压住,某安下的程序。等待四十五秒后,看下是始终压不住,还是一开始可以后面又不行了?

我shell下敲kill命令, 信号20对主进程不管用, 信号19可以让主进程stop, 我系统的事?

OnePlus7Pro:/ # ps -A |grep news u0_a332 4752 763 2642636 426188 SyS_epoll_wait 0 S com.tencent.news u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice OnePlus7Pro:/ # kill -s 20 4752 OnePlus7Pro:/ # ps -A |grep news u0_a332 4752 763 2639208 435912 SyS_epoll_wait 0 S com.tencent.news u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice OnePlus7Pro:/ # kill -s 19 4752 OnePlus7Pro:/ # ps -A |grep news u0_a332 4752 763 2639648 439272 do_signal_stop 0 T com.tencent.news u0_a332 21100 763 2052812 114892 do_signal_stop 0 T com.tencent.news:xg_vip_service u0_a332 21269 763 2067344 113048 do_signal_stop 0 T com.tencent.news:wnsnetservice

其他应用没这个问题, 唯一的解释可能是腾讯新闻捕获了SIGTSTP但没有停止, SIGSTOP强行让它停止了.

这可能是个兼容问题, 我自己改成了su.exe("kill -s 19 " + proc.pid);, 已经压住了.

@countrysideboy
Copy link
Contributor Author

@uniking 了解一下,是否使用了最新的脚本?是使用全局变量(pause)的添加app列表的方式,还是在app详情里面加入电量限制?

@uniking
Copy link

uniking commented Jul 28, 2022

@uniking 了解一下,是否使用了最新的脚本?是使用全局变量(pause)的添加app列表的方式,还是在app详情里面加入电量限制?

20220728更新的脚本, 两处添加程序的地方都添加了. 问题不是这个, 而是SIGTSTP在我手机上对腾讯新闻主进程无效, 改成SIGSTOP就可以了.

@countrysideboy
Copy link
Contributor Author

@uniking 了解一下,是否使用了最新的脚本?是使用全局变量(pause)的添加app列表的方式,还是在app详情里面加入电量限制?

20220728更新的脚本, 两处添加程序的地方都添加了. 问题不是这个, 而是SIGTSTP在我手机上对腾讯新闻主进程无效, 改成SIGSTOP就可以了.

有空试下把sendSignal(proc.pid,20)这一句,改成sendSignal(proc.pid,19),看看是否可行?

@uniking
Copy link

uniking commented Jul 28, 2022

@uniking 了解一下,是否使用了最新的脚本?是使用全局变量(pause)的添加app列表的方式,还是在app详情里面加入电量限制?

20220728更新的脚本, 两处添加程序的地方都添加了. 问题不是这个, 而是SIGTSTP在我手机上对腾讯新闻主进程无效, 改成SIGSTOP就可以了.

有空试下把sendSignal(proc.pid,20)这一句,改成sendSignal(proc.pid,19),看看是否可行?

不行, 直接改成19所有应用都停止不了了, 应该是没权限执行SIGSTOP, 所以我使用了su.

@countrysideboy
Copy link
Contributor Author

countrysideboy commented Jul 28, 2022

@uniking 好的,后续我尝试在脚本最前面弄个变量来选择用api还是su.exe方式。

Copy link

stale bot commented Jun 28, 2024

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.

@stale stale bot added the stale Stale issue label Jun 28, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
Status: No status
Development

No branches or pull requests