65.9K
CodeProject 正在变化。 阅读更多。
Home

Intel® 架构支持指南,面向 Android 中间件提供商

2015年8月4日

CPOL

5分钟阅读

viewsIcon

16253

本文档概述了在库/引擎层面需要做什么才能更好地支持 Intel 平台。

Intel® Developer Zone 提供跨平台应用开发工具和操作指南、平台和技术信息、代码示例以及同行专业知识,以帮助开发者进行创新和取得成功。加入我们的社区,了解 Android物联网Intel® RealSense™ 技术Windows,下载工具、访问开发套件、与志同道合的开发者交流想法,并参与黑客松、竞赛、路演和本地活动。

自 2011 年以来,x86 支持就一直是 Android 的一部分,如今,随着 Dell Venue* 8 7840、Nokia* n1、Google Nexus* Player 等旗舰产品以及 200 多种其他设备都基于 Intel® 架构,对于中间件软件提供商来说,支持 x86 设备变得越来越重要。

在选择第三方中间件时,公司会仔细考虑支持哪些 CPU 架构,因为这个选择将直接影响最终应用程序的兼容性,可能会促成或破坏交易。

在许多情况下,支持 x86 是必要的。但请注意,这仅适用于实际使用特定于架构的二进制文件(通常是打包在最终 APK 中的 .so 文件)的中间件。可以使用 Zip 存档查看器、aapt dump badging 命令或 Native Libs Monitor 来检查 APK 中是否存在 .so 文件。

截至 NDK r10d,Android 支持以下 CPU 架构(ABI):armeabi、armeabi-v7a、x86x86_64、arm64-v8a、mips 和 mips64。

添加 x86/x86_64 支持的方式完全取决于开发者手中掌握的内容(源代码?库?工具链?服务?)。通常,添加此类支持是通过遵循 Android 的最佳开发实践来完成的。

由于 Android 最初只支持 ARM*,一些提供商没有过多关注支持其他平台。为了克服这个问题,Intel 提供了在 Intel 设备上运行时翻译 ARM 二进制文件的能力,并且效果很好。但是,中间件提供商应该为 Intel® 架构提供本地支持。

本文档概述了在库/引擎层面需要做什么才能更好地支持 Intel 平台。

确定了两种主要情况:

  1. 提供组件/库(OpenCV、ffmpeg 等)。开发者可以将其集成到自己的 Android 项目中。
  2. 提供完整的堆栈/服务(如 Unity、Adobe Air*、Corona* 等)。软件或服务负责 Android 项目的创建和/或 APK 打包。

在这两种情况下,都应该为客户提供文档和示例项目,这当然需要正确打包并将 x86/x86_64 库包含在最终应用程序中。

提供可供 Android 开发者重用或集成的库/引擎

具有本地组件的库和引擎可以以不同的形式分发:多个 .jar 文件、一个 .aar 文件、一个 NDK 项目、一个 Android 项目等。

如果库由 Java* 库和 .so 文件组成,则应将其分发为 .aar 文件,而不是 .jar 文件附带 .so 文件。AAR 是为 Android 扩展的 .jar 文件,允许包含资源和本地库。一旦 AAR 文件上传到 Maven Central Repository / jCenter,Android 开发者就可以轻松地将其包含进来。

您应该将 .so 文件放在 .aar 文件下的 ./jni/<ABI> 目录中。对于 x86,请将 .so 文件放在 ./jni/x86/ 下。

如果库作为 NDK 预编译库(.so 或 .a 文件)分发,以便从 NDK 项目重用,则应该使用动态变量 $(TARGET_ARCH_ABI) 在 Android.mk 文件中提供 NDK 模块声明,以便根据各种目标架构指向正确的文件。

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)				
LOCAL_MODULE := yourlib	
LOCAL_SRC_FILES := prebuilts/$(TARGET_ARCH_ABI)/libYourLib.so
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/prebuilts/includes
include $(PREBUILT_SHARED_LIBRARY)

同时,在 Application.mk 文件中设置所有支持的架构,如下所示:

APP_ABI := all # can also be: armeabi-v7a x86 x86_64 arm64-v8a…

如果库通过完整的 Android 项目分发,则必须将 .so 文件包含在正确的位置。

  • 在 Eclipse*/Apache Ant* 项目中,将它们放在 libs/<ABI> 下。
  • 在 Android Studio/gradle 项目中,将它们放在 src/main/jniLibs/<ABI> 下。

要更改由 gradle 管理的项目的 jniLibs 位置,请使用 build.gradle 文件中的 jniLibs.srcDir 属性。例如,您可以将其设置回与 Eclipse 相同的位置,即 libs,其中生成 NDK 库:sourceSets.main { jniLibs.srcDir 'src/main/libs' }.

应用程序打包

在提供负责 APK 打包的完整服务和/或软件时,您需要正确生成兼容的 APK。

推荐的(也是默认的)方法是打包一个 APK,并将所有支持架构的 .so 文件放入 APK 中的 lib/<ABI>/ 目录下。其中 <ABI> 可以是 armeabi、armeabi-v7a、x86、x86_64、arm64-v8a、mips、mips64。

当然,您至少应该包含 x86 以更好地支持 x86 平台。

要正确地将这些 .so 文件打包在 lib/<ABI> 下,默认情况下,在使用 Ant/Eclipse 项目时,它们必须放在 libs/<ABI> 下;在使用 gradle/Android Studio 项目时,必须放在 src/main/jniLibs/<ABI> 下。

当支持可以嵌入特定于架构的二进制文件的第三方插件(如 Unity)时,需要注意确保这些插件与所有支持的平台兼容。在 Android 5.0 之前,仍然可以从 x86 文件夹加载 ARM 库。但现在已不再可能,这会导致“dlopen failed: ‘libMyLib.so’ has unexpected e_machine: 40”等错误。因此,必须升级插件以包含 x86 二进制文件,并且引擎/服务必须强制执行此操作,以实现平稳过渡。

减小生成的 APK 尺寸

如果 .so 文件的大小过大,无法将多个版本的库嵌入其中,则可以为每个架构打包一个 APK。唯一的要求是生成一个 APK,其中包含放置在正确 lib/<ABI> 文件夹中的不同 .so 文件集,并且具有不同的 versionCodes,遵循此规则:x86_64 > x86 > arm64-v8a > armeabi-v7a > armeabi > mips64 > mips 版本代码

使用 gradle 时,可以通过在 build.gradle 中添加以下代码,使用 splits 和 dynamic version code,在一次构建中无缝实现所有这些目标(所有合适的 APK 都会在此构建中生成)。

android {
...
splits {
   	abi {
       	enable true
       	reset()
       	include 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
       	universalApk true
   	}
   }
   // map for the version code
   project.ext.versionCodes = ['armeabi': 1, 'armeabi-v7a': 2, 'arm64-v8a': 3, 'mips': 5, 'mips64': 6, 'x86': 8, 'x86_64': 9]
   applicationVariants.all { variant ->
   	// assign different version code for each output
   	variant.outputs.each { output ->
       	output.versionCodeOverride =
               	project.ext.versionCodes.get(output.abiFilter, 0) * 1000000 + android.defaultConfig.versionCode
   	}
   }
...
}

要为单个应用程序将多个 APK 上传到 Google Play* 商店,您需要在上传第二个 APK 之前切换到高级模式。

上传所有 APK 后,可用的 APK 摘要应如下所示:

结论

在可能的情况下,添加 Intel 架构支持通常非常简单,中间件供应商应考虑在其软件中提供支持,以便其客户可以使用。Android Native Development Kit 自 2011 年以来已内置此功能。

如果您在重新编译问题上需要帮助,Intel® Developer Zone (software.intel.com) 提供了有关此主题的其他文章,例如 NDK 应用移植方法NEON* 到 Intel® SSE 指令自动移植解决方案

为了测试您的应用程序,Intel 通过知名的 远程测试服务(如 AppThwack*、testdroid* 和 Testin*)提供免费使用基于 Intel® 处理器的设备。

© . All rights reserved.