Unreal 5.4 안드로이드 aab 파일 생성 시 결제 라이브러리 제거

개요

Unreal 5.4 로 게임 개발을 마치고 Android aab 파일 생성 후 업로드 하면 결제 라이브러리 관련한 오류가 발생했습니다. 게임 내에 결제 요소가 없는데 기본적으로 결제 라이브러리가 사용되도록 되어 있어 발생한 것 같았습니다. 이 문제를 해결하는 방법을 알아보도록 하겠습니다.

오류 메시지

앱을 업로드 하면 다음과 같은 오류 메시지가 나타납니다.

앱에서 현재 Play 결제 라이브러리 AIDL 버전을 사용 중입니다. Google Play의 최신 수익 창출 기능을 사용하려면 5.2.1 버전 이상으로 업데이트해야 합니다.

실제 결제 기능이 있다면 버전을 업데이트 하는 작업을 진행해야 합니다. 필자가 제작한 게임에는 결제 기능이 없어서 처음에는 이상하다고 생각했습니다.

문제 파악

이리 저리 알아보니 인앱결제 사용 여부를 지정하도록 되어 있는 것 같았습니다. 그 값이 기본으로 사용하도록 되어 있는 것 같았습니다. 설정을 모두 찾아보았으나 인앱결제를 사용하는 여부를 선택하는 항목은 없었습니다.

C:\YourInstallPath\UE_5.4\Engine\Plugins\Online\Android\OnlineSubsystemGooglePlay\Source\OnlineSubsystemGooglePlay_UPL.xml 파일을 살펴보면 다음과 같은 내용이 있습니다.

<if condition="bSupportsInAppPurchasing">
...
</if>

이런 부분이 여러 곳에 있는데 조건에 따라 결제에 필요한 사항을 추가하는 것으로 생각되었습니다. bSupportsInAppPurchasing 이 항목의 값을 False 로 변경하면 문제가 해결될 것 같았습니다.

해결방법

YourProject\Config\Android\AndroidEngine.ini 파일을 수정합니다. 필자의 경우 없어서 생성했습니다. 파일의 내용을 다음과 같이 입력합니다.

[OnlineSubsystem]
DefaultPlatformService=GooglePlay

[OnlineSubsystemGooglePlay.Store]
bSupportsInAppPurchasing=False

bSupportsInAppPurchasing 항목을 False 로 지정하면 됩니다. 결제 기능을 사용한다면 True 로 설정해야 합니다. OnlineSubsystemGooglePlay_UPL.xml 파일 내의 bSupportsInAppPurchasing 항목과 일치하는 것을 알 수 있습니다.

다시 aab파일을 다시 업로드하면 오류가 사라집니다.

Unreal 5.4 AdMob 연동 시 빌드 되지 않는 문제 해결

개요

Unreal 5.4 버전이 공개되고 해당 엔진으로 개발을 진행하고 있었습니다. 어느 정도 개발이 진행되고 광고를 포함하려고 AdMob 을 연동했습니다. 그러나 빌드를 하면 오류가 발생하면서 파일이 생성되지 않는 문제가 있었습니다.

오류

오류의 내용은 다음과 같습니다.

로그의 일부

UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:699: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:724: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:790: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:811: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:831: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper
UATHelper: Packaging (Android (ASTC)): Z:\app\src\main\java\com\epicgames\unreal\GameActivity.java:873: error: cannot find symbol
UATHelper: Packaging (Android (ASTC)): activityContext.runOnUiThread(new Runnable()
UATHelper: Packaging (Android (ASTC)): ^
UATHelper: Packaging (Android (ASTC)): symbol: method runOnUiThread()
UATHelper: Packaging (Android (ASTC)): location: variable activityContext of type ContextWrapper

YourProject.Target.cs 파일에 ExtraModuleNames.Add(“AndroidAdvertising”); 가 활성화 되어 있는 것이 원인이었습니다. 5.3 버전에서는 문제 없이 빌드 되고 광고가 나타났는데 5.4 버전에서는 그렇지 않았습니다.

오류 해결 시도

문제를 없애고자 다음과 같이 조치해 보았는데 해결되지 않았습니다.

  1. Android Target 변경 latest 에서 android-33 으로 변경해도 동일(원래 34)
  2. 프로젝트의 버전을 5.3 으로 변경해서 빌드하려고 했으나 소스코드내의 버전 번호가 일치하지 않고 Map(Level) 파일의 버전이 맞지 않는다는 메시지가 나타남. Map(Level) 파일이 나타나지 않음.

해결방법(아마도 임시)

근본적인 해결책인지 확신 할 수 없지만 필자가 개발 중인 프로젝트에서는 배너 광고가 제대로 나타나고 게임도 제대로 동작했습니다. 엔진 버전은 5.4.1 입니다.

  1. Android Studio 로 YourProject\Intermediate\Android\arm64\gradle\ 프로젝트를 엽니다. 경로는 개발 환경에 따라 다를 수 있습니다.
  2. YourProject\Intermediate\Android\arm64\gradle\app\src\main\java\com\epicgames\unreal\GameActivity.java 파일을 엽니다.
  3. 오류가 발생하는 activityContext.runOnUiThread 이 부분을 this.runOnUiThread 로 변경해서 Android Studio에서 빌드합니다.

이렇게 하면 광고가 정상적으로 나타나는 것을 확인할 수 있습니다. 같은 문제를 겪고 계신분들께 도움이 되었으면 합니다.

근본적인 해결책이 무엇인지는 알 수 없으나 엔진이 빨리 패치 되어 문제가 해결되었으면 좋겠습니다.

근본적인 해결책

빌드 할 때 마다 GameActivity.java 파일을 수정하는 것이 너무 불편해서 조금 더 파악해 보았습니다. 그 결과 위 오류 로그에 나타나는 내용이 포함되어 있는 파일을 찾아냈습니다.

C:\YourPath\Epic Games\UE_5.4\Engine\Source\Runtime\Advertising\Android\AndroidAdvertising\AndroidAdvertising_APL.xml 파일을 열어보면 오류가 발생한 내용과 같은 행이 있는 것을 알 수 있습니다.

Unreal 을 종료한 후 작업합니다. AndroidAdvertising_APL.xml 파일을 백업 하신 후 내용 중activityContext.runOnUiThread(new Runnable() 를 this.runOnUiThread(new Runnable() 로 변경하고 다시 시작한 후 Unreal에서 Package Project 를 수행하면 오류 없이 apk 파일이 생성됩니다.