Added terminal

This commit is contained in:
Akash Yadav
2021-09-01 13:51:54 +05:30
parent b69fa9d401
commit 994e4e2cec
79 changed files with 10740 additions and 441 deletions
@@ -1,159 +1,180 @@
package com.itsaky.androidide.utils;
import com.blankj.utilcode.util.FileIOUtils;
import com.blankj.utilcode.util.FileUtils;
import com.blankj.utilcode.util.ThrowableUtils;
import com.blankj.utilcode.util.ZipUtils;
import com.itsaky.androidide.app.StudioApp;
import com.itsaky.androidide.models.gradle.Artifact;
import java.io.File;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Collection;
import java.util.Map;
import java.util.Properties;
public final class Environment {
public static File HOME;
public static File JAVA_HOME;
public static File ANDROID_HOME;
public static File JLS_HOME;
public static File TMP_DIR;
public static File USRDIR;
public static File LIBDIR;
public static File BINDIR;
public static final File ROOT;
public static final File SYSROOT;
public static final File HOME;
public static final File JAVA_HOME;
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 IDEPROPS;
public static final File INIT_SCRIPT;
public static final File GRADLE_API_DIR;
public static final File GRADLE_API_LIBS_DIR;
public static final File GRADLE_HOME;
public static final File GRADLE_PROPS;
public static final File GRADLE_USER_HOME;
public static final File GRADLE;
public static final File JAVA;
public static final File BUSYBOX;
public static final File BASH;
public static final File BASHRC;
public static File GRADLE_DIR;
public static File GRADLE_PROPS;
public static File GRADLE_USER_HOME;
public static File GRADLE_PLUGIN;
public static File BOOTCLASSPATH;
public static File CACHES_DIR;
public static File AAPT2_DIR;
public static File INIT_SCRIPT;
public static File LIBHOOKSO;
public static File GRADLE_API_DIR;
public static File GRADLE_API_LIBS_DIR;
public static String ANDROID_SDK_FOLDER_NAME = "android-sdk";
public static String GRADLE_FOLDER_NAME = null;
public static final String JDK_FOLDER_NAME = "jdk";
public static final String JDK_FOLDER_NAME_OLD = "openjdk-11.0.1";
public static final String DEFAULT_GRADLE_FOLDER = "gradle-7.1.1";
public static final String SAMPLE_GRADLE_PROP_CONTENTS = "# Specify global Gradle properties in this file\n# These properties will be applicable for every project you build with Gradle.";
public static List<File> AARS = new ArrayList<>();
private static File getJavaHome() {
File home = new File(HOME, JDK_FOLDER_NAME_OLD);
if(home.exists() && home.isDirectory()) {
FileUtils.rename(home, JDK_FOLDER_NAME);
}
return new File(HOME, JDK_FOLDER_NAME);
}
private static final String DEFAULT_JAVA_HOME = "/data/data/com.itsaky.androidide/files/framework/jdk";
private static final String DEFAULT_ANDROID_HOME = "/data/data/com.itsaky.androidide/files/framework/android-sdk";
private static final String DEFAULT_GRADLE_HOME = "/data/data/com.itsaky.androidide/files/framework/gradle-7.1.1";
private static final Logger LOG = Logger.instance("Environment");
static {
final StudioApp app = StudioApp.getInstance();
final File files21 = new File(HOME, ".gradle/caches/modules-2/files-2.1");
GRADLE_FOLDER_NAME = app.getPrefManager().getCurrentGradleFolderName();
final File gradleDir = new File(HOME, "gradle-7.1.1");
if(gradleDir != null && gradleDir.exists()) {
GRADLE_FOLDER_NAME = !FileUtils.rename(gradleDir, "gradle") ? GRADLE_FOLDER_NAME : "gradle";
app.getPrefManager().setCurentGradleFolderName(GRADLE_FOLDER_NAME);
}
ROOT = app.getIDEDataDir();
SYSROOT = mkdirIfNotExits(new File(app.getIDEDataDir(), "sysroot"));
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"));
HOME = app.getRootDir();
JAVA_HOME = getJavaHome();
ANDROID_HOME = new File(HOME, ANDROID_SDK_FOLDER_NAME);
JLS_HOME = mkdirIfNotExits(new File(HOME.getParentFile(), "jls"));
TMP_DIR = mkdirIfNotExits(new File(HOME, "tmp"));
GRADLE_DIR = new File(HOME, GRADLE_FOLDER_NAME);
USRDIR = mkdirIfNotExits(new File(HOME.getParentFile(), "usr"));
LIBDIR = mkdirIfNotExits(new File(USRDIR, "lib"));
BINDIR = mkdirIfNotExits(new File(USRDIR, "bin"));
GRADLE_API_DIR = mkdirIfNotExits(new File(HOME.getParentFile(), "gradle-api"));
IDEPROPS = new File(SYSROOT, "etc/ide-environment.properties");
GRADLE_API_DIR = mkdirIfNotExits(new File(app.getIDEDataDir(), "gradle-api"));
GRADLE_API_LIBS_DIR = new File(GRADLE_API_DIR, "libs");
INIT_SCRIPT = new File(mkdirIfNotExits(new File(HOME.getParentFile(), "init")), "androidide.init.gradle");
LIBHOOKSO = new File(LIBDIR, "libhook.so");
CACHES_DIR = new File(HOME, "ide-caches");
INIT_SCRIPT = new File(mkdirIfNotExits(new File(app.getIDEDataDir(), "init")), "androidide.init.gradle");
BOOTCLASSPATH = new File("");
AAPT2_DIR = new File(files21, "com.android.tools.build/aapt2");
GRADLE_PLUGIN = new File(files21, "com.itsaky.androidide/gradle");
GRADLE_USER_HOME = new File(HOME, ".gradle");
GRADLE_PROPS = new File(GRADLE_USER_HOME, "gradle.properties");
GRADLE_USER_HOME = new File(HOME, ".gradle");
GRADLE_PROPS = new File(GRADLE_USER_HOME, "gradle.properties");
final Map<String, String> props = readProperties();
ANDROID_HOME = new File(props.getOrDefault("ANDROID_HOME", DEFAULT_ANDROID_HOME));
JAVA_HOME = new File(props.getOrDefault("JAVA_HOME", DEFAULT_JAVA_HOME));
GRADLE_HOME = new File(props.getOrDefault("GRADLE_HOME", DEFAULT_GRADLE_HOME));
BASH = new File(BINDIR, "bash");
GRADLE = new File(GRADLE_HOME, "bin/gradle");
JAVA = new File(JAVA_HOME, "bin/java");
BUSYBOX = new File(BINDIR, "busybox");
BASHRC = new File(HOME, ".bashrc");
}
private static Map<String, String> readProperties() {
final Map<String, String> props = new HashMap<>();
if(IDEPROPS == null || !IDEPROPS.exists()) return props;
try {
Properties p = new Properties();
p.load(new StringReader(FileIOUtils.readFile2String(IDEPROPS)));
for(Map.Entry entry : p.entrySet()) {
props.put(entry.getKey() + "", entry.getValue() + "");
}
return props;
} catch (Throwable th) {
LOG.e("Error reading properties", th);
return props;
}
}
public static File getGradleDir() {
String name = DEFAULT_GRADLE_FOLDER;
if(GRADLE_FOLDER_NAME != null)
name = GRADLE_FOLDER_NAME;
return new File(HOME, name);
return GRADLE_HOME;
}
public static void setBootClasspath(File file) {
BOOTCLASSPATH = new File(file.getAbsolutePath());
}
public static Map<String, String> getEnvironment(boolean publicUse) {
final Map<String, String> map = new HashMap<>();
map.put("HOME", HOME.getAbsolutePath());
map.put("GRADLE_USER_HOME", GRADLE_USER_HOME.getAbsolutePath());
map.put("TMPDIR", TMP_DIR.getAbsolutePath());
map.put("ANDROID_DATA", "/data");
map.put("ANDROID_ROOT", "/system");
map.put("LANG", "en_US.UTF-8");
if(!publicUse) {
// These environment variables must not be provided to users
map.put("JLS_HOME", JLS_HOME.getAbsolutePath());
}
map.put("SYSROOT", SYSROOT.getAbsolutePath());
map.put("PREFIX", SYSROOT.getAbsolutePath());
map.put("BUSYBOX", BUSYBOX.getAbsolutePath());
map.put("SHELL", BASH.getAbsolutePath());
map.put("TERM", "xterm-256color");
map.put("COLORTERM", "truecolor");
map.put("ANDROID_HOME", ANDROID_HOME.getAbsolutePath());
map.put("GRADLE_INSTALLATION_DIR", GRADLE_HOME.getAbsolutePath());
map.put("JAVA_HOME", JAVA_HOME.getAbsolutePath());
/**
* If LD_LIBRARY_PATH is set, prepend $SYSROOT/lib to it,
* else set it to $SYSROOT/lib
*/
String ld = System.getenv("LD_LIBRARY_PATH");
if(ld == null || ld.trim().length() <= 0)
ld = "";
else ld = LIBDIR.getAbsolutePath() + File.pathSeparator + ld;
map.put("LD_LIBRARY_PATH", ld);
addToEnvIfPresent(map, "ANDROID_ART_ROOT");
addToEnvIfPresent(map, "DEX2OATBOOTCLASSPATH");
addToEnvIfPresent(map, "ANDROID_I18N_ROOT");
addToEnvIfPresent(map, "ANDROID_RUNTIME_ROOT");
addToEnvIfPresent(map, "ANDROID_TZDATA_ROOT");
String path = "";
path += String.format("%s/bin", JAVA_HOME.getAbsolutePath());
path += String.format(":%s/bin", GRADLE_HOME.getAbsolutePath());
path += String.format(":%s/cmdline-tools/latest/bin", ANDROID_HOME.getAbsolutePath());
path += String.format(":%s/cmake/bin", ANDROID_HOME.getAbsolutePath());
path += String.format(":%s/bin", SYSROOT.getAbsolutePath());
path += String.format(":%s", System.getenv("PATH"));
map.put("PATH", path);
return map;
}
public static void addToEnvIfPresent(Map<String, String> environment, String name) {
String value = System.getenv(name);
if (value != null) {
environment.put(name, value);
}
}
public static String path(File file) {
return file.getAbsolutePath();
}
public static File destinationForArtifact(Artifact artifact) {
return mkdirIfNotExits(new File(CACHES_DIR, String.format("%s/%s/%s", artifact.group, artifact.name, artifact.version)));
}
public static File mkdirIfNotExits(File in) {
if (!in.exists())
FileUtils.createOrExistsDir(in);
return in;
}
public static File cachedFolderForArtifact(Artifact artifact) {
return new File(HOME, String.format(".gradle/caches/modules-2/files-2.1/%s/%s/%s", artifact.group, artifact.name, artifact.version));
}
public static List<File> findJarForArtifact(final Artifact artifact) {
List<File> result = new ArrayList<>();
if(artifact != null && artifact.isValid()) {
File folder = cachedFolderForArtifact(artifact);
for(File f : folder.listFiles(p1 -> p1.isDirectory())) {
File[] jarsOrAars = f.listFiles(p1 -> p1.isFile() && (p1.getName().endsWith(".jar") || p1.getName().endsWith(".aar")));
if(jarsOrAars != null
&& jarsOrAars.length > 0) {
for(File jarOrAar : jarsOrAars) {
if(jarOrAar.getName().endsWith(".jar")) {
result.add(jarOrAar);
} else if(jarOrAar.getName().endsWith(".aar")) {
result.addAll(extractAar(artifact, jarOrAar));
}
}
}
}
}
return result;
}
private static List<File> extractAar(final Artifact artifact, File aar) {
try {
final File extractedFolder = destinationForArtifact(artifact);
ZipUtils.unzipFile(aar, mkdirIfNotExits(extractedFolder));
AARS.add(extractedFolder);
return FileUtils.listFilesInDirWithFilter(extractedFolder, (p1 -> p1.isFile() && p1.getName().endsWith(".jar")), true);
} catch (Throwable e) {
return null;
}
}
public static class Executables {
public static File GRADLE;
public static File JAVA;
static {
GRADLE = new File(GRADLE_DIR, "bin/gradle");
JAVA = new File(JAVA_HOME, "bin/java");
}
}
}