Optimizando el Tamaño del Reproductor iOS Construido
Las dos manera principales de reducir el tamaño del reproductor son hacer un adecuado Release build dentro de Xcode y cambiando el Stripping Level dentro de Unity.
Construyendo para distribución
Desde Unity 4.2 se espera que las construcciones finales de release sean hechas utilizando el comando Xcode 4.x/5.x Product -> Archive. Utilizando este comando asegura que la construcción que está siendo hecha la configuración release y todos los símbolos de debug estén stripped (despojados). Después de ejecutar este comando el último Xcode cambia a la ventana Organizer, pestaña Archives (usted puede navegar ahí manualmente vía el menú Window -> Organizer). Usted encontrará ahí dos funciones muy útiles: App Store size estimation y Distribution. La función del tamaño estimado de construcción funciona bastante bien, pero siempre es recomendado tener un margen pequeño extra de error cuando apunte por un limite de descarge 3G (que actualmente es 100MB).
Las optimizaciones de tamaño activadas por stripping funcionan de la siguiente manera:
Nivel de Strip assemblies: el scripts’bytecode es analizado para que las clases y métodos que no estén referenciados de los scripts sean eliminados del DLLs y por lo tanto excluidos de la fase de compilación AOT. Esta optimización reduce el tamaño del binario principal y DLLs de acompañamiento y es seguro siempre que ninguna reflexión sea utilizada.
Nivel de Strip ByteCode: cualquier .NET DLLs (almacenado en la carpeta Data) son stripped (despejados) a solamente metadata. Esto es posible ya que todo el código está ya pre-compilado durante la fase AOT y vinculada al binario principal.
El nivel de Use micro mscorlib: una versión especial, y más pequeña de mscorlib es utilizada. Algunos componentes son eliminados de esta librería, por ejemplo, Security, Reflection.Emit, Remoting, ningún calendario Gregoriano, etc. También, las interdependencias entre los componentes internos son minimizados. Esta optimización reduce el binario principal y tamaño mscorlib.dll pero no es compatible con alguna clase de assembly System y System.Xml, entonces úselo con cuidado.
Esto niveles son acumulativos, entonces el nivel 3 de optimización implícitamente incluye los niveles 2 y 1, mientras que el nivel 2 de optimización incluye el nivel 1.
Tenga en cuenta que Micro mscorlib es una versión stripped de la librería núcleo. Solamente esos elementos que son requeridos por el tiempo de ejecución de Mono en Unity se mantienen. Las mejores prácticas de utilizar un micro mscrolib es no utilizar cualquiera de las clases o otras características de .NET que no son requeridas por su aplicación. Los GUIDs son un buen ejemplo de algo que usted puede omitir; ellas pueden ser fácilmente remplazadas con un pseudo GUIDs hecho de manera personalizada y haciendo esto va a resultar en un mejor rendimiento y tamaño de app.
The equivalent of Strip ByteCode is always enabled when the IL2CPP scripting backend is used. In this case, the Stripping Level option is replaced with an Boolean option named Strip Engine Code. If this option is enabled, unused modules and classes in the Unity Engine code will be removed, if it is disabled, all of the modules and classes in the Unity Engine code will be preserved.
The link.xml file (described below) can be used to effectively disable byte code stripping by preserving both types and full assemblies. For example, to prevent the System assembly from being stripped, the following link.xml file can be used:
<linker>
<assembly fullname="System" preserve="all"/>
</linker>
Note: The ability to preserve an entire assembly applies only to the IL2CPP scripting backend.
Stripping depende en su mayoría en un análisis de código estático y a veces esto puede ser realizado efectivamente, especialmente cuando características dinámicas como Reflection son utilizadas. En esos caso, es necesario dar algunas pistas como qué clases no deberían ser tocadas. Unity soporta un stripping personalizado por-proyecto blacklist. Utilizar la blacklist es simplemente crear un archivo link.xml y colocarlo a la carpeta de Assets. Un ejemplo de los contenidos del archivo link.xml sigue. Las clases marcadas para la preservación no serán afectadas por stripping:-
<linker>
<assembly fullname="System.Web.Services">
<type fullname="System.Web.Services.Protocols.SoapTypeStubInfo" preserve="all"/>
<type fullname="System.Web.Services.Configuration.WebServicesConfigurationSectionHandler" 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>
A project can include multiple link.xml files. Each link.xml file can specify a number of different options.
The stripped assemblies are output to a directory below the Temp directory in the project (the exact location varies depending on the target platform). The original, unstripped assemblies are available in the not-stripped directory in the same location as the stripped assemblies. A tool like ILSpy can be used to inspect the stripped and unstripped assemblies to determine what parts of the code were removed.
Tenga en cuenta que a veces puede ser difícil determinar qué clases están siendo stripped en error incluso si la aplicación las requiere. A veces usted pueden obtener información útil acerca de esto ejecutando la aplicación stripped en el simulador y revisando la consola de Xcode por mensajes de error.
Un proyecto vacío va a tomar menos de 22 MB en la App Store si todas las optimizaciones de tamaño están apagadas. Si usted es dueño de una licencia Avanzada (y por lo tanto tiene acceso a la opción stripping), la escena vacía con solo la cámara puede ser reducida a menos de 12 MB en la App Store (comprimida y DRM adjunto).
Cuando publique su aplicación, el servicio de la App Store de Apple primero encripta el archivo binario y luego lo comprime vía zip. La Encriptación aumenta lo ’‘randomness’ del segmento del código y por lo tanto lo hace peor para la compresión. Revise el capítulo “Building for distribution” de arriba para saber cómo estimar el tamaño de la App Store antes de la publicación.