diff --git a/.idea/misc.xml b/.idea/misc.xml
index dfc9bd42c..f11f9ee47 100755
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -72,6 +72,7 @@
+
diff --git a/app/src/main/assets/data/arm64-v8a/bootstrap.zip b/app/src/main/assets/data/arm64-v8a/bootstrap.zip
new file mode 100644
index 000000000..80b497aba
Binary files /dev/null and b/app/src/main/assets/data/arm64-v8a/bootstrap.zip differ
diff --git a/app/src/main/assets/data/armeabi-v7a/bootstrap.zip b/app/src/main/assets/data/armeabi-v7a/bootstrap.zip
new file mode 100644
index 000000000..10d37e376
Binary files /dev/null and b/app/src/main/assets/data/armeabi-v7a/bootstrap.zip differ
diff --git a/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java b/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java
index 76ed0dca7..ceadd9201 100755
--- a/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java
+++ b/common/src/main/java/com/itsaky/androidide/managers/ToolsManager.java
@@ -1,4 +1,4 @@
-/************************************************************************************
+/*
* This file is part of AndroidIDE.
*
* AndroidIDE is free software: you can redistribute it and/or modify
@@ -14,7 +14,7 @@
* You should have received a copy of the GNU General Public License
* along with AndroidIDE. If not, see .
*
-**************************************************************************************/
+ */
package com.itsaky.androidide.managers;
import androidx.annotation.NonNull;
@@ -36,10 +36,10 @@ public class ToolsManager {
private static PreferenceManager prefs;
public static final int JLS_VERSION = 27;
- public static final int LOGSENDER_VERSION = 2;
+ public static final int LOG_SENDER_VERSION = 2;
public static final String KEY_JLS_VERSION = "tools_jlsVersion";
- public static final String KEY_LOGSENDER_VERSION = "tools_logsenderVersion";
+ public static final String KEY_LOG_SENDER_VERSION = "tools_logsenderVersion";
public static String ARCH_SPECIFIC_ASSET_DATA_DIR = "data/" + BaseApplication.getArch();
public static String COMMON_ASSET_DATA_DIR = "data/common";
@@ -55,17 +55,18 @@ public class ToolsManager {
rewriteProjectData();
- if(onFinish != null)
+ if(onFinish != null) {
onFinish.run();
+ }
}
private static void extractLibHooks() {
- if(!Environment.LIBHOOK.exists()) {
- ResourceUtils.copyFileFromAssets(getArchSpecificAsset("libhook.so"), Environment.LIBHOOK.getAbsolutePath());
+ if(!Environment.LIB_HOOK.exists()) {
+ ResourceUtils.copyFileFromAssets(getArchSpecificAsset("libhook.so"), Environment.LIB_HOOK.getAbsolutePath());
}
- if(!Environment.LIBHOOK2.exists()) {
- ResourceUtils.copyFileFromAssets(getArchSpecificAsset("libhook2.so"), Environment.LIBHOOK2.getAbsolutePath());
+ if(!Environment.LIB_HOOK2.exists()) {
+ ResourceUtils.copyFileFromAssets(getArchSpecificAsset("libhook2.so"), Environment.LIB_HOOK2.getAbsolutePath());
}
}
@@ -79,7 +80,9 @@ public class ToolsManager {
Environment.mkdirIfNotExits(exec.getParentFile());
ResourceUtils.copyFileFromAssets(getArchSpecificAsset("busybox"), exec.getAbsolutePath());
if(!exec.canExecute()) {
- exec.setExecutable(true);
+ if (!exec.setExecutable(true)) {
+ LOG.error ("Cannot set busybox executable permissions.");
+ }
}
}
@@ -110,12 +113,12 @@ public class ToolsManager {
private static void extractLogsenderIfNeeded() {
try {
- final boolean isOld = LOGSENDER_VERSION > prefs.getInt(KEY_LOGSENDER_VERSION, 0);
+ final boolean isOld = LOG_SENDER_VERSION > prefs.getInt(KEY_LOG_SENDER_VERSION, 0);
if(isOld) {
final File logsenderZip = new File(Environment.JLS_HOME, "logsender.zip");
ResourceUtils.copyFileFromAssets(getCommonAsset("logsender.zip"), logsenderZip.getAbsolutePath());
ZipUtils.unzipFile(logsenderZip, Environment.HOME);
- prefs.putInt(KEY_LOGSENDER_VERSION, LOGSENDER_VERSION);
+ prefs.putInt(KEY_LOG_SENDER_VERSION, LOG_SENDER_VERSION);
}
} catch (IOException e) {
LOG.error("Error extracting log sender", e);
diff --git a/common/src/main/java/com/itsaky/androidide/utils/BootstrapInstaller.java b/common/src/main/java/com/itsaky/androidide/utils/BootstrapInstaller.java
new file mode 100644
index 000000000..20171dd01
--- /dev/null
+++ b/common/src/main/java/com/itsaky/androidide/utils/BootstrapInstaller.java
@@ -0,0 +1,32 @@
+/*
+ * This file is part of AndroidIDE.
+ *
+ * AndroidIDE is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AndroidIDE is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AndroidIDE. If not, see .
+ */
+
+package com.itsaky.androidide.utils;
+
+import java.io.InputStream;
+
+/**
+ * Installs the bootstraps zip into {@code $SYSROOT}.
+ *
+ * @author Akash Yadav
+ */
+public class BootstrapInstaller {
+
+ public static void doInstall (final InputStream in) {
+
+ }
+}
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 debeee202..f720272f9 100755
--- a/common/src/main/java/com/itsaky/androidide/utils/Environment.java
+++ b/common/src/main/java/com/itsaky/androidide/utils/Environment.java
@@ -19,6 +19,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 java.io.File;
@@ -40,12 +43,12 @@ public final class Environment {
public static final File ANDROID_HOME;
public static final File JLS_HOME;
public static final File TMP_DIR;
- public static final File BINDIR;
- public static final File LIBDIR;
+ public static final File BIN_DIR;
+ public static final File LIB_DIR;
public static final File PROJECTS_DIR;
- public static final File IDEPROPS;
- public static final File LIBHOOK;
- public static final File LIBHOOK2;
+ public static final File IDE_PROPS_FILE;
+ public static final File LIB_HOOK;
+ public static final File LIB_HOOK2;
public static final File INIT_SCRIPT;
public static final File PROJECT_DATA_FILE;
@@ -79,13 +82,13 @@ public final class Environment {
HOME = mkdirIfNotExits(app.getRootDir());
JLS_HOME = mkdirIfNotExits(new File(app.getIDEDataDir(), "jls"));
TMP_DIR = mkdirIfNotExits(new File(SYSROOT, "tmp"));
- BINDIR = mkdirIfNotExits(new File(SYSROOT, "bin"));
- LIBDIR = mkdirIfNotExits(new File(SYSROOT, "lib"));
+ BIN_DIR = mkdirIfNotExits(new File(SYSROOT, "bin"));
+ LIB_DIR = mkdirIfNotExits(new File(SYSROOT, "lib"));
PROJECTS_DIR = mkdirIfNotExits(new File(FileUtil.getExternalStorageDir(), PROJECTS_FOLDER));
- IDEPROPS = new File(SYSROOT, "etc/ide-environment.properties");
- LIBHOOK = new File(LIBDIR, "libhook.so");
- LIBHOOK2 = new File(LIBDIR, "libhook2.so");
+ IDE_PROPS_FILE = new File(SYSROOT, "etc/ide-environment.properties");
+ LIB_HOOK = new File(LIB_DIR, "libhook.so");
+ LIB_HOOK2 = new File(LIB_DIR, "libhook2.so");
PROJECT_DATA_FILE = new File(TMP_DIR, "ide_project");
JLS_JAR = new File(JLS_HOME, "jls.jar");
@@ -99,9 +102,9 @@ public final class Environment {
JAVA_HOME = new File(readProp("JAVA_HOME", DEFAULT_JAVA_HOME));
JAVA = new File(JAVA_HOME, "bin/java");
- BUSYBOX = new File(BINDIR, "busybox");
- SHELL = new File(BINDIR, "sh.sh");
- BUSYBOX_SH = new File (BINDIR, "sh");
+ BUSYBOX = new File(BIN_DIR, "busybox");
+ SHELL = new File(BIN_DIR, "sh.sh");
+ BUSYBOX_SH = new File (BIN_DIR, "sh");
if(!JAVA.canExecute()) {
JAVA.setExecutable(true);
@@ -119,12 +122,13 @@ public final class Environment {
System.setProperty("java.home", JAVA_HOME.getAbsolutePath());
}
+ @NonNull
private static Map readProperties() {
final Map props = new HashMap<>();
- if(IDEPROPS == null || !IDEPROPS.exists()) return props;
+ if(IDE_PROPS_FILE == null || !IDE_PROPS_FILE.exists()) return props;
try {
Properties p = new Properties();
- p.load(new StringReader(FileIOUtils.readFile2String(IDEPROPS)));
+ p.load(new StringReader(FileIOUtils.readFile2String(IDE_PROPS_FILE)));
for(Map.Entry entry : p.entrySet()) {
props.put(entry.getKey() + "", entry.getValue() + "");
}
@@ -134,7 +138,7 @@ public final class Environment {
return props;
}
- public static void setBootClasspath(File file) {
+ public static void setBootClasspath(@NonNull File file) {
BOOTCLASSPATH = new File(file.getAbsolutePath());
}
@@ -164,20 +168,20 @@ public final class Environment {
ENV_VARS.put("SHELL", SHELL.getAbsolutePath());
ENV_VARS.put("CONFIG_SHELL", SHELL.getAbsolutePath());
ENV_VARS.put("TERM", "screen");
-
- /**
- * If LD_LIBRARY_PATH is set, append $SYSROOT/lib to it,
- * else set it to $SYSROOT/lib
- */
+
+ // If LD_LIBRARY_PATH is set, append $SYSROOT/lib to it,
+ // else set it to $SYSROOT/lib
String ld = System.getenv("LD_LIBRARY_PATH");
- if(ld == null || ld.trim().length() <= 0)
+ if(ld == null || ld.trim().length() <= 0) {
ld = "";
- else ld += File.pathSeparator;
- ld += LIBDIR.getAbsolutePath();
+ } else {
+ ld += File.pathSeparator;
+ }
+ ld += LIB_DIR.getAbsolutePath();
ENV_VARS.put("LD_LIBRARY_PATH", ld);
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.R && BaseApplication.isAarch64()) {
- ENV_VARS.put("LD_PRELOAD", LIBHOOK.getAbsolutePath());
+ ENV_VARS.put("LD_PRELOAD", LIB_HOOK.getAbsolutePath());
}
addToEnvIfPresent(ENV_VARS, "ANDROID_ART_ROOT");
@@ -193,9 +197,7 @@ public final class Environment {
ENV_VARS.put("PATH", path);
for (String key : IDE_PROPS.keySet()) {
- if (blacklistedVariables().contains(key.trim())) {
- continue;
- } else {
+ if (!blacklistedVariables ().contains (key.trim ())) {
ENV_VARS.put(key, readProp(key, ""));
}
}
@@ -203,6 +205,7 @@ public final class Environment {
return ENV_VARS;
}
+ @NonNull
private static String createPath() {
String path = "";
path += String.format("%s/bin", JAVA_HOME.getAbsolutePath());
@@ -241,7 +244,8 @@ public final class Environment {
return value;
}
- public static String path(File file) {
+ @NonNull
+ public static String path(@NonNull File file) {
return file.getAbsolutePath();
}