From 7dc922d4bd01ae6d248e25866ba419444888f347 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Minecraft-=E6=B8=A9=E8=BF=AA?= <124678228+YiZhiMCQiu@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:31:09 +0800 Subject: [PATCH] =?UTF-8?q?Fix=20#3777:=20=E4=BF=AE=E5=A4=8D=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20Rosetta=202=20=E8=BD=AC=E8=AF=91=E8=BF=90=E8=A1=8C?= =?UTF-8?q?=E6=97=B6=E6=97=A0=E6=B3=95=E6=AD=A3=E7=A1=AE=E8=AF=86=E5=88=AB?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E6=9E=B6=E6=9E=84=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?=20(#3778)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * update * update --------- Co-authored-by: Glavo --- .../org/jackhuang/hmcl/util/io/IOUtils.java | 5 +++ .../hmcl/util/platform/Architecture.java | 44 +++++++++++++------ 2 files changed, 35 insertions(+), 14 deletions(-) diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java index 82830279b..cd2702117 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/io/IOUtils.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.util.io; import java.io.*; +import java.nio.charset.Charset; import java.util.zip.GZIPInputStream; /** @@ -74,6 +75,10 @@ public final class IOUtils { return readFully(stream).toString("UTF-8"); } + public static String readFullyAsString(InputStream stream, Charset charset) throws IOException { + return readFully(stream).toString(charset.name()); + } + public static void copyTo(InputStream src, OutputStream dest) throws IOException { copyTo(src, dest, new byte[DEFAULT_BUFFER_SIZE]); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java index a22b37139..a60553575 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/util/platform/Architecture.java @@ -17,10 +17,10 @@ */ package org.jackhuang.hmcl.util.platform; +import org.jackhuang.hmcl.util.io.IOUtils; import org.jackhuang.hmcl.util.versioning.VersionNumber; -import java.io.BufferedReader; -import java.io.InputStreamReader; +import java.io.File; import java.util.Locale; import java.util.concurrent.TimeUnit; @@ -192,30 +192,46 @@ public enum Architecture { static { CURRENT_ARCH = parseArchName(System.getProperty("os.arch")); - String sysArchName = null; + Architecture sysArch = null; if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) { String processorIdentifier = System.getenv("PROCESSOR_IDENTIFIER"); if (processorIdentifier != null) { int idx = processorIdentifier.indexOf(' '); if (idx > 0) { - sysArchName = processorIdentifier.substring(0, idx); + sysArch = parseArchName(processorIdentifier.substring(0, idx)); + } + } + } else if (OperatingSystem.CURRENT_OS == OperatingSystem.OSX) { + if (CURRENT_ARCH == X86_64) { + try { + Process process = Runtime.getRuntime().exec(new String[]{"/usr/sbin/sysctl", "-n", "sysctl.proc_translated"}); + if (process.waitFor(3, TimeUnit.SECONDS) && process.exitValue() == 0 + && "1".equals(IOUtils.readFullyAsString(process.getInputStream(), OperatingSystem.NATIVE_CHARSET).trim())) { + sysArch = ARM64; + } + } catch (Throwable e) { + e.printStackTrace(System.err); } } } else { - try { - Process process = Runtime.getRuntime().exec(new String[]{"/bin/uname", "-m"}); - if (process.waitFor(3, TimeUnit.SECONDS)) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream(), OperatingSystem.NATIVE_CHARSET))) { - sysArchName = reader.readLine().trim(); - } catch (Exception e) { - e.printStackTrace(); + for (String uname : new String[]{ + "/bin/uname", + "/usr/bin/uname" + }) { + if (new File(uname).exists()) { + try { + Process process = Runtime.getRuntime().exec(new String[]{uname, "-m"}); + if (process.waitFor(3, TimeUnit.SECONDS) && process.exitValue() == 0) { + sysArch = parseArchName(IOUtils.readFullyAsString(process.getInputStream(), OperatingSystem.NATIVE_CHARSET).trim()); + } + } catch (Throwable e) { + e.printStackTrace(System.err); } + break; } - } catch (Throwable ignored) { } } - Architecture sysArch = parseArchName(sysArchName); - SYSTEM_ARCH = sysArch == UNKNOWN ? CURRENT_ARCH : sysArch; + SYSTEM_ARCH = sysArch == null || sysArch == UNKNOWN ? CURRENT_ARCH : sysArch; } }