【问题标题】:How to know a process of an app is 32-bit or 64-bit programmatically in Android lollipop?如何在 Android lollipop 中以编程方式知道应用程序的进程是 32 位还是 64 位?
【发布时间】:2015-01-23 03:08:43
【问题描述】:

众所周知,Android 5.0.64 位支持已经存在。我有一个非常简单的问题。我们可以以编程方式检查任何应用程序在什么模式下运行,即 32 位或 64 位?例如:我的 Nexus 9 上运行了 Facebook 应用,那么如果 Facebook 应用的进程是在 32 位模式还是 64 位模式下运行,我可以使用我的 android 应用检查吗?

【问题讨论】:

  • 我不确定 Clang 从哪里得到三元组 armv8l-unknown-linux-gnueabihf。它出现在我拥有的基于 Debian 的 ARM 32 位 Cortex-A7 板上。该工具链据称针对 64 位 Aarch64 Cortex-A53 CPU。 Autotools 将编译器三元组 armv8l-unknown-linux-gnueabihf 重写为 armv7l-unknown-linux-gnueabihf

标签: android 32bit-64bit android-5.0-lollipop


【解决方案1】:

在 Nexus 5x 中

String arch = System.getProperty("os.arch");

返回

armv8l

不是aarch64,我的代码坏了。然而,

root@bullhead:/ # uname -m
aarch64

root@bullhead:/ # getprop ro.product.cpu.abilist
arm64-v8a,armeabi-v7a,armeabi

有线。所以我将代码更改为

boolean is64 = (android.os.Build.VERSION.SDK_INT >= 21) && System.getProperty("ro.product.cpu.abilist").contains("64");

2016 年 2 月 11 日更新

在三星三星 Galaxy S5 Neo、Android 5.1.1 中

String arch = System.getProperty("os.arch");

返回 aarch64 但它不是 64 位设备!!!

ro.product.cpu.abilist 返回armeabi-v7a,armeabi

bool is64Bit =   System.getProperty("ro.product.cpu.abilist").contains("64");

检查是检查的唯一方法。

【讨论】:

    【解决方案2】:

    试试System.getProperty("os.arch")。 我没有在 64 位 android 上尝试过,但在 64 位设备的情况下它必须返回类似 'aarch64' 的内容。

    http://developer.android.com/reference/java/lang/System.html#getProperty(java.lang.String)

    【讨论】:

    • 感谢您的回答。我验证了: System.getProperty("os.arch") 在 64 位设备的情况下返回 aarch64。
    • 谢谢,它也对我有用。但是,为了安全起见,我没有将结果与“aarch64”进行比较,而是检查它是否包含“64”。 :)
    【解决方案3】:

    根据我的经验(如果您的 minSdkVersion >= 21),最好的方法是检查数组 Build.SUPPORTED_64_BIT_ABIS 的大小。 (见https://developer.android.com/reference/android/os/Build#SUPPORTED_64_BIT_ABIS

    类似这样的:

    public static boolean is64Bit() {
     return (Build.SUPPORTED_64_BIT_ABIS!= null && Build.SUPPORTED_64_BIT_ABIS.length >0);
    }
    

    【讨论】:

      【解决方案4】:
          public static boolean is64Bit() {
              if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                  //Added in API level 23
                  return Process.is64Bit();
              }
              try {
                  Class cls = Class.forName("dalvik.system.VMRuntime");
                  Method getRuntimeMethod = cls.getDeclaredMethod("getRuntime");
                  Object vmRuntime = getRuntimeMethod.invoke(null);
                  Method is64BitMethod = cls.getDeclaredMethod("is64Bit");
                  Object is64Bit = is64BitMethod.invoke(vmRuntime);
                  if (is64Bit instanceof Boolean) {
                      return (boolean) is64Bit;
                  }
              } catch (Exception e) {
                  e.printStackTrace();
              }
              return false;
          }
      

      IMO,您可以使用反射来获得 is64Bit 的结果。 Android 6.0开始提供这个api来检查你的进程。

      android.os.Process.is64Bit() 
      

      【讨论】:

      • 为您的答案添加更多详细信息。
      【解决方案5】:

      是什么让您认为您的设备不是 64 位的?手机的 specs 表示它使用的是 arm8 和 64 位的 Exynos 7 Octa 7580

      【讨论】:

        【解决方案6】:
        boolean is64Arch = Build.CPU_ABI.equalsIgnoreCase("x86_64") || Build.CPU_ABI.equalsIgnoreCase("arm64-v8a");
        

        【讨论】:

        • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助、质量更好,并且更有可能吸引投票。
        猜你喜欢
        • 2010-12-29
        • 1970-01-01
        • 2011-05-04
        • 2011-04-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多