From 9f0a79176b4e6e8c92fa6d9723bff2fbc662c5bd Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Mon, 28 Sep 2020 14:30:38 +0700 Subject: [PATCH] Add launch checks; Fix cursor not working on grab mode --- app/src/main/assets/about_en.txt | 5 -- .../kdt/pojavlaunch/InstallModActivity.java | 2 +- .../java/net/kdt/pojavlaunch/JREUtils.java | 26 +++---- .../kdt/pojavlaunch/MCLauncherActivity.java | 9 +-- .../net/kdt/pojavlaunch/MainActivity.java | 67 ++++++++++++++++--- .../net/kdt/pojavlaunch/PojavApplication.java | 9 ++- .../kdt/pojavlaunch/PojavLoginActivity.java | 2 +- .../main/java/net/kdt/pojavlaunch/Tools.java | 5 +- app/src/main/res/values/strings.xml | 3 + 9 files changed, 93 insertions(+), 35 deletions(-) diff --git a/app/src/main/assets/about_en.txt b/app/src/main/assets/about_en.txt index 32081b156..9b664140b 100644 --- a/app/src/main/assets/about_en.txt +++ b/app/src/main/assets/about_en.txt @@ -2,12 +2,7 @@ * Using libraries:
• ClassWrapperMC: A simple wrapper to help launching Minecraft LaunchWrapper on JRE9 and later.
• gl4es: OpenGL for OpenGL ES devices by lunixbochs and ptitSeb.
- • LegacyLauncher: Open source Minecraft LaunchWrapper by Mojang.
• OpenJDK JRE 10 for Android by dongfangxunlei.
- • PRoot special build of Termux to bypass SECCOMP for OpenJDK run in Android 8.
- • TheQVD XVnc Pro (including Android VNC Viewer).
- • Some Debian libraries (X11, FreeType...)
- • Busybox.
• Apache Commons Compress.
• LWJGL.
* License:
diff --git a/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java b/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java index 9e037dc5b..339993f17 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/InstallModActivity.java @@ -142,7 +142,7 @@ public class InstallModActivity extends LoggableActivity System.out.println(Arrays.toString(javaArgList.toArray(new String[0]))); //JREUtils.redirectStdio(false); - JREUtils.setJavaEnvironment(this); + JREUtils.setJavaEnvironment(this, Tools.LAUNCH_TYPE); JREUtils.initJavaRuntime(); JREUtils.chdir(Tools.MAIN_PATH); diff --git a/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java b/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java index d264265d5..8ddfb95ff 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java +++ b/app/src/main/java/net/kdt/pojavlaunch/JREUtils.java @@ -68,7 +68,7 @@ public class JREUtils Log.i("jrelog-logcat","Logcat thread started"); } - public static void setJavaEnvironment(Context ctx) throws IOException, ErrnoException { + public static void setJavaEnvironment(Context ctx, int launchType) throws IOException, ErrnoException { nativeLibDir = ctx.getApplicationInfo().nativeLibraryDir; String libName = System.getProperty("os.arch").contains("64") ? "lib64" : "lib"; String ldLibraryPath = ( @@ -85,17 +85,17 @@ public class JREUtils Tools.homeJreDir + "/lib" ); - setEnvironment("JAVA_HOME", Tools.homeJreDir); - setEnvironment("HOME", Tools.MAIN_PATH); - setEnvironment("TMPDIR", ctx.getCacheDir().getAbsolutePath()); - // setEnvironment("LIBGL_MIPMAP", "3"); - setEnvironment("MESA_GLSL_CACHE_DIR", ctx.getCacheDir().getAbsolutePath()); - setEnvironment("LD_LIBRARY_PATH", ldLibraryPath); - setEnvironment("PATH", Tools.homeJreDir + "/bin:" + Os.getenv("PATH")); + setEnvironment(launchType, "JAVA_HOME", Tools.homeJreDir); + setEnvironment(launchType, "HOME", Tools.MAIN_PATH); + setEnvironment(launchType, "TMPDIR", ctx.getCacheDir().getAbsolutePath()); + // setEnvironment(launchType, "LIBGL_MIPMAP", "3"); + setEnvironment(launchType, "MESA_GLSL_CACHE_DIR", ctx.getCacheDir().getAbsolutePath()); + setEnvironment(launchType, "LD_LIBRARY_PATH", ldLibraryPath); + setEnvironment(launchType, "PATH", Tools.homeJreDir + "/bin:" + Os.getenv("PATH")); - setEnvironment("REGAL_GL_VENDOR", "Android"); - setEnvironment("REGAL_GL_RENDERER", "Regal"); - setEnvironment("REGAL_GL_VERSION", "4.5"); + setEnvironment(launchType, "REGAL_GL_VENDOR", "Android"); + setEnvironment(launchType, "REGAL_GL_RENDERER", "Regal"); + setEnvironment(launchType, "REGAL_GL_VERSION", "4.5"); // REGAL_GL_EXTENSIONS setLdLibraryPath(ldLibraryPath); @@ -103,8 +103,8 @@ public class JREUtils // return ldLibraryPath; } - private static void setEnvironment(String name, String value) throws ErrnoException, IOException { - if (Tools.LAUNCH_TYPE == Tools.LTYPE_PROCESS) { + private static void setEnvironment(int launchType, String name, String value) throws ErrnoException, IOException { + if (launchType == Tools.LTYPE_PROCESS) { Tools.mLaunchShell.writeToProcess("export " + name + "=" + value); } else { Os.setenv(name, value, true); diff --git a/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java index 666c4cacb..7ed9dc4bf 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/MCLauncherActivity.java @@ -26,6 +26,7 @@ import org.lwjgl.glfw.*; import android.app.AlertDialog; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; +import android.text.*; //import android.support.v7.view.menu.*; //import net.zhuoweizhang.boardwalk.downloader.*; @@ -128,7 +129,7 @@ public class MCLauncherActivity extends AppCompatActivity } File logFile = new File(Tools.MAIN_PATH, "latestlog.txt"); - if (logFile.exists() && logFile.length() < 2048) { + if (logFile.exists() && logFile.length() < 20480) { String errMsg = "Error occurred during initialization of "; try { String logContent = Tools.read(logFile.getAbsolutePath()); @@ -139,7 +140,7 @@ public class MCLauncherActivity extends AppCompatActivity Tools.showError(MCLauncherActivity.this, ex); // Do it so dialog will not shown for second time - Tools.write(logFile.getAbsolutePath(), logContent.replace(errMsg + "VM", errMsg + " JVM")); + Tools.write(logFile.getAbsolutePath(), logContent.replace(errMsg + "VM", errMsg + "JVM")); } } catch (Throwable th) { System.err.println("Could not detect java crash"); @@ -783,11 +784,11 @@ public class MCLauncherActivity extends AppCompatActivity aboutB.setTitle(R.string.mcl_option_about); try { - aboutB.setMessage(String.format(Tools.read(getAssets().open("about_en.txt")), + aboutB.setMessage(Html.fromHtml(String.format(Tools.read(getAssets().open("about_en.txt")), Tools.APP_NAME, Tools.usingVerName, "3.2.3") - ); + )); } catch (Exception e) { throw new RuntimeException(e); } diff --git a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java index be423b8d6..5951eb5c8 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/MainActivity.java @@ -23,6 +23,7 @@ import org.lwjgl.glfw.*; import android.app.AlertDialog; import java.lang.Process; +import android.system.*; public class MainActivity extends LoggableActivity implements OnTouchListener, OnClickListener { @@ -453,6 +454,7 @@ public class MainActivity extends LoggableActivity implements OnTouchListener, O // TODO uncomment after fix wrong trigger // CallbackBridge.putMouseEventWithCoords(rightOverride ? (byte) 1 : (byte) 0, (byte) 0, x, y); + CallbackBridge.sendCursorPos(x, y); if (!rightOverride) { CallbackBridge.mouseLeft = false; } @@ -956,18 +958,67 @@ public class MainActivity extends LoggableActivity implements OnTouchListener, O */ appendlnToLog("--------- beggining with launcher debug"); - File lwjgl3dir = new File(Tools.MAIN_PATH, "lwjgl3"); - if (!lwjgl3dir.exists() || lwjgl3dir.isFile()) { - appendlnToLog("Error: LWJGL3 is not installed!"); - Tools.showError(this, new Throwable("LWJGL3 is not installed!"), true); - return; - } else { - appendlnToLog("Info: LWJGL3 directory size: " + lwjgl3dir.length()); - } + checkLWJGL3Installed(); + checkJavaArchitecture(); + checkJavaArgsIsLaunchable(); JREUtils.redirectAndPrintJRELog(this); Tools.launchMinecraft(this, mProfile, mVersionInfo); } + + private void checkJavaArchitecture() throws Exception { + String[] argName = Tools.currentArch.split("/"); + String releaseContent = Tools.read(Tools.homeJreDir + "/release"); + int osArchIndex = releaseContent.indexOf("OS_ARCH=\"") + 9; + releaseContent = releaseContent.substring(osArchIndex); + releaseContent = releaseContent.substring(0, releaseContent.indexOf("\"")); + if (!(releaseContent.contains(argName[0]) || releaseContent.contains(argName[1]))) { + appendlnToLog("Architecture " + Tools.currentArch + " is incompatible with Java Runtime " + releaseContent); + throw new RuntimeException(getString(R.string.mcn_check_fail_incompatiblearch, Tools.currentArch, releaseContent)); + } + } + + private void checkJavaArgsIsLaunchable() throws Throwable { + appendlnToLog("Info: Custom Java arguments: \"" + LauncherPreferences.PREF_CUSTOM_JAVA_ARGS + "\""); + + // Test java + ShellProcessOperation shell = new ShellProcessOperation(new ShellProcessOperation.OnPrintListener(){ + @Override + public void onPrintLine(String text){ + appendlnToLog("[JRETest] " + text); + } + }); + Tools.mLaunchShell = shell; + JREUtils.setJavaEnvironment(this, Tools.LTYPE_PROCESS); + Tools.mLaunchShell = null; + + List testArgs = new ArrayList(); + testArgs.add(Tools.homeJreDir + "/bin/java"); + Tools.getJavaArgs(this, testArgs); + testArgs.add("-version"); + + shell.writeToProcess("chmod 700 " + Tools.homeJreDir + "/bin/java"); + shell.writeToProcess("set -e"); + shell.writeToProcess(testArgs.toArray(new String[0])); + + int exitCode = shell.waitFor(); + appendlnToLog("Info: java test command exited with " + exitCode); + + if (exitCode != 0) { + appendlnToLog("Error: it is failure!"); + throw new RuntimeException(getString(R.string.mcn_check_fail_java)); + } + } + + private void checkLWJGL3Installed() { + File lwjgl3dir = new File(Tools.MAIN_PATH, "lwjgl3"); + if (!lwjgl3dir.exists() || lwjgl3dir.isFile()) { + appendlnToLog("Error: LWJGL3 was not installed!"); + throw new RuntimeException(getString(R.string.mcn_check_fail_lwjgl)); + } else { + appendlnToLog("Info: LWJGL3 directory: " + lwjgl3dir.list()); + } + } public void printStream(InputStream stream) { try { diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java b/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java index 2e570a3c2..cd774b187 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java +++ b/app/src/main/java/net/kdt/pojavlaunch/PojavApplication.java @@ -59,7 +59,14 @@ public class PojavApplication extends Application Tools.usingVerName = thisApp.versionName; Tools.usingVerCode = thisApp.versionCode; Tools.datapath = getDir("files", MODE_PRIVATE).getParent(); - + Tools.currentArch = new File(getApplicationInfo().nativeLibraryDir).getName(); + switch (Tools.currentArch) { + case "arm": Tools.currentArch = "arm/aarch32"; break; + case "arm64": Tools.currentArch = "arm64/aarch64"; break; + case "x86": Tools.currentArch = "x86/i*86"; break; + case "x86_64": Tools.currentArch = "x86_64/amd64"; break; + } + LauncherPreferences.DEFAULT_PREF = PreferenceManager.getDefaultSharedPreferences(this); LauncherPreferences.loadPreferences(); diff --git a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java index 8e5e8fb3e..cb5221297 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java +++ b/app/src/main/java/net/kdt/pojavlaunch/PojavLoginActivity.java @@ -359,7 +359,7 @@ public class PojavLoginActivity extends AppCompatActivity @Override public void run() { AlertDialog.Builder builder = new AlertDialog.Builder(PojavLoginActivity.this); - builder.setTitle(getString(R.string.alerttitle_install_jre, System.getProperty("os.arch"))); + builder.setTitle(getString(R.string.alerttitle_install_jre, Tools.currentArch)); builder.setCancelable(false); final AlertDialog dialog = builder.create(); diff --git a/app/src/main/java/net/kdt/pojavlaunch/Tools.java b/app/src/main/java/net/kdt/pojavlaunch/Tools.java index 6d378d0ad..f6b610266 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/Tools.java +++ b/app/src/main/java/net/kdt/pojavlaunch/Tools.java @@ -34,7 +34,8 @@ public final class Tools public static String mhomeUrl = "https://pojavlauncherteam.github.io/PojavLauncher"; // "http://kdtjavacraft.eu5.net"; public static String datapath = "/data/data/net.kdt.pojavlaunch"; public static String worksDir = datapath + "/app_working_dir"; - + public static String currentArch; + // New since 3.0.0 public static String homeJreDir = datapath + "/jre_runtime"; @@ -122,7 +123,7 @@ public final class Tools // can fix java? // setEnvironment("ORIGIN", Tools.homeJreDir + "/lib"); - JREUtils.setJavaEnvironment(ctx); + JREUtils.setJavaEnvironment(ctx, Tools.LAUNCH_TYPE); if (LAUNCH_TYPE == LTYPE_PROCESS) { mLaunchShell.writeToProcess("cd $HOME"); diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3950e2b84..5f59a0711 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -151,6 +151,9 @@ Game Crash detected! Click OK to exit. Unable to locate crash! You may ignore this. Are you sure want to force close? + LWJGL3 was not installed! + Architecture %s is incompatible with Java Runtime %s. + Could not start test Java VM. Check %s for more info. Controls