diff --git a/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt b/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt index 86a5555600..8094a2f195 100644 --- a/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt +++ b/paparazzi/src/main/java/app/cash/paparazzi/Environment.kt @@ -21,6 +21,7 @@ import java.nio.file.Path import java.nio.file.Paths import java.util.Locale import kotlin.io.path.exists +import kotlin.jvm.optionals.getOrNull data class Environment( val platformDir: String, @@ -110,3 +111,33 @@ private fun checkInstalledJvm() { ) } } + +internal val OsLabel: String by lazy { + val osName = System.getProperty("os.name").lowercase(Locale.US) + when { + osName.startsWith("windows") -> "win" + osName.startsWith("mac") -> { + // System.getProperty("os.arch") returns the os of the jre, not necessarily of the platform we are running on, + // try /usr/bin/arch to get the actual architecture + val osArch = ProcessBuilder("/usr/bin/arch") + .start() + .inputStream + .bufferedReader() + .lines() + .findFirst() + .getOrNull() + ?.lowercase(Locale.US) + ?.let { + if (it.startsWith("i386")) "mac" else "mac-arm" + } + val jreArch = System.getProperty("os.arch").lowercase(Locale.US).let { + if (it.startsWith("x86")) "mac" else "mac-arm" + } + if (osArch != null && osArch != jreArch) { + System.err.println("Mismatched architectures, os is:$osArch but the JRE is running with:$jreArch. Installing the correct JDK for your architecture will improve performance.") + } + osArch ?: jreArch + } + else -> "linux" + } +} diff --git a/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt b/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt index 554c0a9e89..9aee85f752 100644 --- a/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt +++ b/paparazzi/src/main/java/app/cash/paparazzi/internal/Renderer.kt @@ -19,6 +19,7 @@ package app.cash.paparazzi.internal import app.cash.paparazzi.DeviceConfig import app.cash.paparazzi.Environment import app.cash.paparazzi.Flags +import app.cash.paparazzi.OsLabel import app.cash.paparazzi.Paparazzi import app.cash.paparazzi.deprecated.com.android.ide.common.resources.deprecated.FrameworkResources import app.cash.paparazzi.deprecated.com.android.ide.common.resources.deprecated.ResourceItem @@ -35,7 +36,6 @@ import com.android.layoutlib.bridge.impl.DelegateManager import java.io.Closeable import java.io.File import java.nio.file.Paths -import java.util.Locale import kotlin.io.path.name /** View rendering. */ @@ -188,16 +188,7 @@ internal class Renderer( } private fun getNativeLibDir(): String { - val osName = System.getProperty("os.name").toLowerCase(Locale.US) - val osLabel = when { - osName.startsWith("windows") -> "win" - osName.startsWith("mac") -> { - val osArch = System.getProperty("os.arch").lowercase(Locale.US) - if (osArch.startsWith("x86")) "mac" else "mac-arm" - } - else -> "linux" - } - return "$osLabel/lib64" + return "$OsLabel/lib64" } override fun close() {