Tornaco / Thanox

I am thanos! 😈 👌
https://tornaco.github.io/Thanox-Docs/
Apache License 2.0
1.98k stars 81 forks source link

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

Open countrysideboy opened 2 years ago

countrysideboy commented 2 years ago

如题,觉得目前的乖巧模式的不太压得住流氓们,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);};}}}\")};"
         ]
     }
]
jiwangyihao commented 1 year ago

我发现只要把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 commented 1 year ago

我发现只要把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 commented 1 year ago

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

countrysideboy commented 1 year ago

写了一版比较特殊的版本,不需要su.exe插件,不需要添加全局变量了(以前的脚本需要添加pause变量且加入app列表)。 开关应用是否墓碑的方式为:使用系统自带的电池设置,将目标app的“管理电池用量”设置为“受限”即可。 缺点是无法批量添加app,提供一种思路,权当系统鸡肋电量限制模式的增强版。 备注:需要安卓10以上。

情景模式脚本1

[
  {
    "name": "ForceIdle: continue App",
    "description": "切回前台,取消压制",
    "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){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)};"
    ]
  }
]

情景模式脚本2

[
  {
    "name": "ForceIdle: pause App",
    "description": "切到后台,自动压制",
    "priority": 2,
    "condition": "frontPkgChanged == true && 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",
    "actions": [
    "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(45000,\"if(activity.getFrontAppPackage()!=from){if(thanos.getActivityManager().isPackageIdle(from)==false && android.os.Build.VERSION.SDK_INT < 32){context.getSystemService(context.ACTIVITY_SERVICE).getService().makePackageIdle(from,android.os.UserHandle.USER_ALL)};if(activity.isInactive(from)==false && android.os.Build.VERSION.SDK_INT < 32){activity.setInactive(from)};context.getSystemService(context.USAGE_STATS_SERVICE).setAppStandbyBucket(from,android.app.usage.UsageStatsManager.STANDBY_BUCKET_RESTRICTED);foreach(proc:context.getSystemService(context.ACTIVITY_SERVICE).getRunningAppProcesses()){if(proc.processName.contains(from)){android.os.Process.sendSignal(proc.pid,20);}}}\");"
    ] 
  }
]

20220719更新:修复安卓13进程冻结失效的问题;尝试在安卓13环境下,不强制使app进入缓存(发现会杀后台)。

rc2md3 commented 1 year ago

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

myflavor commented 1 year ago

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

rc2md3 commented 1 year ago

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

原来是这样跳出的,谢谢

uniking commented 1 year ago

用的最新的情景模式, 大概率发现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 commented 1 year ago

用的最新的情景模式, 大概率发现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 commented 1 year ago

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

simplerick-simplefun commented 1 year ago

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

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

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

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

uniking commented 1 year ago

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

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

uniking commented 1 year ago

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

uniking commented 1 year ago

反馈个问题, 腾讯新闻主进程压不住, 其他进程已经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 commented 1 year ago

反馈个问题, 腾讯新闻主进程压不住, 其他进程已经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 commented 1 year ago

反馈个问题, 腾讯新闻主进程压不住, 其他进程已经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 commented 1 year ago

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

uniking commented 1 year ago

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

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

uniking commented 1 year ago

@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 commented 1 year ago

@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 commented 1 year ago

@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 commented 1 year ago

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

uniking commented 1 year ago

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

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

countrysideboy commented 1 year ago

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

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

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

uniking commented 1 year ago

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

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

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

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

countrysideboy commented 1 year ago

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

stale[bot] commented 4 days ago

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.