From ddaecc7042b094336c952204895c1b6fbf2737ef Mon Sep 17 00:00:00 2001 From: Akash Yadav Date: Wed, 15 Nov 2023 10:44:06 +0530 Subject: [PATCH] fix(terminal): use TermuxShellEnvironment for retrieving the env vars --- .../androidide/BuildToolsInstallerTest.kt | 5 +- .../assets/data/arm64-v8a/libhook.so | Bin 6088 -> 0 bytes .../assets/data/armeabi-v7a/libhook.so | Bin 4452 -> 0 bytes .../services/builder/GradleBuildService.kt | 4 +- .../services/builder/ToolingServerRunner.kt | 4 +- .../itsaky/androidide/utils/Environment.java | 83 ++++-------------- .../environment/AndroidShellEnvironment.java | 4 +- .../environment/TermuxShellEnvironment.java | 13 +-- 8 files changed, 33 insertions(+), 80 deletions(-) delete mode 100755 app/src/arm64-v8a/assets/data/arm64-v8a/libhook.so delete mode 100755 app/src/armeabi-v7a/assets/data/armeabi-v7a/libhook.so diff --git a/app/src/androidTest/java/com/itsaky/androidide/BuildToolsInstallerTest.kt b/app/src/androidTest/java/com/itsaky/androidide/BuildToolsInstallerTest.kt index c1a14a766..10a31a3be 100644 --- a/app/src/androidTest/java/com/itsaky/androidide/BuildToolsInstallerTest.kt +++ b/app/src/androidTest/java/com/itsaky/androidide/BuildToolsInstallerTest.kt @@ -18,15 +18,18 @@ package com.itsaky.androidide import android.util.Log +import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.common.truth.Truth.assertThat import com.itsaky.androidide.R.string +import com.itsaky.androidide.app.IDEApplication import com.itsaky.androidide.shell.executeProcessAsync import com.itsaky.androidide.testing.android.clickAndWaitForWindowUpdate import com.itsaky.androidide.testing.android.findObjectWithText import com.itsaky.androidide.testing.android.hasObjectWithText import com.itsaky.androidide.testing.android.launchAndroidIDE import com.itsaky.androidide.utils.Environment +import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment import org.junit.Test import org.junit.runner.RunWith @@ -84,7 +87,7 @@ class BuildToolsInstallerTest { val process = executeProcessAsync { redirectErrorStream = true workingDirectory = null - environment = Environment.getEnvironment() + environment = TermuxShellEnvironment().getEnvironment(ApplicationProvider.getApplicationContext(), false) command = listOf(Environment.SHELL.absolutePath, "-c", cmd).also { Log.d(TAG, "setupDevice: Full command : ${it.joinToString(separator = " ")}") } diff --git a/app/src/arm64-v8a/assets/data/arm64-v8a/libhook.so b/app/src/arm64-v8a/assets/data/arm64-v8a/libhook.so deleted file mode 100755 index 7465f4c94a6323dbdcb1bf5b966838053b7c3d85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6088 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 diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt index bb237d680..22f2d7791 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt +++ b/app/src/main/java/com/itsaky/androidide/services/builder/GradleBuildService.kt @@ -62,6 +62,7 @@ import com.itsaky.androidide.tooling.api.messages.toLogLine import com.itsaky.androidide.tooling.events.ProgressEvent import com.itsaky.androidide.utils.Environment import com.itsaky.androidide.utils.ILogger +import com.termux.shared.termux.shell.command.environment.TermuxShellEnvironment import kotlinx.coroutines.CoroutineName import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -406,7 +407,8 @@ class GradleBuildService : Service(), BuildService, IToolingApiClient, internal fun startToolingServer(listener: OnServerStartListener?) { if (toolingServerRunner?.isStarted != true) { - toolingServerRunner = ToolingServerRunner(listener, this).also { it.startAsync() } + val envs = TermuxShellEnvironment().getEnvironment(this, false) + toolingServerRunner = ToolingServerRunner(listener, this).also { it.startAsync(envs) } return } diff --git a/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt b/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt index cafe0ca94..32809a6c8 100644 --- a/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt +++ b/app/src/main/java/com/itsaky/androidide/services/builder/ToolingServerRunner.kt @@ -66,7 +66,7 @@ internal class ToolingServerRunner( this.listener = listener } - fun startAsync() = runnerScope.launch { + fun startAsync(envs: Map) = runnerScope.launch { var process: Process? try { log.info("Starting tooling API server...") @@ -99,7 +99,7 @@ internal class ToolingServerRunner( // error stream is used to read the server logs this.redirectErrorStream = false this.workingDirectory = null // HOME - this.environment = Environment.getEnvironment() + this.environment = envs } val inputStream = process.inputStream diff --git a/common/src/main/java/com/itsaky/androidide/utils/Environment.java b/common/src/main/java/com/itsaky/androidide/utils/Environment.java index 3790f689a..fea8b1de4 100755 --- a/common/src/main/java/com/itsaky/androidide/utils/Environment.java +++ b/common/src/main/java/com/itsaky/androidide/utils/Environment.java @@ -17,12 +17,9 @@ package com.itsaky.androidide.utils; import android.annotation.SuppressLint; -import android.os.Build; import androidx.annotation.NonNull; import com.blankj.utilcode.util.FileIOUtils; import com.blankj.utilcode.util.FileUtils; -import com.itsaky.androidide.app.BaseApplication; -import com.itsaky.androidide.app.IDEBuildConfigProvider; import java.io.File; import java.io.StringReader; import java.util.ArrayList; @@ -35,7 +32,6 @@ import java.util.Properties; public final class Environment { public static final Map IDE_PROPS = new HashMap<>(); - public static final Map ENV_VARS = new HashMap<>(); public static final String PROJECTS_FOLDER = "AndroidIDEProjects"; public static final String DEFAULT_ROOT = "/data/data/com.itsaky.androidide/files"; public static final String DEFAULT_HOME = DEFAULT_ROOT + "/home"; @@ -167,12 +163,9 @@ public final class Environment { } @NonNull - private static String createPath() { - String path = ""; - path += String.format("%s/bin", JAVA_HOME.getAbsolutePath()); + public static String createPath() { + String path = BIN_DIR.getAbsolutePath(); path += String.format(":%s/cmdline-tools/latest/bin", ANDROID_HOME.getAbsolutePath()); - path += String.format(":%s/bin", PREFIX.getAbsolutePath()); - path += String.format(":%s", System.getenv("PATH")); return path; } @@ -190,68 +183,30 @@ public final class Environment { BOOTCLASSPATH = new File(file.getAbsolutePath()); } - public static Map getEnvironment() { + public static void putEnvironment(Map env, boolean forFailsafe) { - if (!ENV_VARS.isEmpty()) { - return ENV_VARS; - } + env.put("HOME", HOME.getAbsolutePath()); + env.put("ANDROID_HOME", ANDROID_HOME.getAbsolutePath()); + env.put("ANDROID_SDK_ROOT", ANDROID_HOME.getAbsolutePath()); + env.put("ANDROID_USER_HOME", HOME.getAbsolutePath() + "/.android"); + env.put("JAVA_HOME", JAVA_HOME.getAbsolutePath()); + env.put("GRADLE_USER_HOME", GRADLE_USER_HOME.getAbsolutePath()); + env.put("SYSROOT", PREFIX.getAbsolutePath()); + env.put("PROJECTS", PROJECTS_DIR.getAbsolutePath()); - ENV_VARS.put("HOME", HOME.getAbsolutePath()); - ENV_VARS.put("ANDROID_HOME", ANDROID_HOME.getAbsolutePath()); - ENV_VARS.put("ANDROID_SDK_ROOT", ANDROID_HOME.getAbsolutePath()); - ENV_VARS.put("ANDROID_USER_HOME", HOME.getAbsolutePath() + "/.android"); - ENV_VARS.put("JAVA_HOME", JAVA_HOME.getAbsolutePath()); - ENV_VARS.put("GRADLE_USER_HOME", GRADLE_USER_HOME.getAbsolutePath()); - ENV_VARS.put("TMPDIR", TMP_DIR.getAbsolutePath()); - ENV_VARS.put("PROJECTS", PROJECTS_DIR.getAbsolutePath()); - ENV_VARS.put("LANG", "en_US.UTF-8"); - ENV_VARS.put("LC_ALL", "en_US.UTF-8"); + // add user envs for non-failsafe sessions + if (!forFailsafe) { + // No mirror select + env.put("TERMUX_PKG_NO_MIRROR_SELECT", "true"); - ENV_VARS.put("SYSROOT", PREFIX.getAbsolutePath()); - - ENV_VARS.put("BUSYBOX", BUSYBOX.getAbsolutePath()); - ENV_VARS.put("SHELL", SHELL.getAbsolutePath()); - ENV_VARS.put("CONFIG_SHELL", SHELL.getAbsolutePath()); - ENV_VARS.put("TERM", "screen"); - - // https://github.com/termux/termux-tools/blob/f2736f7f8232cd19cf52bca9b0ac9afb8ad9e562/scripts/termux-setup-package-manager.in#L3 - ENV_VARS.put("TERMUX_APP_PACKAGE_MANAGER", "apt"); - ENV_VARS.put("TERMUX_PKG_NO_MIRROR_SELECT", "true"); - - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R - && IDEBuildConfigProvider.getInstance().isArm64v8aBuild() - && LIB_HOOK.exists() - && BaseApplication.getBaseInstance().getPrefManager().shouldUseLdPreload()) { - // Required for JDK 11 - ENV_VARS.put("LD_PRELOAD", LIB_HOOK.getAbsolutePath()); - } - - addToEnvIfPresent(ENV_VARS, "ANDROID_ART_ROOT"); - addToEnvIfPresent(ENV_VARS, "DEX2OATBOOTCLASSPATH"); - addToEnvIfPresent(ENV_VARS, "ANDROID_I18N_ROOT"); - addToEnvIfPresent(ENV_VARS, "ANDROID_RUNTIME_ROOT"); - addToEnvIfPresent(ENV_VARS, "ANDROID_TZDATA_ROOT"); - addToEnvIfPresent(ENV_VARS, "ANDROID_DATA"); - addToEnvIfPresent(ENV_VARS, "ANDROID_ROOT"); - - String path = createPath(); - - ENV_VARS.put("PATH", path); - - for (String key : IDE_PROPS.keySet()) { - if (!blacklistedVariables().contains(key.trim())) { - ENV_VARS.put(key, readProp(key, "")); + for (String key : IDE_PROPS.keySet()) { + if (!blacklistedVariables().contains(key.trim())) { + env.put(key, readProp(key, "")); + } } } - return ENV_VARS; - } - public static void addToEnvIfPresent(Map environment, String name) { - String value = System.getenv(name); - if (value != null) { - environment.put(name, value); - } } private static List blacklistedVariables() { diff --git a/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java b/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java index 02b8d35b6..469263964 100644 --- a/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java +++ b/termux/termux-shared/src/main/java/com/termux/shared/shell/command/environment/AndroidShellEnvironment.java @@ -33,9 +33,7 @@ public class AndroidShellEnvironment extends UnixShellEnvironment { public HashMap getEnvironment(@NonNull Context currentPackageContext, boolean isFailSafe) { HashMap environment = new HashMap<>(); - if (!isFailSafe) { - environment.putAll(Environment.getEnvironment()); - } + Environment.putEnvironment(environment, isFailSafe); environment.put(ENV_HOME, "/"); environment.put(ENV_LANG, "en_US.UTF-8"); diff --git a/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/command/environment/TermuxShellEnvironment.java b/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/command/environment/TermuxShellEnvironment.java index 8bdd47916..bc1691bfb 100644 --- a/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/command/environment/TermuxShellEnvironment.java +++ b/termux/termux-shared/src/main/java/com/termux/shared/termux/shell/command/environment/TermuxShellEnvironment.java @@ -1,5 +1,7 @@ package com.termux.shared.termux.shell.command.environment; +import static com.itsaky.androidide.utils.Environment.ANDROID_HOME; + import android.content.Context; import androidx.annotation.NonNull; @@ -77,15 +79,8 @@ public class TermuxShellEnvironment extends AndroidShellEnvironment { // If failsafe is not enabled, then we keep default PATH and TMPDIR so that system binaries can be used if (!isFailSafe) { environment.put(ENV_TMPDIR, TermuxConstants.TERMUX_TMP_PREFIX_DIR_PATH); - if (TermuxBootstrap.isAppPackageVariantAPTAndroid5()) { - // Termux in android 5/6 era shipped busybox binaries in applets directory - environment.put(ENV_PATH, TermuxConstants.TERMUX_BIN_PREFIX_DIR_PATH + ":" + TermuxConstants.TERMUX_BIN_PREFIX_DIR_PATH + "/applets"); - environment.put(ENV_LD_LIBRARY_PATH, TermuxConstants.TERMUX_LIB_PREFIX_DIR_PATH); - } else { - // Termux binaries on Android 7+ rely on DT_RUNPATH, so LD_LIBRARY_PATH should be unset by default - environment.put(ENV_PATH, TermuxConstants.TERMUX_BIN_PREFIX_DIR_PATH); - environment.remove(ENV_LD_LIBRARY_PATH); - } + environment.put(ENV_PATH, TermuxConstants.TERMUX_BIN_PREFIX_DIR_PATH + String.format(":%s/cmdline-tools/latest/bin", ANDROID_HOME.getAbsolutePath())); + environment.remove(ENV_LD_LIBRARY_PATH); } return environment;