프로젝트 구성

Android 게임 개발 확장 프로그램을 사용하도록 프로젝트를 구성합니다.

Android 게임 개발 확장 프로그램은 MSBuild를 호출하여 공유 라이브러리(.so)와 정적 라이브러리(.a)에 C/C++ 소스 코드를 빌드합니다. 빌드 프로세스의 일부로 맞춤 MSBuild 작업에서는 Gradle을 호출하여 자바 및 Kotlin 소스 코드를 컴파일하고 애셋을 패키징하며 배포용 APK 파일을 생성합니다. 프로젝트를 구성할 때 MSBuild에 Android 플랫폼용으로 빌드하는 정보가 있는지 확인해야 합니다.

MSBuild로 C/C++ 빌드

일반적인 Android 프로젝트는 Gradle로 빌드됩니다. Gradle에서는 프로젝트 내부의 네이티브 코드가 CMake 또는 ndk-build를 실행하는 Gradle 패스를 통해 빌드됩니다. Visual Studio용 Android 게임 개발 확장 프로그램을 사용하면 빌드 프로세스는 반대가 됩니다. 이제는 MSBuild가 빌드 프로세스의 시작점이 됩니다. 모든 C/C++ 소스 코드는 새로운 확장 프로그램의 일부로 시스템에 설치된 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 게임 개발 확장 프로그램에서 제공됩니다.

Android 플랫폼 추가

teapot 샘플 프로젝트에는 Android 플랫폼이 포함되어 있지만 기존 프로젝트에 Android 플랫폼을 수동으로 추가해야 합니다. 새 플랫폼을 추가하려면 Visual Studio에서 다음 작업을 수행하세요.

  1. Build > Configuration Manager를 선택합니다.
  2. Active solution platform에서 <New>를 선택합니다.
  3. 새 플랫폼과 관련해 다음 중 하나를 입력합니다.

    • Android-armeabi-v7a
    • Android-arm64-v8a
    • Android-x86
    • Android-x86_64
  4. Copy settings from 상자에서 다른 기존 Android를 선택합니다. 플랫폼 또는 아직 Android 플랫폼이 없는 경우 <Empty>입니다. 새 프로젝트 플랫폼 만들기를 사용 설정했는지 확인합니다.

Android APK 항목 추가

추가 > 새 항목 > 비주얼 C++ > Android > Android APK를 열고 추가. 다음 대화상자에서 Android 애플리케이션을 구성합니다.

  • Application Name: 사람이 읽을 수 있는 Android 애플리케이션 이름입니다.
  • Application ID: Android 애플리케이션의 고유 식별자입니다.
  • Solution Explorer Location: 추가된 Android 패키징 지원 파일이 포함된 가상 폴더의 위치입니다. 기본적으로 이러한 파일은 이름이 동일한 폴더의 프로젝트에도 있습니다. 사용자는 Put support files in a custom location(지원 파일을 맞춤 위치에 배치) 체크박스를 선택하고 맞춤 위치를 지정합니다. 가상 폴더는 계속해서 Solution Explorer의 현재 프로젝트 아래에 배치됩니다.

APK를 빌드할 Gradle을 호출하도록 MSBuild 설정

MSBuild는 Gradle 프로젝트의 위치를 모를 경우 Gradle을 호출할 수 없습니다. 그림 1에 나와 있는 것처럼, Gradle Build Directory 속성을 사용하여 이 위치를 설정합니다.


그림 1. Gradle Build Directory 속성

또한 MSBuild에서 빌드할 대상을 인식할 수 있도록, 이전 이미지에 나와 있는 것처럼 Application Module, Application VariantAPK Name 속성을 설정합니다.

  • Application Module: Gradle 하위 프로젝트의 이름. 이는 settings.gradle 파일에 설정된 기본 프로젝트입니다. Android 스튜디오를 사용하여 직접 만든 프로젝트에서는 대개 app이라고 합니다.
  • Application Variant: 빌드할 Android 변형. 이 값은 MSBuild 구성에 따라 설정해야 합니다. 예를 들어 디버그 빌드의 값은 디버그 변형에 설정된 값이어야 합니다. 프로젝트의 MSBuild 구성 이름이 Gradle 변형 이름과 일치할 경우 $(Configuration)의 기본값을 사용하면 됩니다.
  • APK Name: 개발 컴퓨터에서 디버깅 및 프로파일링에 사용되는 생성된 APK 파일의 이름. 이 이름은 Gradle에 전달되며 Gradle 빌드 스크립트는 이를 준수해야 합니다(다음 섹션에서 MSBUILD_ANDROID_OUTPUT_APK_NAME 속성 참고).

Gradle 빌드 스크립트 수정

빌드 중에 MSBuild가 다음 정보를 Gradle 스크립트에 프로젝트 속성으로 전달합니다. 이러한 속성을 읽어오도록 프로젝트의 기존 빌드 스크립트(일반적으로 build.gradle)를 변경합니다.

  • MSBUILD_MIN_SDK_VERSION: APK 빌드를 위한 최소 SDK 버전. 그림 2에 표시된 프로젝트 속성 페이지의 Minimum Android SDK Version 상자에 이 값을 설정합니다.


    그림 2. Minimum Android SDK Version 속성

    아래와 같이 Gradle 빌드 스크립트에서 minSdkVersion을 이 값으로 설정해야 합니다.

    Groovy

    android {
      // ...
    
      defaultConfig {
          applicationId "com.yourcompany.yourapp"
          minSdkVersion MSBUILD_MIN_SDK_VERSION
          // ...
      }
    
      // ...
    }
    

    Kotlin

    android {
      // ...
    
      defaultConfig {
          applicationId = "com.yourcompany.yourapp"
          minSdkVersion(MSBUILD_MIN_SDK_VERSION)
          // ...
      }
    
      // ...
    }
    
  • MSBUILD_ANDROID_OUTPUT_APK_NAME: Gradle이 빌드하는 APK의 예상 이름. Android 게임 개발 확장 프로그램이 이 이름과 일치하는 APK를 찾아 연결된 기기에 배포합니다(디버깅 및 프로파일링 목적). 그림 3에 표시된 프로젝트 속성 페이지의 APK Name 상자에 이 값을 설정합니다.


    그림 3. APK Name 속성

    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 파일)가 포함된 디렉터리. 아래 표시된 프로젝트 속성 페이지의 Output Directory 상자에 이 값을 설정합니다. 그림 4에 표시된 것처럼 기본적으로 이 값은 Visual Studio 프로젝트의 출력 디렉터리 속성입니다.


    그림 4. Output Directory 속성

    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 Version 상자에 이 값을 설정합니다.


    그림 5. Android NDK Version 속성

    Gradle 빌드 스크립트는 다음과 같이 ndkVersion을 이 값으로 설정해야 합니다.

    Groovy

    android {
      // ...
    
      ndkVersion MSBUILD_NDK_VERSION
    
      // ...
    }
    

    Kotlin

    android {
      // ...
    
      ndkVersion = MSBUILD_NDK_VERSION
    
      // ...
    }
    

    자세한 내용은 Android 스튜디오 주제 NDK 및 CMake 설치 및 구성을 참고하세요.