diff --git a/src/components/terminal/terminal.js b/src/components/terminal/terminal.js index a21545389..c4a436b43 100644 --- a/src/components/terminal/terminal.js +++ b/src/components/terminal/terminal.js @@ -702,6 +702,9 @@ export default class TerminalComponent { const terminalValues = values.terminalSettings; + Executor.setProotDebug(terminalValues.prootDebug); + Executor.BackgroundExecutor.setProotDebug(terminalValues.prootDebug); + await Terminal.startAxs( false, () => {}, diff --git a/src/components/terminal/terminalDefaults.js b/src/components/terminal/terminalDefaults.js index c3e3d9be7..d644145c2 100644 --- a/src/components/terminal/terminalDefaults.js +++ b/src/components/terminal/terminalDefaults.js @@ -17,6 +17,7 @@ export const DEFAULT_TERMINAL_SETTINGS = { fontLigatures: false, confirmTabClose: true, failsafeMode: false, + prootDebug: false, // Touch selection settings touchSelectionTapHoldDuration: 600, touchSelectionMoveThreshold: 8, diff --git a/src/plugins/terminal/src/android/BackgroundExecutor.java b/src/plugins/terminal/src/android/BackgroundExecutor.java index f8be3b3b0..3230473af 100644 --- a/src/plugins/terminal/src/android/BackgroundExecutor.java +++ b/src/plugins/terminal/src/android/BackgroundExecutor.java @@ -52,6 +52,10 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo case "loadLibrary": loadLibrary(args.getString(0), callbackContext); return true; + case "setProotDebug": + ProcessManager.prootDebug = args.getBoolean(0); + callbackContext.success("PRoot debug " + (ProcessManager.prootDebug ? "enabled" : "disabled")); + return true; default: callbackContext.error("Unknown action: " + action); return false; diff --git a/src/plugins/terminal/src/android/Executor.java b/src/plugins/terminal/src/android/Executor.java index 5a6bdf89e..0fd14cee8 100644 --- a/src/plugins/terminal/src/android/Executor.java +++ b/src/plugins/terminal/src/android/Executor.java @@ -315,6 +315,13 @@ public boolean execute(String action, JSONArray args, CallbackContext callbackCo return true; } + if (action.equals("setProotDebug")) { + boolean enabled = args.getBoolean(0); + ProcessManager.prootDebug = enabled; + callbackContext.success("PRoot debug " + (enabled ? "enabled" : "disabled")); + return true; + } + if (action.equals("listProcesses")) { if (!isServiceBound || serviceMessenger == null) { callbackContext.success(new org.json.JSONArray()); diff --git a/src/plugins/terminal/src/android/ProcessManager.java b/src/plugins/terminal/src/android/ProcessManager.java index ce08cb003..51c94d25f 100644 --- a/src/plugins/terminal/src/android/ProcessManager.java +++ b/src/plugins/terminal/src/android/ProcessManager.java @@ -14,6 +14,7 @@ public class ProcessManager { private final Context context; + public static boolean prootDebug = false; public ProcessManager(Context context) { this.context = context; @@ -90,6 +91,10 @@ private void setupEnvironment(Map env) { env.put("ANDROID_TZ", tz.getID()); env.put("FDROID", String.valueOf(isFdroidBuild())); + + if (prootDebug) { + env.put("PROOT_VERBOSE", "2"); + } } /** diff --git a/src/plugins/terminal/www/Executor.js b/src/plugins/terminal/www/Executor.js index 268b008ab..541dcbdad 100644 --- a/src/plugins/terminal/www/Executor.js +++ b/src/plugins/terminal/www/Executor.js @@ -262,6 +262,12 @@ class Executor { exec(resolve, reject, this.ExecutorType, "loadLibrary", [path]); }); } + + setProotDebug(enabled) { + return new Promise((resolve, reject) => { + exec(resolve, reject, this.ExecutorType, "setProotDebug", [enabled]); + }); + } } //backward compatibility diff --git a/src/settings/terminalSettings.js b/src/settings/terminalSettings.js index a7cfa75fa..e8e07112b 100644 --- a/src/settings/terminalSettings.js +++ b/src/settings/terminalSettings.js @@ -35,6 +35,9 @@ export default function terminalSettings() { const terminalValues = values.terminalSettings; + Executor.setProotDebug(terminalValues.prootDebug); + Executor.BackgroundExecutor.setProotDebug(terminalValues.prootDebug); + const items = [ { key: "all_file_access", @@ -232,6 +235,13 @@ export default function terminalSettings() { info: strings["terminal:failsafe-info"], category: categories.maintenance, }, + { + key: "prootDebug", + text: "PRoot Debug", + checkbox: terminalValues.prootDebug, + info: "Enable verbose PRoot logging (PROOT_VERBOSE=2). Useful for debugging sandbox issues.", + category: categories.maintenance, + }, { key: "backup", text: strings.backup, @@ -315,6 +325,17 @@ export default function terminalSettings() { } return; + case "prootDebug": + appSettings.update({ + terminalSettings: { + ...values.terminalSettings, + [key]: value, + }, + }); + Executor.setProotDebug(value); + Executor.BackgroundExecutor.setProotDebug(value); + break; + default: appSettings.update({ terminalSettings: {