优化 Linux 平台硬件检测 (#3946)

This commit is contained in:
Glavo 2025-05-31 11:38:28 +08:00 committed by GitHub
parent 4a75f1d462
commit 45a40ee675
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 21 additions and 8 deletions

View File

@ -41,13 +41,13 @@ final class FastFetchUtils {
}
private static <T> T get(String type, TypeToken<T> resultType) {
Path fastfetch = SystemUtils.which("fastfetch");
Path fastfetch = SystemUtils.which(OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS ? "fastfetch.exe" : "fastfetch");
if (fastfetch == null)
return null;
String json;
String output;
try {
json = SystemUtils.run(Arrays.asList(fastfetch.toString(), "--structure", type, "--format", "json"),
output = SystemUtils.run(Arrays.asList(fastfetch.toString(), "--structure", type, "--format", "json"),
inputStream -> IOUtils.readFullyAsString(inputStream, OperatingSystem.NATIVE_CHARSET));
} catch (Throwable e) {
LOG.warning("Failed to get result from fastfetch", e);
@ -55,6 +55,10 @@ final class FastFetchUtils {
}
try {
// Sometimes there is some garbage before the output JSON, we should filter it out
int idx = output.indexOf('[');
String json = idx >= 0 ? output.substring(idx) : output;
List<Result<T>> list = JsonUtils.GSON.fromJson(json, JsonUtils.listTypeOf(Result.typeOf(resultType)));
Result<T> result;
@ -68,7 +72,7 @@ final class FastFetchUtils {
return result.result;
} catch (Throwable e) {
LOG.warning("Failed to parse fastfetch output: " + json, e);
LOG.warning("Failed to parse fastfetch output: " + output, e);
return null;
}
}

View File

@ -28,12 +28,14 @@ import java.util.List;
*/
@SuppressWarnings("ALL")
public class HardwareDetector {
private static final boolean USE_FAST_FETCH = "true".equalsIgnoreCase(System.getProperty("hmcl.hardware.fastfetch", "true"));
public @Nullable CentralProcessor detectCentralProcessor() {
return FastFetchUtils.detectCentralProcessor();
return USE_FAST_FETCH ? FastFetchUtils.detectCentralProcessor() : null;
}
public @Nullable List<GraphicsCard> detectGraphicsCards() {
return FastFetchUtils.detectGraphicsCards();
return USE_FAST_FETCH ? FastFetchUtils.detectGraphicsCards() : null;
}
public long getTotalMemorySize() {

View File

@ -43,14 +43,21 @@ public final class LinuxHardwareDetector extends HardwareDetector {
public @Nullable CentralProcessor detectCentralProcessor() {
if (OperatingSystem.CURRENT_OS != OperatingSystem.LINUX)
return null;
return LinuxCPUDetector.detect();
CentralProcessor cpu = LinuxCPUDetector.detect();
return cpu != null ? cpu : super.detectCentralProcessor();
}
@Override
public List<GraphicsCard> detectGraphicsCards() {
if (OperatingSystem.CURRENT_OS != OperatingSystem.LINUX)
return null;
return LinuxGPUDetector.detect();
List<GraphicsCard> cards = LinuxGPUDetector.detect();
if (cards == null || cards.isEmpty()) {
List<GraphicsCard> fastfetchResults = super.detectGraphicsCards();
if (fastfetchResults != null) // Avoid overwriting empty lists with null
cards = fastfetchResults;
}
return cards;
}
private static final Path MEMINFO = Paths.get("/proc/meminfo");