반응형
유니티프로젝트 를 터미널 환경에서 빌드를 해야할 상황이 있었다. 젠킨스를 사용하여 유니티 프로젝트를 안드로이드 타겟으로 빌드를 해야하는 요구사항이 있었고, 해당 사항을 충족시키기 위한 상황이 있었다.
Unity 프로젝트에 스크립트 작성하기
유니티 프로젝트 하위에 Assets/Editor/ 하위에 빌드를 위한 스크립트를 하나 생성한다. 아래 예시는 유니티에서 제공하는 스크립트를 조금 변경하였다. (https://docs.unity3d.com/ScriptReference/BuildPipeline.BuildPlayer.html)
아래 코드는 안드로이드 빌드에 대한 내용이다.
using UnityEditor;
using UnityEngine;
using UnityEditor.Build.Reporting;
public class BuildPlayere : MonoBehaviour
{
[MenuItem("Build/Build AOS")]
public static void BuildAndroid()
{
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = new[] { "Assets/FirstScene.unity", "Assets/SecondScene.unity" };
buildPlayerOptions.locationPathName = "Builds/test.apk";
buildPlayerOptions.target = BuildTarget.Android;
buildPlayerOptions.options = BuildOptions.None;
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
{
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
}
if (summary.result == BuildResult.Failed)
{
Debug.Log("Build failed");
}
}
}
터미널에서 빌드해보기
${UnityPath}/Unity -batchmode -quit -logFile "${PWD}/BuildAndroid.log" -buildTarget Android -projectPath {Your_Project_Path} -executeMethod BuildPlayer.BuildAndroid
Unity를 batchmode로 실행하여 빌드하는 스크립트이다. Unity가 별도로 실행중이라면 batchmode 실행이 불가능하다. 하나의 Unity instance만 허락한다. 각 옵션에 대해 정리를 해보자.
- batchmode : Unity를 batch 모드로 실행
- quit : 커맨드 실행을 마친 후 Unity 에디터를 종료합니다.
- logFile : 로그 파일을 생성할 위치
- buildTarget : 프로젝트 로딩 전에 빌드할 타겟을 설정한다. 여기서는 Android를 사용하지만 다양한 타겟을 설정할 수 있다.
- projectPath : 빌드할 프로젝트의 경로를 설정한다.
- executeMethod : 실행할 메소드 정보이다. 위에서 BuildPlayer라는 클래스 내부에 BuildAndroid란 메소드를 생성하였다.
keystore를 사용하는 경우 문제
keystore를 사용시 빌드하게 되면, password 정보가 없기에 빌드가 실패한다. 해당 password 정보를 아래와 같이 전달한다.
using UnityEditor;
using UnityEngine;
using UnityEditor.Build.Reporting;
public class BuildPlayere : MonoBehaviour
{
[MenuItem("Build/Build AOS")]
public static void BuildAndroid()
{
PlayerSettings.keyaliasPass = "your_password";
PlayerSettings.keystorePass = "your_password";
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = new[] { "Assets/FirstScene.unity", "Assets/SecondScene.unity" };
buildPlayerOptions.locationPathName = "Builds/test.apk";
buildPlayerOptions.target = BuildTarget.Android;
buildPlayerOptions.options = BuildOptions.None;
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
{
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
}
if (summary.result == BuildResult.Failed)
{
Debug.Log("Build failed");
}
}
}
위 스크립트에서 처럼 PlayerSettings의 비밀번호를 세팅해 준다. 하지만 위의 내용은 비밀번호가 노출되는 문제가 있다. 여러 방법이 있겠지만 간단하게 커맨드라인에서 인수로 전달받아 설정해보자.
using UnityEditor;
using UnityEngine;
using UnityEditor.Build.Reporting;
public class BuildPlayere : MonoBehaviour
{
[MenuItem("Build/Build AOS")]
public static void BuildAndroid()
{
PlayerSettings.keyaliasPass = GetCommandArg("-keyaliasPass");
PlayerSettings.keystorePass = GetCommandArg("-keystorePass");
BuildPlayerOptions buildPlayerOptions = new BuildPlayerOptions();
buildPlayerOptions.scenes = new[] { "Assets/FirstScene.unity", "Assets/SecondScene.unity" };
buildPlayerOptions.locationPathName = "Builds/test.apk";
buildPlayerOptions.target = BuildTarget.Android;
buildPlayerOptions.options = BuildOptions.None;
BuildReport report = BuildPipeline.BuildPlayer(buildPlayerOptions);
BuildSummary summary = report.summary;
if (summary.result == BuildResult.Succeeded)
{
Debug.Log("Build succeeded: " + summary.totalSize + " bytes");
}
if (summary.result == BuildResult.Failed)
{
Debug.Log("Build failed");
}
}
private static string GetCommandArg(string name) {
var args = System.Environment.GetCommandLineArgs();
for (int i = 0; i < args.Length; i++)
if (args[i] == name && args.Length > i + 1)
return args[i];
return null;
}
}
위와 같이 스크립트를 작성하였다면, 빌드 시 keystore 인수를 추가하여 빌드해주자.
${UnityPath}/Unity -batchmode -quit -logFile "${PWD}/BuildAndroid.log" -buildTarget Android -projectPath {Your_Project_Path} -executeMethod BuildPlayer.BuildAndroid -keyaliasPass yout_aliaspass -keystorePass your_storepass
빌드가 되는 것을 확인할 수 있다.
반응형
'Android > Component' 카테고리의 다른 글
Application Foreground/Backgroud 상태 확인하기 (0) | 2022.06.13 |
---|---|
[Android/Unity] Failed to install the following Android SDK packages as some licences have not been accepted. (0) | 2022.05.07 |
[Android/Unity] TargetSDK version 31 이상에서 Manifest merger failed 문제 (0) | 2022.05.04 |
[Android] Service #1 - 개요 (0) | 2022.04.21 |
[Android] DI, 그리고 Hilt (작성중) (0) | 2022.04.14 |