Version: 2017.3
IL2CPP 빌드 시간 최적화
이벤트 시스템

IL2CPP로 관리 바이트코드 스트리핑

관리되는 바이트코드 스트리핑을 수행하면 사용되지 않는 코드가 관리되는 어셈블리(DLL)에서 제거됩니다. 이 과정은 루트 어셈블리를 정의한 다음 정적 코드 분석을 사용하여 해당 루트 어셈블리에서 사용하는 다른 관리되는 코드를 확인하는 순서로 진행됩니다. 바이트코드 스트리핑은 코드를 난독화하지 않고 사용되는 코드를 어떤 식으로든 변경하지 않습니다.

특정 Unity 플레이어 빌드에서, 루트 어셈블리는 Unity 에디터가 스크립트 코드로부터 컴파일하는 어셈블리입니다(예: Assembly-CSharp.dll). 스크립트 코드로부터 컴파일된 어셈블리는 스트립되지 않지만, 그 외에 다음과 같은 어셈블리는 스트립됩니다.

  • 프로젝트에 추가하는 어셈블리
  • Unity 엔진 어셈블리
  • .NET 클래스 라이브러리 어셈블리(예: mscorlib.dll, System.dll)

IL2CPP 스트리핑 백엔드를 사용하면 관리 바이트코드 스트리핑이 항상 활성화됩니다. 이 경우 스트리핑 레벨 옵션이 Strip Engine Code라는 부울 옵션으로 대체됩니다. 이 옵션을 활성화하면 native Unity 엔진 코드에서 사용되지 않는 모듈과 클래스가 제거됩니다. 비활성화하면 native Unity 엔진 코드의 모듈과 클래스가 모두 보존됩니다

link.xml 파일(아래 설명 참조)을 사용하여 타입과 전체 어셈블리를 모두 보존하여 바이트코드 스트리핑을 효과적으로 비활성화할 수 있습니다. 예를 들어 다음 link.xml 파일을 사용하여 시스템 어셈블리가 스트립되지 않게 할 수 있습니다.

<linker>
       <assembly fullname="System" preserve="all"/>
</linker>

반사를 사용하면서 스트리핑하는 방법

스트리핑은 정적 코드 분석에 크게 좌우되고, 반사와 같은 동적 기능이 사용될 때에는 때때로 스트리핑을 효과적으로 수행할 수 없습니다. 이러한 경우에는 어떤 클래스를 스트립하면 안 되는지에 대한 힌트를 제공할 필요가 있습니다. Unity 에디터는 프로젝트별 커스텀 스트리핑 블랙리스트를 지원합니다. 블랙리스트를 사용하려면 link.xml 파일을 생성하고 이 파일을 Assets 폴더(또는 Assets의 하위 디렉토리)에 넣어두면 됩니다. link.xml 파일의 내용을 보여주는 예제는 다음과 같습니다. 보존하도록 표시된 클래스는 스트리핑의 영향을 받지 않습니다.

<linker>
       <assembly fullname="System.Web.Services">
               <type fullname="System.Web.Services.Protocols.SoapTypeStubInfo" preserve="all"/>
       </assembly>

       <assembly fullname="System">
               <type fullname="System.Net.Configuration.WebRequestModuleHandler" preserve="all"/>
               <type fullname="System.Net.HttpRequestCreator" preserve="all"/>
               <type fullname="System.Net.FileWebRequestCreator" preserve="all"/>
       </assembly>

       <assembly fullname="mscorlib">
               <type fullname="System.AppDomain" preserve="fields"/>
               <type fullname="System.InvalidOperationException" preserve="fields">
                       <method signature="System.Void .ctor()"/>
               </type>
               <type fullname="System.Object" preserve="nothing">
                      <method name="Finalize"/>
               </type>
       </assembly>
</linker>

프로젝트에 여러 link.xml 파일을 포함할 수 있습니다. 각 link.xml 파일마다 여러 다른 옵션을 지정할 수 있습니다. 어셈블리 요소는 중첩된 명령이 적용될 관리 어셈블리를 나타냅니다.

타입 요소는 특정 타입이 어떻게 처리되어야 하는지 나타내는 데 사용합니다. 전체 이름 속성에 하나 이상의 문자와 일치하는 ‘*’ 와일드카드를 사용할 수 있습니다.

보존 속성은 다음 세 값 중 하나로 지정할 수 있습니다.

  • all: 특정 타입(또는 어셈블리, IL2CPP에만 해당)의 모든 것을 유지합니다.
  • fields: 특정 타입의 필드만 유지합니다.
  • nothing: 특정 타입만 유지하고 해당 콘텐츠는 유지하지 않습니다.

메서드 요소는 특정 메서드를 보존해야 함을 나타내는 데 사용합니다. 타입 요소의 자식이어야 합니다. 이름 또는 서명별로 메서드를 지정할 수 있습니다.

link.xml 파일과 함께 C# [Preserve] 속성을 소스 코드에 사용하여 링커가 해당 코드를 스트립하는 것을 방지할 수 있습니다. 이 속성은 link.xml 파일에 포함된 해당 항목과 약간 다르게 작동합니다.

  • Assembly: ([Preserve] 속성이 각 타입에 있는 것처럼) 어셈블리의 모든 타입을 보존합니다.
  • Type: 타입과 해당 기본 생성자를 보존합니다.
  • Method: 메서드의 선언 타입, 반환 타입, 메서드의 모든 인수 타입을 보존합니다.
  • Property, Field, Event: 프로퍼티, 필드, 이벤트의 선언 타입과 반환 타입을 보존합니다.

스트립된 어셈블리는 프로젝트의 Temp 디렉토리 아래에 있는 디렉토리에 출력됩니다. 정확한 위치는 타겟 플랫폼에 따라 다릅니다. 스트립되지 않은 오리지널 어셈블리는 스트립된 어셈블리와 동일한 위치에 있는 스트립되지 않은 디렉토리에서 사용할 수 있습니다. 스트립되고 스트립되지 않은 어셈블리를 ILSpy 같은 도구로 검사하여 제거된 코드 부분을 확인할 수 있습니다.


  • 2017–09–01 일부 편집 리뷰를 거쳐 페이지 수정됨

  • 2017–05–26 - Unity 5.6 Unity 사용자 매뉴얼의 문서만 업데이트

  • 2017–09–01 - Unity 2017.1에서 C# [Preserve] 속성 사용에 관한 팁 추가됨

IL2CPP 빌드 시간 최적화
이벤트 시스템