如何确定我的应用程序是不是在 Android 上运行 [重复]

Posted

技术标签:

【中文标题】如何确定我的应用程序是不是在 Android 上运行 [重复]【英文标题】:How to determine if my app is running on Android [duplicate]如何确定我的应用程序是否在 Android 上运行 [重复] 【发布时间】:2011-05-30 00:09:03 【问题描述】:

我有一个应用程序可以在多个运行 Fedora 或 android 的移动设备上运行。为了整合我的代码库和分发,我想确定我在哪个操作系统上。我尝试了 System.getProperty("os.name"),但它只返回“Linux”。系统属性中是否有 Android 独有的东西? 谢谢

【问题讨论】:

How do I programmatically determine operating system in Java?的可能重复 @jww “os.name” 属性在 Android 上是 null,其中大多数答案似乎都依赖于此。不依赖 Apache Commons 的那些,它没有检查 Android。 【参考方案1】:

您可以检查几个属性。候选人是:

java.vendor.url --> http://www.android.com java.vm.name --> Dalvik(我不知道,Fedora 用的是哪一个...) java.vm.vendor --> Android 项目 java.vendor --> Android 项目

也许您想自己检查一下?

Properties p = System.getProperties();
Enumeration keys = p.keys();
while(keys.hasMoreElements()) 
   String key = (String) keys.nextElement();
   String value = (String) p.get(key);
   System.out.println(key + " >>>> " + value);

【讨论】:

谢谢,我选择了 "java.runtime.name" = "android runtime"。 嗨,这确实很有帮助。 Android 人员是否有任何官方消息说明其中哪些将保持不变?谢谢。 短:System.getProperties().list(System.out); @user552447 应该是“Android 运行时” 从 Android 5 开始,java.runtime.name 返回 null。所以,它是不​​可靠的。【参考方案2】:

我不了解 Android,但如果您没有找到一些独特的系统属性,您有时可以识别系统(如果那里存在某个特定的类)。因此,您可以执行以下操作:

boolean isAndroid() 
    try 
        Class.forName("the class name");
        return true;
     catch(ClassNotFoundException e) 
        return false;
    

【讨论】:

+1 你可以在 android 包中寻找一个类。例如活动。 这也是个好主意,但源可能有也可能没有android.jar。 这在使用像 Robolectrics 这样的测试工具时不起作用。 我将这种方法与android.os.Build 类一起使用——这是Android 应用程序需要检查不同Android 平台配置的类,请参阅developer.android.com/reference/android/os/Build。因此,如果您的应用程序想知道 - 不仅是它是否是 Android - 还想知道您在哪种 Android 下运行,那么您实际上希望获得一个指向 Build 的类引用。 或者,您可以查找 Android 平台不提供的类,例如 java.lang.instrument.ClassFileTransformer(从 Java 5 开始)。【参考方案3】:

这是我使用此页面中的信息编写的一些代码,以防您想复制粘贴:

private static YLogger ylogger;
public static YLogger getLogger() 
    if (ylogger == null)
        // need to find a new logger. Let's check if we have Android running
        if (System.getProperty("java.vm.name").equalsIgnoreCase("Dalvik"))
            ylogger = new AndroidLogger();
            ylogger.d("YLoggerFactory", "Instantiating Android-based logger");
         else 
            // fallback option, system logger.
            ylogger = new SystemLogger();   
            ylogger.d("YLoggerFactory", "Instantiating System-based logger");
        
    
    return ylogger;

【讨论】:

这可能会与 ART 中断。 有点骇人听闻,但这可能会有所帮助boolean isAndroid; try Class.forName("android.app.Activity"); isAndroid = true; catch (ClassNotFoundException e) isAndroid = false; 如何在后端编译它(没有 Android 库)?会因为缺少 AndroidLogger 类而失败【参考方案4】:

定义的系统属性列表在这里:https://developer.android.com/reference/java/lang/System#getProperties()

我正在使用

boolean android = "The Android Project".equals(System.getProperty("java.specification.vendor"));

【讨论】:

这似乎是最稳定且非常清晰和详细的解决方案。在普通/Java.Oracle JVM 上,同样的属性返回 "Oracle Corporation" Java 被 Oracle 从 SUN 手中接管,而 Java 6 是最新版本,因此至少在 Java 5 之前,这将是一个不同的值。【参考方案5】:

我在我的处理草图中使用它来确定我在哪种模式下运行,即我在哪里运行它。

enum Mode 
  java, android


Mode getMode() 
  return System.getProperty("java.runtime.name").equals("Android Runtime") ? Mode.android : Mode.java;


if (getMode() == Mode.java)
  // do something
  // eg: do something that android can't handle
 else 
  // do android stuff 
  // eg: scale the sketch by 2 to improve visibility

【讨论】:

你需要使用 equals() 而不是 "==" 来比较字符串。 @PeterQuiring 这是否是最佳实践? “==”对我有用。 它一般不应该在 Java 中工作。 == 仅比较对象是否完全相同。 equals() 将对 char 数组进行深度比较。 如果编译器正在对字符串进行重复数据删除,这可能是偶然的,因为这两个对象是相同的。 @PeterQuiring 我编辑了它。感谢您纠正我的错误。

以上是关于如何确定我的应用程序是不是在 Android 上运行 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何确定我的 android 应用程序是不是存在内存泄漏?

跨越不确定风险,华为云 SRE 探索云上运维的确定性答案

跨越不确定风险,华为云 SRE 探索云上运维的确定性答案

如何确定Android应用程序是不是被强制关闭?

Android 如何确定应用在“最近的位置请求”下是不是存在“高电量使用”?

Android - 如何确定坐标是不是位于谷歌地图中的道路上