Android 墓碑机制 & pkill -19

iOS令人满意的地方在墓碑机制,而为了实现这一点,许多Magisk模块都横空出世。

剖析一下 pkill -19 暂停应用执行的玩法:

usage: pkill [-fnovx] [-SIGNAL|-l SIGNAL] [PATTERN] [-G GID,] [-g PGRP,] [-P PPID,] [-s SID,] [-t TERM,] [-U UID,] [-u EUID,]

-l      Send SIGNAL (default SIGTERM)
-V      Verbose
-f      Check full command line for PATTERN
-G      Match real Group ID(s)
-g      Match Process Group(s) (0 is current user)
-n      Newest match only
-o      Oldest match only
-P      Match Parent Process ID(s)
-s      Match Session ID(s) (0 for current)
-t      Match Terminal(s)
-U      Match real User ID(s)
-u      Match effective User ID(s)
-v      Negate the match
-x      Match whole command (not substring)

简而言之,我们只需要 pkill -19 -f “APP进程” 即可。

一个进程被 pkill -19 后会暂停执行内容,例如如果你在播放时 pkill -19 -f “com.bilibili.app.in:ijkservice” 后(IJKService 为b站的播放器),整个b站的Activity会静止无法操作(但是弹幕能够继续播放),只有等到你把他删掉后台或者 pkill -SIGCONT -f “com.bilibili.app.in:ijkservice” 进程才可继续执行。

上面进程除 ijkservice 都被暂停执行了,虽然占用着内存,但是不会占用cpu资源。

模块

我们以@l奋斗的小青年的墓碑后台 kill 19 为例:

使用了 inotifywait 来监听顶层的app (/dev/cpuset/top-app/)变动,随后启动了一个循环遍历运行中的应用,循环由此开始。

第一个判断,首先是最上方的:

这一段用于声明变量,是否是白名单,是否是顶层应用,是否是系统应用,是否是黑名单应用等等。

随后进行一个超大嵌套if,在嵌套顶层判断循环到的活跃应用是否是微信,是微信就判断用户是否正在使用微信,否则执行特定的杀死进程以减少后台占用。而框外的第一个else内则是对正常进程的处理->冻结。

看到代码的末尾,判断应用是否是安卓系统后进入墓碑,此处应该是对黑名单应用的特例判断。

不推荐使用这种写法写代码,太史山了,嵌套if可以使用 if [[ sth && sth ]]; then ,变量名可以使用意义更明确的英文。

至于 appos set WAKE_LOCK 则是忽略其他应用的唤醒。

我修改了一点内容使它不盲目杀进程而是可以根据黑名单冻结特定多进程程序的子进程(如 com.bilibili.app.in:download 等)。于https://114.55.116.36:99/WNetdisk/的mb1.zip下载(没有优化代码,仅添加了功能,因为我尝试改了几个变量名程序就跑不起来了)

发表回复