Unity3D IL2CPP 컴 파일 실행 가능 한 파일 크기 낮 추기

프로젝트 가 IL2CPP 컴 파일 을 사용 하기 시 작 했 는데 그 결 과 는 실행 가능 한 파일 이 급 격 히 증가 한 것 이다.
구 글 후 외국 의 한 신 이 쓴 방법 을 발 견 했 습 니 다.http://forum.unity3d.com/threads/suggestion-for-reducing-the-size-of-il2cpp-generated-executable.338986/
원래 댓 글 보 는 게 귀 찮 으 니까 그냥 보 는 방법.
 
1. 새로운 모 노 프로젝트 를 만 들 고 Unused Byte CodeStripper 2 라 고 명명 하 며 아래 코드 와 같이 컴 파일 합 니 다. UnusedByteCodeStripper2.exe
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
using Mono.Cecil;
using Mono.Collections.Generic;
 
namespace RemoveAttributesTool
{
    internal class Program
    {
        private static readonly string[] RemoveAttributesNames =
        {
            // Just information
            "System.Runtime.CompilerServices.CompilerGeneratedAttribute",
            "System.Runtime.CompilerServices.ExtensionAttribute",
            "System.ParamArrayAttribute",
            "System.Reflection.DefaultMemberAttribute",
            "System.Diagnostics.DebuggerStepThroughAttribute",
            "System.Diagnostics.DebuggerHiddenAttribute",
            "System.Diagnostics.DebuggerDisplayAttribute",
            "System.Diagnostics.CodeAnalysis.SuppressMessageAttribute",
            "System.ObsoleteAttribute",
            "System.AttributeUsageAttribute",
            "System.MonoTODOAttribute",
            // Not relative
            "System.CLSCompliantAttribute",
            "System.Runtime.InteropServices.ComVisibleAttribute",
            "System.Runtime.ConstrainedExecution.ReliabilityContractAttribute",
            // Editor only
            "UnityEngine.AddComponentMenu",
            "UnityEditor.MenuItem",
            "UnityEngine.ContextMenu",
            "UnityEngine.ExecuteInEditMode",
            "UnityEngine.HideInInspector",
            "UnityEngine.TooltipAttribute",
            "UnityEngine.DisallowMultipleComponent",
            "UnityEngine.Internal.ExcludeFromDocsAttribute",
        };
 
        private static readonly string[] AdditionalDllFileNames =
        {
            "UnityEngine.dll",
            "mscorlib.dll",
            "System.dll",
            "System.Core.dll",
            "System.Xml.dll",
            "Mono.Security.dll",
        };
 
        private static void Main(string[] args)
        {
            // Process
 
            for (var i = 0; i < args.Length; i++)
            {
                switch (args[i])
                {
                    case "-a":
                        ProcessDll(args[i + 1]);
                        break;
                }
            }
 
            foreach (var fileName in AdditionalDllFileNames)
            {
                if (File.Exists(fileName))
                    ProcessDll(fileName);
            }
 
            // Run original executables
 
            var monoCfgDir = Environment.GetEnvironmentVariable("MONO_CFG_DIR");
            var monoPath = monoCfgDir.Substring(0, monoCfgDir.Length - 3) + "bin/mono";
 
            var currentModulePath = Assembly.GetExecutingAssembly().Location;
            var orgModulePath = currentModulePath.Substring(0, currentModulePath.Length - 3) + "org.exe";
 
            var orgArgs = '"' + orgModulePath + '"' + ' ' + string.Join(" ", args.Select(a => '"' + a + '"'));
            var handle = Process.Start(monoPath, orgArgs);
            handle.WaitForExit();
        }
 
        private static void ProcessDll(string dllPath)
        {
            AssemblyDefinition assemblyDef;
 
            using (var assemblyStream = new MemoryStream(File.ReadAllBytes(dllPath)))
            {
                assemblyDef = AssemblyDefinition.ReadAssembly(assemblyStream);
            }
 
            ProcessAssembly(new[] {assemblyDef});
 
            using (var assemblyStream = File.Create(dllPath))
            {
                assemblyDef.Write(assemblyStream);
            }
        }
 
        private static void ProcessAssembly(AssemblyDefinition[] assemblyDefs)
        {
            foreach (var assemblyDef in assemblyDefs)
            {
                foreach (var moduleDef in assemblyDef.Modules)
                {
                    foreach (var type in moduleDef.Types)
                        RemoveAttributes(type);
                }
            }
        }
 
        private static void RemoveAttributes(TypeDefinition typeDef)
        {
            RemoveAttributes(typeDef.FullName, typeDef.CustomAttributes);
 
            foreach (var field in typeDef.Fields)
                RemoveAttributes(field.Name, field.CustomAttributes);
 
            foreach (var property in typeDef.Properties)
                RemoveAttributes(property.Name, property.CustomAttributes);
 
            foreach (var method in typeDef.Methods)
                RemoveAttributes(method.Name, method.CustomAttributes);
 
            foreach (var type in typeDef.NestedTypes)
                RemoveAttributes(type);
        }
 
        private static void RemoveAttributes(string ownerName, Collection<CustomAttribute> customAttributes)
        {
            foreach (var attrName in RemoveAttributesNames)
            {
                var index = -1;
                for (var i = 0; i < customAttributes.Count; i++)
                {
                    var attr = customAttributes[i];
                    if (attr.Constructor != null && attr.Constructor.DeclaringType.FullName == attrName)
                    {
                        index = i;
                        break;
                    }
                }
 
                if (index != -1)
                    customAttributes.RemoveAt(index);
            }
        }
    }
}

  
2 、 Unity 디 렉 터 리 에 들 어가 기
Unity/Contents/Frameworks/Tools/UnusedByteCodeStripper2
 
3. 원래 의 Unused Byte CodeStripper 2. exe 를 UnusedByteCodeStripper2.org.exe
 
4. 갓 생 성 Unused Byte CodeStripper 2. org. exe 를 붙 여 넣 습 니 다.
 
5 、 Unity 로 xcode 생 성, 테스트 결과

좋은 웹페이지 즐겨찾기