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

使用 Visual Studio 2015 定向 x86 和 ARM 设备上的 Android 应用

2015年12月1日

CPOL

4分钟阅读

viewsIcon

12304

使用 Visual Studio 2015 定向 x86 和 ARM 设备上的 Android 应用

英特尔® 开发人员专区提供跨平台应用开发的工具和操作信息、平台和技术信息、代码示例以及同行专业知识,以帮助开发人员进行创新并取得成功。加入我们的 Android物联网英特尔® 实感™ 技术Windows 社区,下载工具、访问开发套件、与志同道合的开发人员分享想法,并参与编程马拉松、竞赛、路演和本地活动。

Android APK 可以支持七种不同的架构,这些架构由 APK 中 lib/<ABI> 文件夹中存在的 .so 文件(原生库)定义。 其中 <ABI> 对应于支持的架构,即在 Android 上:armeabiarmeabi-v7ax86mipsarm64-v8amips64x86_64

如果 APK 中没有 .so 文件,则会自动支持所有架构,但 Visual Studio* 2015 项目并非如此。来自 Visual Studio* 2015 Android* 应用程序项目的 APK 会生成特定于 CPU 的 APK,无论是 C# (Xamarin) 还是 Visual C++ 项目。

从单个 APK 支持 Android* 可以运行的所有架构是一种很好的做法。如果这使得 APK 太大,或者使用特定的工具链根本无法做到,则应用程序也可以在 Play* 商店上拥有多个 APK,每个 APK 针对不同的架构。

您必须遵循一个简单的规则才能正确打包和分发多个 APK:版本代码必须不同,并且最好按以下方式排序

x86_64 versionCode > arm64-v8a > mips64 > x86 > mips > armeabi-v7a > armeabi

此规则的原因是,Play 商店将始终分发具有最高版本代码的 APK,这些 APK 与客户端设备兼容。 x86(_64) 设备可能也能够运行 ARM APK,因此最高的版本代码必须分配给 x86_84 和 x86 APK,以便将正确的 APK 分发到可以更好地运行它们的设备上。

对于 Visual C# (Xamarin) 项目

在调试模式下,默认情况下会嵌入所有架构的 .so 文件。这可能会让您觉得在开发时一切正常,但实际上,在发布模式下,默认情况下仅集成 armeabi 库。

要更改此设置,请打开您的应用程序属性,并在Android 选项高级下,勾选所有您想要支持的架构

当您运行发布版本时,输出将是一个包含所有选定架构的库的 APK

如果您想缩小此 APK 的大小,您可以启用构建以生成每个架构一个 APK(版本代码将默认正确处理)

要了解如何将这些多个 APK 上传到 Play 商店上的单个应用程序,您需要按照本文末尾描述的步骤操作。

对于 Visual C++ 项目

默认情况下,Visual C++ 项目启用了两个目标:ARM (armeabi-v7a) 和 x86。

但是,为 x86 或 ARM 构建会生成仅包含 x86 或 ARM .so 文件的 APK。这很好,但这些 APK 具有完全相同的 versionCode,即在 AndroidManifest.xml 中设置的版本代码。这意味着它们不能都上传到同一应用程序的 Play 商店。

您可以通过添加自定义 ant 规则来让 Visual Studio 2015 生成具有不同版本代码的 ARM 和 x86 APK 来解决此问题。

创建一个名为 "custom_rules.xml" 的文件,内容如下

<project name="custom_rules">

  <available file="libs/x86" property="x86Dir.exists"/>
  <available file="libs/armeabi-v7a" property="armDir.exists"/>

  <target name="-pre-build-x86" if="x86Dir.exists" unless="armDir.exists">
    <echo>prefixing version code with 5 (for x86 ABI).</echo>
    <replaceregexp file="AndroidManifest.xml" match="android:versionCode.*([0-9]+).*"
        replace='android:versionCode="5\1"'/>
  </target>

  <target name="-pre-build-arm" if="armDir.exists" unless="x86Dir.exists">
    <echo>prefixing version code with 3 (for armeabi-v7a ABI).</echo>
    <replaceregexp file="AndroidManifest.xml" match="android:versionCode.*([0-9]+).*"
        replace='android:versionCode="3\1"'/>
  </target>

  <target name="-pre-build" depends="-pre-build-x86,-pre-build-arm" />

</project>

并将其放在 build.xml 文件旁边,位于 Packaging 项目的根目录中

完成此操作后,版本代码将在 x86 APK 中以 5 为前缀,在 ARM APK 中以 3 为前缀。这样,生成的 APK 就可以直接上传到 Play 商店,如下一节中所述。

将多个 APK 发布到 Play 商店

转到 APK 上传页面,如果需要,请单击“切换到高级模式”

然后,上传具有不同 ABI 支持和版本代码的 APK。它们应该像在 APK 管理屏幕上一样显示,并包含其差异和版本代码的摘要

如果出现问题,您可以使用 Android 构建工具中的 aapt 来检查 APK 支持哪些 versionCodenative-code

>C:\Android\sdk\build-tools\23.0.0-preview\aapt.exe dump badging App1.apk
package: name='com.xhallade.test versionCode='81' versionName='1.0' platformBuildVersionName='5.1.1-1819727'
…
native-code: 'x86_64'
>

如果您想直接从 Android 设备执行相同的操作并检查同时安装了哪些 .so 文件,您可以使用 Native Libs Monitor

参考文献

© . All rights reserved.