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 7465f4c94..000000000 Binary files a/app/src/arm64-v8a/assets/data/arm64-v8a/libhook.so and /dev/null differ diff --git a/app/src/armeabi-v7a/assets/data/armeabi-v7a/libhook.so b/app/src/armeabi-v7a/assets/data/armeabi-v7a/libhook.so deleted file mode 100755 index 4f0aca79e..000000000 Binary files a/app/src/armeabi-v7a/assets/data/armeabi-v7a/libhook.so and /dev/null differ 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;