Android APK 可支持 APK lib/<ABI>文件夹中 .so 文件(本地库)规定的七种不同架构。 如果 <ABI>对应 Android 上支持的架构,则为: armeabi、armeabi-v7a、x86、mips、arm64-v8a、mips64、x86_64。
如果 APK 中没有 .so 文件,将自动支持所有架构,但 Visual Studio* 2015 项目例外。 Visual Studio* 2015 Android* 应用项目的 APK 可生成特定于 CPU 的 APK,无论是 C# (Xamarin) 或 Visual C++ 项目。
通过单个 APK 支持所有供 Android* 运行的架构是一条不错的实践。 如果这样导致 APK 太大或无法简单地通过特定工具链完成,应用可以在 Play* Store 上包含多个 APK,分别针对不同的架构。
大家必须遵循一条简单的规则以准确打包和分发多个 APK: 版本代码必须保持不同,最好以下列方式安排:
x86_64 versionCode > arm64-v8a > mips64 > x86 > mips > armeabi-v7a > armeabi
之所以要遵循这条规则,是因为 Play Store 将分发包含最高版本代码的 APK,从可与客户端设备兼容的开始。x86(_64) 设备也可以运行 ARM APK,因此最高版本代码需要依次前往 x86_84 和 x86 APK,以确保 APK 准确分发给能够供它们顺畅运行的设备。
对于 Visual C# (Xamarin) 项目
在调试模式下,面向所有架构的 .so 文件 均在默认状态下嵌入。 在开发过程中,这样看似一切正常。但实际上,在发布模式下,只有 armeabi库在默认状态下集成。
如要改变这种状态,请打开应用属性,在 Android Options,Advanced下方勾选所有你希望支持的架构:
运行发布构建时的输出将是包含所有已选架构的库的 APK:
如果你想缩小 APK,可以启用构建,以为每个架构生成一个 APK(版本代码将在默认状态下正确处理):
如要查看多个 APK 如何上传至 Play Store 的单个应用,你需要采取本文末尾部分的步骤。
关于 Visual C++ 项目
默认启用 Visual C++ 项目可实现两个目的: ARM (armeabi-v7a) 和 x86。
但面向 x86 或 ARM 的构建生成仅包含 x86 或 ARM .so 文件的 APK。 这样可以,但这些 APK 包含完全相同的 versionCode,它在 AndroidManifest.xml中设置。 这意味着它们均无法上传至面向同一应用的 Play Store。
为解决这一问题,你可以添加自定义 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>
并将它放在 Packaging 项目根目录的 build.xml文件旁边:
完成后,版本代码的前缀将分别为 5(面向 x86 APK)和 3(面向 ARM APK)。 这样生成的 APK 就可直接上传至 Play Store,如下一节所述。
在 Play Store 中发布多个 APK
如果需要,请前往 APK 上传页面,点击 “Switch to advanced mode”:
然后上传带有不同 ABI 支持和版本代码的 APK。 这样它们将出现在 APK 管理屏幕上,并带有差异与版本代码汇总,如下所示:
如果存在错误,你可以使用 Android 构建工具的 aapt检查 APK 支持的 versionCode和 native-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。