【问题标题】:Can ARM64 run ARM assembly in compatibility mode?ARM64 可以在兼容模式下运行 ARM 程序集吗?
【发布时间】:2018-09-08 10:42:01
【问题描述】:

这是一个第 3 方库,我无权访问它的源代码 - 要求他们为 ARM64 构建到目前为止没有任何效果,尽管他们声称 Android 8.0(仅限 ARM64)将得到“支持”。

以下 Java 代码在 armv7l 上运行,但在 aarch64 上运行失败:

static {
    switch(System.getProperty("os.arch")){
        case "aarch64":
        case "armv7l":
            try {
               System.loadLibrary("somelibrary");
            } catch(UnsatisfiedLinkError e) {
                Log.e(LOG_TAG, e.getMessage());
            }
            break;
    }
}

dlopen 失败:“/data/app/ ... /base.apk!/lib/arm64-v8a/somelibrary.so”是 32 位而不是 64 位。

似乎AArch32 执行将是“可选的”(甚至可能不可用) - 因为(很可能)必须将 CPU 从AArch64 切换到AArch32 执行。例如。此幻灯片涵盖了该主题:Linux on AArch64 ARM 64-bit Architecture

问:有没有办法在 64 位 Android 设备上使用 32 位库?


事实证明,Google Play 不接受这 - 需要提供 ARM64 本机程序集。

【问题讨论】:

  • “尽管他们声称 Android 8.0(仅限 ARM64)”:是什么让您认为 Android 8.x 只有 64 位?
  • @Marged 因为没有 32 位 QEMU 映像(API 级别 25 是最后一个); Nexus 6 也没有 Oreo 更新,它是 Snapdragon 805(但只有 Nexus 6 P,它是 Snapdragon 810)......任何运行 Oreo 的 armv7l 设备示例(自定义 ROM 除外,类似 SIX )?
  • 好的,但 Android 8.x 也可以在(物理)32 位设备上运行
  • SIX ROM 确实证明,这是可能的,但谷歌停止支持它。

标签: android native android-8.0-oreo arm64


【解决方案1】:

您在智能手机中找到的任何 arm64 CPU 也应该能够运行 arm32 代码。

但是,至少需要满足三个要求:

  1. 您的进程不能混合使用 64 位和 32 位代码 - 它必须是其中之一。
  2. 您的操作系统(或您)必须提供您链接到的所有动态库的 32 位版本。
  3. 您的操作系统内核必须支持 32 位进程;它将负责在您的进程使用 CPU 时切换执行模式。

3 号很好; Android 使用Linux-like 内核,它支持arm64 上的arm32 进程。

2号可能没问题;我不知道你从哪里听说过 Android 8.0 只有 64 位,但这不是真的。设备制造商可以选择排除 32 位支持,但我不知道有什么做法(因为这会阻止仅支持 32 位的旧版应用和游戏在他们的设备上运行)。

当然,在手机上同时提供 32 位和 64 位库意味着操作系统会占用更多存储空间,因此未来绝对有可能只使用 64 位设备。仅 32 位的游戏或应用程序无法在这些设备上运行。

第 1 个问题是您的问题:您的应用作为 64 位进程运行,并且正在尝试加载 32 位库。这行不通。

解决方案是让您的应用仅支持 32 位。但是,如果您可以避免这一切,我建议您不要这样做(即不要使用该库)。您的应用将无法在未来可能发布的任何 64 位设备上运行。

【讨论】:

  • 感谢您的解释,它为我提供了一些提示。当我将库放入 armeabi 时,它会抱怨 Unable to strip library '...lib/armeabi/somelibrary.so' due to missing strip tool for ABI 'ARMEABI'. Packaging it as is. ...但是,实际上可以使用它。
  • 我认为该警告表明您缺少一些 32 位 NDK 工具,但我不确定。
  • 它只发生在armeabi 目录(似乎适用于两种架构),而不是armeabi-v7a 目录(明确是32 位)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
相关资源
最近更新 更多