使用Termux安裝Proot Linux發行版,用RealVNC Viewer登入系統,沒過幾秒就會收到The connection closed unexpectedly
的警告!
接著回到Termux,看到終端機顯示[Process completed (signal 9) - press Enter]
的錯誤,原來是Termux的行程被Android系統中止了,但是手機RAM明明還夠用啊?
此問題源自於Android 12引入的新機制,下面簡述原因,以及提供暫時的解決方法。
1. 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]
的錯誤訊息。
2. 解決Termux的signal 9錯誤#
要解決Termux的崩潰問題,執行指令將Phantom Processes Killing停用即可,雖然會導致某些APP的背景行程跟著不受控制。
大部分Android手機皆有安裝Google Play服務框架,因為GMS會不定時覆寫裝置設定,所以要一併將其關閉。然而關閉GMS覆寫可能會導致手機卡開機,風險自負。
影片版教學
2.1. 如果手機沒有Root權限#
註:以下步驟需要用到電腦,如果沒有電腦可以嘗試用 Termux進行無線ADB偵錯。
到 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"
- 重開機,完成。
2.2. 如果手機有Root權限#
- 開啟Termux,切換到su,取得root權限
su
- 按照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"
- 重開機,完成。