简述
使用Termux安装Proot Linux发行版,用RealVNC Viewer登入系统,没过几秒就会收到The connection closed unexpectedly的警告!
接着回到Termux,看到终端机显示[Process completed (signal 9) - press Enter]的错误,原来是Termux的行程被Android系统中止了,但是手机RAM明明还够用啊?
此问题源自于Android 12引入的新机制,下面简述原因,以及提供暂时的解决方法。
Termux发生signal 9错误的原因:agnostic-apollo在Phantom, Cached And Empty Processes一文中详述了Android 12引进的新机制。Android系统将会监控APP所fork出来的子行程,并在达到32个以上子行程后将其终止,避免占用过多CPU资源。
此一机制称为”Phantom Processes Killing”,因为开发者最害怕看到这种情况,得名影子行程杀手。
在开发者要求下,Google于Android 12L以及Android 13以上版本加入了关闭Phantom Processes Killing的选项settings_enable_monitor_phantom_procs,然而使用者还是要手动使用ADB指令关闭。因此这是Google Android的问题,Temrux开发者尚未找到正式解决办法,下面指令停用的办法是agnostic-apollo提出的。
以Termux来说,Phantom Processes Killing会导致Termux执行指令的时候被系统随机中止。Proot distro若要跑图形环境自然就会制造更多子行程了吧。尤其在切换到后台,要用VNC Viewer连线的时候,就会触发Phantom Processes Killing,不管手机RAM有多大。接著回到Termux便会看到[Process completed (signal 9) - press Enter]的错误讯息。
解决Termux的signal 9错误执行指令将Phantom Processes Killing停用即可,虽然会导致某些APP的背景行程跟著不受控制。
以下假定Android手机皆有安装Google Play服务框架,因为GMS会不定时覆写装置设定,所以要一并将其关闭。然而关闭GMS覆写可能会导致手机卡开机。
如果手机没有Root权限
点击这里到Android官网下载Windows版的Platform Tools 并且解压缩。
进入platform_tools目录,会看到ADB和Fastboot的执行档。在这里按SHIFT + 右键,开启终端机(或Powershell)。
手机开启系统设定→关于手机,版本号码点5下,之后搜寻“开发人员选项”进去开启“ADB侦错”。
将手机插上电脑,于Windows的终端机输入以下指令,在手机上同意侦错。
./adb devices
接著按照Android版本,执行以下指令
Android 12L和Android 13:
./adb shell "settings put global settings_enable_monitor_phantom_procs false"
Android 12:
./adb shell "/system/bin/device_config set_sync_disabled_for_tests persistent; /system/bin/device_config put activity_manager max_phantom_processes 2147483647"
重开机,完成。
如果手机有Root权限
开启Termux,切换到su,取得root权限
su #取得root权限
按照Android版本执行指令。
Android 12L和Android 13以上:
su -c "settings put global settings_enable_monitor_phantom_procs false"
Android 12:
su -c "/system/bin/device_config set_sync_disabled_for_tests persistent; /system/bin/device_config put activity_manager max_phantom_processes 2147483647"
重开机,完成。