Better default checking if VM is android

This commit is contained in:
nathan 2018-08-31 00:42:43 +02:00
parent 64143d85f5
commit dac1c9588b

View File

@ -19,11 +19,11 @@ import java.io.File;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.charset.Charset;
import java.security.AccessController;
import java.security.PrivilegedAction;
import java.util.Locale;
import java.util.TimeZone;
import io.netty.util.internal.SystemPropertyUtil;
public
class OS {
@ -77,27 +77,11 @@ class OS {
osArch = osArch.toLowerCase(Locale.US);
if (osName.startsWith("linux")) {
// best way to determine if it's android or not
boolean isAndroid;
try {
ClassLoader systemClassLoader;
if (System.getSecurityManager() == null) {
systemClassLoader = ClassLoader.getSystemClassLoader();
}
else {
systemClassLoader = AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() {
@Override
public
ClassLoader run() {
return ClassLoader.getSystemClassLoader();
}
});
}
Class.forName("android.app.Application", false, systemClassLoader);
isAndroid = true;
} catch (ClassNotFoundException e) { isAndroid = false; }
// best way to determine if it's android.
// Sometimes java binaries include Android classes on the classpath, even if it isn't actually Android, so we check the VM
String vmName = SystemPropertyUtil.get("java.vm.name");
boolean isAndroid = "Dalvik".equals(vmName);
if (isAndroid) {
// android check from https://stackoverflow.com/questions/14859954/android-os-arch-output-for-arm-mips-x86