配置项目以使用 Android 游戏开发扩展。
Android 游戏开发扩展会调用 MSBuild 来将 C/C++ 源代码构建成共享库 (.so
) 和静态库 (.a
)。作为构建过程的一部分,自定义 MSBuild 任务会调用 Gradle 来编译 Java 和 Kotlin 源代码、打包资源并生成用于部署的 APK 文件。配置项目时,您必须确保 MSBuild 拥有为 Android 平台构建所需的信息。
使用 MSBuild 构建 C/C++
典型的 Android 项目是使用 Gradle 构建的,项目中的原生代码由运行 CMake 或 ndk-build 的 Gradle 流程构建。使用适用于 Visual Studio 的 Android 游戏开发扩展后,构建过程会反转。现在 MSBuild 是构建过程的起点。所有 C/C++ 源代码都首先由 MSBuild 为系统上作为扩展安装的新 Android 平台(例如“Android-x86_64”)构建。然后 MSBuild 会调用 Gradle 将包含 C/C++ 逻辑的共享库文件打包到 APK 中。
您应该首先在 MSBuild 中复制项目中现有 CMake 或 ndk-build 的构建逻辑。将目标平台设置为以下项:
- Android-x86
- Android-x86_64
- Android-armeabi-v7a
- Android-arm64-v8a
这些平台都由 Android 游戏开发扩展提供。
设置您的编译和链接选项
AGDE 使用您选择的 NDK 来确定构建应用 C/C++ 部分时的默认编译和链接选项。
如果您需要自定义这些编译或链接选项,可以使用项目属性进行设置。您可以在 C/C++(用于编译)、Librarian(用于静态库存档)和 Linker(用于动态库链接)组中找到最常见的选项。如果您需要传递其他自定义选项,可以将其添加到“命令行”部分。例如,如果您使用的 NDK 早于 r28,您可能需要设置链接器标志以使您的应用支持 16 KB 的页面大小。
添加 Android 平台
虽然 teapot 示例项目包含 Android 平台,但您必须手动将 Android 平台添加到现有项目。要在 Visual Studio 中添加新平台,请执行以下操作:
- 选择构建 > 配置管理器。
- 在活动解决方案平台下,选择<新建>。
为新平台键入以下项之一:
- Android-armeabi-v7a
- Android-arm64-v8a
- Android-x86
- Android-x86_64
在从以下位置复制设置框中,选择另一个现有 Android 平台,如果尚未有任何 Android 平台,则选择<空>。确保您已启用创建新项目平台。
添加 Android APK 项
选择添加 > 新建项 > Visual C++ > Android > Android APK,然后点击添加。在以下对话框中配置 Android 应用。
- 应用名称:您的 Android 应用的人类可读名称。
- 应用 ID:您的 Android 应用的唯一标识符。
- 解决方案资源管理器位置:包含已添加的 Android 打包支持文件的虚拟文件夹的位置。默认情况下,这些文件也位于项目中的同名文件夹中。您可以通过选中将支持文件放在自定义位置复选框并指定自定义位置来调整位置。虚拟文件夹仍将位于解决方案资源管理器中当前项目下。
让 MSBuild 调用 Gradle 构建 APK
除非 MSBuild 知道 Gradle 项目的位置,否则它无法调用 Gradle。如图 1 所示,使用Gradle 构建目录属性设置此位置。
图 1。Gradle 构建目录属性
此外,设置应用模块、应用变体和 APK 名称属性(如上图所示),以便 MSBuild 知道要构建什么。
- 应用模块:Gradle 子项目的名称。这是
settings.gradle
文件中设置的主项目。对于直接使用 Android Studio 创建的项目,通常称为app
。 - 应用变体:要构建的 Android 变体。此值应根据 MSBuild 配置进行设置。例如,调试构建应将值设置为调试变体。如果您的项目的 MSBuild 配置名称与 Gradle 变体名称匹配,则只需使用默认值
$(Configuration)
。 - APK 名称:用于在您的开发计算机上调试和分析生成的 APK 文件的名称。此名称会传递给 Gradle,您的 Gradle 构建脚本应遵守此名称(请参阅下一部分中的属性
MSBUILD_ANDROID_OUTPUT_APK_NAME
)。
修改您的 Gradle 构建脚本
在构建期间,MSBuild 将以下信息作为项目属性传递给 Gradle 脚本。修改您项目现有的构建脚本(通常名为 build.gradle
)以读取这些属性。
MSBUILD_MIN_SDK_VERSION
:构建 APK 的最低 SDK 版本,作为字符串。如图 2 所示,在项目属性页面上的最低 Android SDK 版本框中设置此值。
图 2。最低 Android SDK 版本属性Gradle 构建脚本应将
minSdkVersion
或minSdk
设置为此字符串值,必要时进行toInteger()
类型转换。Groovy
android { // ... defaultConfig { applicationId "com.yourcompany.yourapp" minSdkVersion MSBUILD_MIN_SDK_VERSION // Or: minSdk MSBUILD_MIN_SDK_VERSION.toInteger() // ... } // ... }
Kotlin
android { // ... defaultConfig { applicationId = "com.yourcompany.yourapp" minSdkVersion(MSBUILD_MIN_SDK_VERSION) // Or: minSdk = MSBUILD_MIN_SDK_VERSION.toInteger() // ... } // ... }
MSBUILD_ANDROID_OUTPUT_APK_NAME
:Gradle 构建的 APK 的预期名称。Android 游戏开发扩展将查找与此名称匹配的 APK,然后将其部署到连接的设备(用于调试和分析)。如图 3 所示,在项目属性页面上的 APK 名称框中设置此值。
图 3。APK 名称属性Gradle 构建脚本必须遵守此属性。例如,以下示例将所有变体的输出 APK 名称设置为 MSBuild 选择的名称。
Groovy
android { // ... applicationVariants.all { variant -> variant.outputs.all { outputFileName = MSBUILD_ANDROID_OUTPUT_APK_NAME } } // ... }
Kotlin
android { // ... applicationVariants.all { variant -> variant.outputs.all { outputFileName = MSBUILD_ANDROID_OUTPUT_APK_NAME } } // ... }
MSBUILD_JNI_LIBS_SRC_DIR
:包含 MSBuild 构建的共享库(.so
文件)的目录。在下方显示的项目属性页面上的输出目录框中设置此值。默认情况下,此值为 Visual Studio 项目的输出目录属性,如图 4 所示。
图 4。输出目录属性Gradle 应将此文件夹中的共享库文件打包到 APK 中,以便 Android 应用在运行时加载它们。
Groovy
android { // ... sourceSets { main { jniLibs.srcDirs += [MSBUILD_JNI_LIBS_SRC_DIR] } } // ... }
Kotlin
android { // ... sourceSets.getByName("main") { jniLibs.srcDir(MSBUILD_JNI_LIBS_SRC_DIR) } // ... }
此外,由于任何 C/C++ 代码现在都由 MSBuild 构建,请删除 Gradle 构建脚本中的
externalNativeBuild
部分。这些部分曾用于调用 CMake 或 ndk-build 来编译您的 C/C++ 代码,但现在已不再需要。MSBUILD_NDK_VERSION
:用于构建项目的 NDK 版本。如图 5 所示,在项目属性页面上的 Android NDK 版本框中设置此值。
图 5。Android NDK 版本属性Gradle 构建脚本应将
ndkVersion
设置为此值,如所示Groovy
android { // ... ndkVersion MSBUILD_NDK_VERSION // ... }
Kotlin
android { // ... ndkVersion = MSBUILD_NDK_VERSION // ... }
有关更多信息,请参阅 Android Studio 主题 安装和配置 NDK 和 CMake。