我如何区分 Unix 和 NetStandard 2.0 上的 Android?

How can I distinguish between Unix and Android on NetStandard 2.0?

我需要在 .NetStandard 2.0 库中在运行时区分 Android 和 Unix。该库必须针对 .Net Standard 进行编译,因此 #if ANDROID 解决方案不合适。 Environment.OSVersion returns Unix 3.18.14.12365438 Android。

https://www.nuget.org/packages/Xam.Plugin.DeviceInfo/ 等其他解决方案无法在 Android 上运行,因为 Mono 配置文件在运行时丢失,并且只有在为多个目标编译库时才有可能。

有没有办法在运行时检测到这个?

你需要一些环保的东西。

无需进入本机共享库 (.so) 和权限问题,API 差异等。DLLImport externs 不是一个很好的选择。

存在的 OS 文件可能由于沙盒而变得麻烦,因此应避免 File.Exists

但是 Android 确实有一个 cmd getprop 对任何用户(即非 root)可用,它总是在 shell 路径中,因此如果它执行并且 return 是您在 Android 上的值。便宜但好用...

public static class AndroidTest
{
    static bool? isAndroid;
    public static bool Check()
    {
        if (isAndroid != null) return (bool)isAndroid;
        using (var process = new System.Diagnostics.Process())
        {
            process.StartInfo.FileName = "getprop";
            process.StartInfo.Arguments = "ro.build.user";
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.CreateNoWindow = true;
            try
            {
                process.Start();
                var output = process.StandardOutput.ReadToEnd();
                isAndroid = string.IsNullOrEmpty(output) ? (bool?)false : (bool?)true;
            }
            catch
            {
                isAndroid = false;
            }
            return (bool)isAndroid;
        }
    }
}

注意: 当然有人可以欺骗 getprop cmd 及其 return 值来欺骗这个, 或任何其他环境检查,但除非您可以访问 Android 本机 APIs 并且希望保持 100% 的可移植性,否则我看不到解决它的方法...