| 현상

 

Android AAR 플러그인을 유니티 프로젝트에 추가, 유니티 빌드 시 아래와 같은 에러를 마주하는 경우가 있다.

Failed to install the following Android SDK packages as some licences have not been accepted.

위 에러는 SDK에 라이센스가 없어서 발생하는 문제인데, 해당 이슈의 전체 에러 콘솔로그이다.

 

 

| 해결

 

안드로이드 스튜디오를 통해 SDK가 설치된 경로를 확인하면 아래와 같다.

C:\Users\${User}\AppData\Local\Android\Sdk

위 경로에 licenses 디렉토리를 유니티의 SDK가 설치된 경로에 복사해준다.

C:\Program Files\Unity\Hub\Editor\${Unity}\Editor\Data\PlaybackEngines\AndroidPlayer\SDK

복사 후 재빌드 시 해당 문제는 해결된 것을 확인할 수 있다.

반응형

| 현상

 

FAILURE: Build failed with an exception.

* Where:
Build file '/Users/<user>/.jenkins/workspace/<job>/GradleProject/unityLibrary/build.gradle' line: 176

* What went wrong:
Execution failed for task ':unityLibrary:BuildIl2CppTask'.
> NDK is not installed

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings

Gradle 빌드 중 설치된 NDK를 인식하지 못하는 현상

UnityHub가 도입되고 고도화되면서 Unity 설치 시에 각 플랫폼 별 빌드 지원하는 툴들을 설치하게 되었다.

그 후로는 유사한 이슈가 발생하지 않았는데 2021.3.22f1버전에서 2022.3.6f1버전으로 업그레이드 하면서 발생했다.

 

 

| 해결

 

using System.IO;
using UnityEditor.Android;

namespace Tools
{
#if UNITY_2022_3_OR_NEWER
    public class AndroidPostBuildProcessor : IPostGenerateGradleAndroidProject
    {
        public int callbackOrder => 1;

        public void OnPostGenerateGradleAndroidProject(string path)
        {
            Debug.Log("OnPostGenerateGradleAndroidProject: " + path);

            var di = new DirectoryInfo(path);
            var localPropertiesFile = Path.Combine(di.Parent.FullName, "local.properties");
            if (File.Exists(localPropertiesFile))
            {
                var hasNdkProp = HasNdkProp(localPropertiesFile);
                if (false == hasNdkProp)
                {
                    var ndkDir = $"{System.Environment.NewLine}ndk.dir={AndroidExternalToolsSettings.ndkRootPath}";
                    File.AppendAllText(localPropertiesFile, ndkDir);
                }
            }
        }

        private bool HasNdkProp(string path)
        {
            using (var streamReader = new StreamReader(path, System.Text.Encoding.UTF8))
            {
                string line = string.Empty;
                while ((line = streamReader.ReadLine()) != null)
                {
                    if (line.StartsWith("ndk.dir="))
                        return true;                    
                }
            }
            return false;
        }
    }
#endif
}

근본적인 해결책은 아니지만 
Android Project를 생성할 때, local.properties 파일에 NDK 정보를 입력하는 식으로 해결하였다.

| 참고

 

 

빌드 구성  |  Android 개발자  |  Android Developers

Android 빌드 시스템은 앱 리소스 및 소스 코드를 컴파일하고 개발자가 테스트, 구축, 서명 및 배포할 수 있는 APK로 패키징합니다.

developer.android.com

 

Unity - Scripting API: LocalPropertiesFile

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

※ 2023.1버전대부터 Ndk, LocalPropertiesFile 등 Gradle 관련 세팅을 제어하는 클래스들이 Unity.Android.Gradle 네임스페이스에 추가된다.

 

 

Unity - Scripting API: AndroidExternalToolsSettings

Success! Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable. Close

docs.unity3d.com

※ Preferences > External Toos > Android에서 설정한 값들을 위 클래스를 통해 제어할 수 있다.

반응형

| 현상

 

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':unityLibrary:parseReleaseLocalResources'.
> Could not resolve all dependencies for configuration ':unityLibrary:androidApis'.
   > Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository 'maven4(http://maven.singular.net)' to redirect to a secure protocol (like HTTPS) or allow insecure protocols. See https://docs.gradle.org/7.2/dsl/org.gradle.api.artifacts.repositories.UrlArtifactRepository.html#org.gradle.api.artifacts.repositories.UrlArtifactRepository:allowInsecureProtocol for more details. 

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0.

You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins.

See https://docs.gradle.org/7.2/userguide/command_line_interface.html#sec:command_line_warnings

Unity3d를 2021.3.22f1버전에서 2022.3.6f1버전으로 업그레이드 하면서 
그래들 버전이 달라져서 그런지 http 리포지터리를 허용하지 않았다.

 

 

| 해결

 

1. 사용하고 있는 Plugin을 최신화

Plugin이 업데이트 되면서 repository가 변경되었을 수 있기 때문

 

2. Plugin내부 Dependencies.xml 파일 수정

<dependencies>
  <androidPackages>
    <repositories>
      <repository>https://repo.maven.apache.org/maven2</repository>
... 중략...
    </repositories>
  </androidPackages>
</dependencies>

임시방편으로 해당 repository를 secure protocol로 변경한다.

 

3. allowInsecureProtocol 설정

repositories {
    maven {
        url "http://..."
        allowInsecureProtocol true
    }
    mavenCentral()
}

 

 

| 참고

 

 

MavenArtifactRepository - Gradle DSL Version 8.3

An artifact repository which uses a Maven format to store artifacts and meta-data. Repositories of this type are created by the RepositoryHandler.maven(org.gradle.api.Action) group of methods. PropertyDescriptionallowInsecureProtocolSpecifies whether it is

docs.gradle.org

 

반응형

| 현상

 

FAILURE: Build failed with an exception.

* What went wrong:
Could not determine the dependencies of task ':unityLibrary:hive.androidlib:compileReleaseAidl'.
> Failed to install the following Android SDK packages as some licences have not been accepted.
     build-tools;30.0.3 Android SDK Build-Tools 30.0.3
  To build this project, accept the SDK license agreements and install the missing components using the Android Studio SDK Manager.
  Alternatively, to transfer the license agreements from one workstation to another, see http://d.android.com/r/studio-ui/export-licenses.html
  
  Using Android SDK: /Applications/Unity/Hub/Editor/2021.3.22f1/PlaybackEngines/AndroidPlayer/SDK

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 7.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/6.1.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 24s

 

| 해결방법

 

  • Android Studio > Tools > SDK Manager

  • Android SDK > SDK Tools > Goolgle Play Licensing Library > Apply

반응형

Addressables 빌드 프로세스 중 빌드 퍼포먼스를 확인할 수 있도록 json파일을 생성하고 있어, 각 프로세스 별 소요 시간이나 내용을 확인할 수 있다.

| 방법

1) 크롬을 열고 chrome://tracing 입력

2) 좌상단의 Load 버튼을 클릭하고, 유니티 프로젝트 하위의 Library/com.unity.addressables/AddressablesBuildTEP.json 파일 선택

 

| 참고

 
 

Build Profiling | Addressables | 1.19.19

Build Profiling The Addressables build process always creates a .json log file that contains build performance information. You can find the log file in your project folder at Library/com.unity.addressables/AddressablesBuildTEP.json. View the log file with

docs.unity3d.com

 

Unity Scriptable Build Pipeline | Scriptable Build Pipeline | 1.21.3

Unity Scriptable Build Pipeline The Scriptable Build Pipeline (SBP) package allows you to control how Unity builds content. The package moves the previously C++-only build pipeline code to a public C# package with a pre-defined build flow for building Asse

docs.unity3d.com

 

반응형

 

| Default Profile

 

구분
경로
비고
BuildTarget
[UnityEditor.EditorUserBuildSettings.activeBuildTarget]
e.g. Android, Windows
LocalBuildPath
UnityEngine.AddressableAssets.Addressables.BuildPath/{BuildTarget}

LocalLoadPath
UnityEngine.AddressableAssets.Addressables.RuntimePath/{BuildTarget}

RemoteBuildPath
ServerData/{BuildTarget}

RemoteLoadPath
http://loaclhost/{BuildTarget}

 

 

| 주요 경로 변수

 
 
변수명
경로
UnityEngine.AddressableAssets.Addressables.BuildPath
Library/com.unity.addressables/aa/Android
UnityEngine.AddressableAssets.Addressables.RuntimePath
Library/com.unity.addressables/aa/Android
UnityEngine.AddressableAssets.Addressables.PlayerBuildDataPath
../Assets/StreamingAssets/aa
UnityEngine.AddressableAssets.Addressables.LibraryPath
Library/com.unity.addressables/
반응형

| 개요

 

기존 AssetBundle 시스템에서는 각 번들별로 지정된 Label을 기준으로 번들파일이 생성되었다.

[Addressable][BundleMode] 설정을 통해 3가지 형태의 패킹 옵션을 제공한다.

(BundleMode를 어떻게 설정 하느냐에 따라 번들의 네이밍에도 영향을 준다.)

 

번들의 네이밍에 관한 옵션은 [Bundle Naming Mode]로 설정이 가능하다.

 

| 설정

에디터 상단 메뉴 > Windows > Asset Management > Addressables > Groups

Addressables Groups 윈도우에서 그룹 선택 > Inspector 윈도우

 

혹은

 

AddressableAssetsData/AssetGroups/{어셋그룹명}.asset 파일선택 > IInspector 윈도우

 

 

| Pack Together

 

그룹 전체가 하나의 번들로 패킹되는 방식

어셋그룹명_assets_all_해쉬값.bundle와 같은 형식으로 네이밍 된다.

예)

Addressable Asset Group: dungeon

Bundle Mode: Pack Together

Bundle Naming Mode: Append Hash to Filename

 

> dungeon_assets_all_5cc5b95cb94769ba209aa37dbb298c73.bundle

 

| Pack Seperately

 

그룹 내부의 어셋마다 개별 번들이 패킹되는 방식

개별 번들이 만들어지지만, 어셋 그룹의 설정은 공유한다.

어셋그룹명_assets_assets/어셋어드레스_해쉬값.bundle와 같은 형식으로 네이밍 된다.

 

예)

Addressable Asset Group: Scenes-DungeonBG

Bundle Mode: Pack Seperately

Bundle Naming Mode: Append Hash to Filename

 

> scenes-dungeonbg_scenes_scenes/dungeonbg/폴더/어셋어드레스_해쉬값.bundle

 

| Pack Together By Label

 

라벨 기준으로 패킹되는 방식 (기존 AssetBundle의 그것과 유사)

Pack Seperatley와 마찬가지로, 번들은 분리되어 패킹되지만 어셋 그룹의 설정은 공유한다.

어셋그룹명_assets_라벨명_해쉬값.bundle와 같은 형식으로 네이밍 된다.

 

예)

Addressable Asset Group: dungeon

Bundle Mode: Pack Together By Label

Bundle Naming Mode: Append Hash to Filename

Label: label1

 

> dungeon_assets_label1_해쉬값.bundle

 

예2) 라벨을 여러개 지정한 경우

> dungeon_assets_label1label2_해쉬값.buddle

 

| 마치며

 

BundleMode옵션을 활용하여, 용도와 상황에 맞게 번들을 분리 / 통합하여 패킹할 수 있는 방법을 알아보았다.

활용방법이나 케이스들을 가정해보았다.

 

Case 1) 사이즈가 큰 씬이 포함된 어셋그룹은 Pack Seperately로 지정해서 분리 패킹, 번들의 파일 사이즈를 줄인다.

Case 2) 업데이트되는 신규 컨텐츠 A 그룹은 Pack Together By Label로 지정해서 신규 컨텐츠 진입점에서 번들을 다운로드

 

신규 컨텐츠 A 어셋 그룹

ㄴSeason 1 > Label: 신규 컨텐츠 A, 시즌 1

ㄴSeason 2 > Label: 신규 컨텐츠 A, 시즌 2

반응형

| 개요

Addressable 시스템에서 추가된 핵심 시스템 중 AnalyzeRule 시스템이 있다.

  • 에디터 상단 메뉴 > Window > Asset Management > Addressables > Analzye

AssetBundle과 관련된 다양한 규칙들을 설정하고, 해당 규칙에 대한 검증 및 문제 해결까지 가능한 시스템이다.

기본적으로 아래와 같은 규칙이 제공된다.

 

  • 중복 번들 종속성
  • 빌트인 리소스와 어드레서블 어셋간 종속성
  • 씬과 어드레서블간 종속성
  • 번들 레이아웃 프리뷰 기능 (명시적, 암묵적으로 포함되는 어셋목록 리스트업)
패키지에 포함되어 있는 Analyze Rule

기존에도 어셋의 종속성이나 Duplicated 이슈를 검증할 수 있는 AssetBundle Rrowser라는 툴을 제공되었으나,

기능을 확장하거나, 번들마다 설정을 달리하는 등의 작업이 용이하진 않았다.

Analyze System은 종전의 문제점들에서 착안 다양한 옵션을 제공하고 있다.

| Custom Analyze Rule 추가방법

using UnityEditor;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;

public class CustomRule : AnalyzeRule
{
        public override string ruleName
        {
            get { return "룰 이름"; }
        }

        // 문제 해결이 가능한지 여부
        public override bool CanFix
        {
            get { return false; }
            set { }
        }

        public override void FixIssues(AddressableAssetSettings settings)
        {
            base.FixIssues(settings);
            // ...
            // 문제 해결 로직
            // ...
        }

        public override List<AnalyzeResult> RefreshAnalysis(AddressableAssetSettings settings)
        {
            var results = new List<AnalyzeResult>();
            // ...
            // 분석 로직
            // ...
            results.Add(new AnalyzeResult()
            {
                    resultName = "Result Message",
                    severity = UnityEditor.MessageType.Info | Warning | Error
            });
            return results;
        }
}

[InitializeOnLoad]
class RegisterCustomRule
{
    static RegisterCustomRule()
    {
        // Analyze System에 등록을 해야만 Analzye 윈도우에서 노출됨      
        AnalyzeSystem.RegisterNewRule<CustomRule>();
    }
}
 

AnalyzeRule 클래스를 상속하고 AnalyzeSystem에 등록만 해주면 간단하게 커스텀 Analyze Rule을 추가할 수 있다.

 

| GroupSchema로 AnalyzeSystem 100% 활용하기

어셋 그룹을 추가하게되면 아래 스키마들이 기본적으로 추가되어 있다.

(Assets/AddressableAssetsData/AssetGroupTemplates/Packed Assets 파일 참조)

 

  • BundledAssetGroupScehema: 번들 빌드 및 로드 경로 / 압축 포맷 / 빌드 포함 여부 등 어셋번들에 관련된 다양한 옵션을 설정할 수 있는 스키마
  • ContentUpdateGroupSchema: 해당 컨텐츠가 업데이트 가능한지 여부를 설정
 

패키지에서 제공하는 스키마외에도 커스텀 스키마를 정의, 추가가 가능하다.

 

using UnityEditor;
using UnityEditor.AddressableAssets.Build.AnalyzeRules;
using UnityEditor.AddressableAssets.Settings;

public class CustomSchema : AddressableAssetGroupSchema
{
    [SerializeField] public string Foo;
}

public class CustomRule : AnalyzeRule
{
            // ...

        public override List<AnalyzeResult> RefreshAnalysis(AddressableAssetSettings settings)
        {
            ClearAnalysis();

            var results = new List<AnalyzeResult>();
            foreach (var group in settings.groups)
            {
                if (group.HasSchema<CustomSchema>())
                {
                    var schema = group.GetSchema<CustomSchema>();
                    // ...
                    // 분석 로직
                    // ...
                }
            }

            results.Add(new AnalyzeResult()
            {
                    resultName = "Result Message",
                    severity = UnityEditor.MessageType.Info | Warning | Error
            });
            return results;
        }
}
 

CustomSchema를 추가한 그룹에 대한 별도 처리가 가능하다.

 

이제부터 AnalyzeSystem 활용에 대한 다양한 활용방법이 떠오르는데, 이를테면 이런 것들이다.

 

  • [어셋그룹]내의 텍스쳐 어셋의 포맷 혹은 압축 및 POT 여부를 설정하는 스키마를 추가 > 해당 그룹내의 텍스쳐를 분석 후 지정된 포맷으로 변환
  • [어셋그룹]내의 저해상도 및 저성능 관련 내용을 설정하는 스키마 추가 > 해당 그룹내 저해상도 어셋을 자동생성
  • [어셋그룹]내 시즌 상품에 관련된 모든 어셋을 지정하는 스키마를 추가, 미노출되어야하는 어세에 대한 처리

 

Bundle Mode 중 Pack Together By Label이란 옵션이 있는데, 

(동일한 그룹내에서도 라벨 기준으로 번들 파일을 분리하여서 패키징할 수 있는 옵션)

패킹 레벨에서의 그룹과 Label의 용도의 차이점이 무엇인지 이해하기 어려웠다.

 

하지만 어셋 그룹 스키마와 Custom Analyze Rule에 관련된 예제를 보고는 확실히 개념이 정리가 되었다.

 

  • 라벨링이 필요없는 경우 > Pack Together
  • 번들 자체는 분리되어야 하지만, 어셋 그룹에 대한 설정은 공유하는 경우 > Pack Togher by Label

 

| 마치며

AnalzyeSystem의 사용법커스텀 룰을 추가하는 방법어셋 그룹 스키마와 활용하는 방법까지 알아보았다.

 

테스트나 번들 별 옵션 지정 등 다양한 기능을 제공하면서도 잘 정리된 느낌이 들었다.

종전의 시스템으론 커버하기 힘든 요구사항까지 다 핸들링 가능한 시스템으로 적극적으로 사용한다면 다양한 용도로 사용할 수 있을 것으로 기대된다.

 

 

| 참고

 

반응형

+ Recent posts