Después de cambiar a Xcode 7, el tamaño de la aplicación aumentó de 9 MB a 60 MB, ¿hay alguna solución?

96

He estado retrocediendo en la historia de Git para encontrar la causa de un enorme cambio de tamaño de archivo, pero la única razón real que puedo encontrar es el cambio de Xcode 6 a Xcode 7 GM.

Descubrí que estos son los 10 principales contribuyentes de tamaño de archivo en una operación .ipacreada a partir de Archivo en una configuración de compilación de lanzamiento :

$ unzip -lv Roger\ Release.ipa | sort -k +3nr | head
41802768  Defl:N 16887199  60%  09-14-15 23:47  dc24cdc1  Payload/Roger.app/Frameworks/libswiftCore.dylib
41802400  Defl:N 16886076  60%  09-06-15 18:33  f939ea6a  SwiftSupport/iphoneos/libswiftCore.dylib
11184032  Defl:N  5915625  47%  09-14-15 23:48  6ceac4a2  Payload/Roger.app/Roger
 6399584  Defl:N  2670275  58%  09-14-15 23:47  0ac52d3f  Payload/Roger.app/Frameworks/libPhoneNumber_iOS.framework/libPhoneNumber_iOS
 5410384  Defl:N  2334189  57%  09-14-15 23:47  7a8cb03f  Payload/Roger.app/Frameworks/Alamofire.framework/Alamofire
 4521904  Defl:N  2292789  49%  09-14-15 23:47  95da0882  Payload/Roger.app/Frameworks/FBSDKCoreKit.framework/FBSDKCoreKit
 4731552  Defl:N  1926357  59%  09-14-15 23:48  e05337de  Payload/Roger.app/Frameworks/libswiftFoundation.dylib
 4731168  Defl:N  1925355  59%  09-06-15 18:33  19a5c3c4  SwiftSupport/iphoneos/libswiftFoundation.dylib
 2659232  Defl:N  1232897  54%  09-14-15 23:47  1a53a401  Payload/Roger.app/Frameworks/AFNetworking.framework/AFNetworking
 1196624  Defl:N   545343  54%  09-14-15 23:47  19a063cb  Payload/Roger.app/Frameworks/Bolts.framework/Bolts

Con mucho, los archivos más grandes son los dos (ligeramente diferentes) libswiftCore.dylib , que suman más de 32 MB. En el paquete creado por Xcode 6, estos dos archivos totalizaban solo 3 MB.

Entonces, la pregunta # 1 es: ¿Por qué los archivos centrales de Swift están allí dos veces? ( El contenido incrustado contiene código Swift se establece en No ).

Y la pregunta # 2 es: ¿Qué pasó? ¿Por qué aumentó el tamaño del núcleo de Swift en 15 MB? ¿Es esto permanente?

Algunas notas adicionales:

  • Este es un proyecto que era completamente Objective-C pero ahora es principalmente Swift. La configuración de Definir módulo está establecida en .
  • El proyecto usa CocoaPods con use_frameworks! set.
  • He confirmado el tamaño de descarga real de TestFlight en varios dispositivos y versiones de iOS y está en el rango de 30 a 60 MB (presumiblemente la diferencia se debe a la división de aplicaciones). Solía ​​ser de 9 MB.
Blixt
fuente
4
Xcode 7 usa la división de aplicaciones, el tamaño de descarga probablemente será diferente, probablemente incluso disminuirá. No me preocuparía por esto.
Adam
6
@ Adam: Este no es el caso. La versión implementada varía según el dispositivo, pero hasta ahora he visto 30 MB en el iPhone 5s y 60 MB en el iPhone 6. Los tiempos de instalación han aumentado notablemente. Esto definitivamente es algo de lo que preocuparse cuando solía ser de 9 MB.
Blixt
3
En realidad, la diferencia de 30 frente a 60 MB se debe probablemente a que el iPhone 5s está en iOS 9.1 y el iPhone 6 en iOS 8. Pero incluso si todos los usuarios de la aplicación actualizaron a iOS 9, 30 MB sigue siendo un gran aumento de 9 MEGABYTE.
Blixt
2
¿Implementó a través de TestFlight? El adelgazamiento de la aplicación se realiza en los servidores de Apple, por lo que a menos que lo instale a través de TestFlight / iTunes, creo que no podrá ver el tamaño reducido.
MirekE
2
Después de subir a TestFlight, el tamaño de mi aplicación se redujo de 74 MB a 9,6 MB, así que no se preocupe
Gintama

Respuestas:

27

Probablemente causado por BitCode, he visto el mismo crecimiento, sin embargo, una vez implementado desde la App Store, el tamaño de la aplicación no ha aumentado.

Puede deshabilitar BitCode en su aplicación y los otros objetivos también y debería ver una reducción.

David Rothera
fuente
Confirmé que el tamaño de descarga de la aplicación de Apple TestFlight es de 30 a 60 MB en lugar de 9 MB. No creo que cambie una vez que esté en la App Store, ya que presumiblemente usan el mismo mecanismo de distribución. Intentaré deshabilitar Bitcode.
Blixt
La desactivación de Bitcode y los símbolos de depuración en los pasos de compilación y publicación y el archivo de una versión de compilación aún incluyen exactamente los mismos dos libswiftCore.dylibarchivos a ~ 40 MB cada uno (~ 16 MB comprimidos). No he confirmado la implementación completa a través de TestFlight, pero dado que estos archivos enormes siguen siendo parte del .ipa, dudo que su contribución al tamaño del archivo cambie. El tamaño total se redujo en aproximadamente ~ 10 MB, que presumiblemente se debe principalmente a la eliminación del soporte de símbolo de bloqueo.
Blixt
1
Me estoy saliendo de la experiencia personal, mis .xcarchive son MUCHO más grandes ahora que los anteriores a Xcode7, sin embargo, la descarga de la tienda de aplicaciones sigue siendo del mismo tamaño, si no un poco más pequeña, debido a la reducción de recursos, etc.
David Rothera
10
Solo mirando ahora, el paquete de TestFlight era de 33 MB y para la misma compilación en la AppStore es de 10,5 MB, esto muestra que la reducción no se ha realizado en las compilaciones de TestFlight.
David Rothera
Está bien, es bueno saberlo. Ejecutaré la aplicación hasta la App Store y espero lo mejor.
Blixt
19

He estado probando muchas configuraciones y combinaciones y parece que el tamaño de archivo de los paquetes creados por Xcode 7 varía mucho dependiendo tanto del dispositivo como de la versión de iOS. Además, las compilaciones de TestFlight ahora son enormes en comparación con antes, pero la buena noticia es que una vez en la App Store no ha habido un gran aumento (aunque veo entre 1 y 2 MB agregados al tamaño del paquete en comparación con antes) .

Aquí hay algunas muestras para mostrar la variación entre TestFlight, App Store y dispositivos:

TestFlight, iPhone 5s en iOS 9.1
35,6 MB

TestFlight, iPhone 6 en iOS 8.4.1
70,1 MB

Tienda de aplicaciones
11,8 MB

El tamaño de la App Store fue idéntico en todos los dispositivos que probé. Sin embargo, no lo he probado en el iPhone 6 Plus, es muy posible que el tamaño del paquete sea mayor ya que usa activos @ 3x.

Blixt
fuente
11

Se espera que el tamaño de los dylibs rápidos, y su propio código, sea significativamente mayor en el .xcarchive, y cuando se exporta para distribución en la tienda, debido a la inclusión de bitcode. Este tamaño adicional no se reflejará en lo que realmente se entregue a sus usuarios, por lo que no debería ser un problema. Cuando envíe su aplicación a la tienda, la tienda la procesará para eliminar el código de bits, y esa versión procesada de la API es la que descargarán sus usuarios.

Si realiza cualquier tipo de exportación desde su archivo, excepto una exportación de la tienda (por ejemplo, guardar para la implementación ad-hoc), eliminaremos localmente el código de bits (e incluso recompilaremos sus binarios desde el código de bits primero, si deja esa opción marcada en la exportación flujo de trabajo, para recrear lo que sucederá en la tienda), para que pueda ver qué tan grande será su aplicación. TestFlight también eliminará el código de bits y le mostrará el tamaño real de su aplicación.

También debe tener en cuenta que el tamaño de su aplicación también se puede reducir mediante el adelgazamiento de la aplicación, sobre lo cual puede leer en https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/Introduction/Introduction.html . Es probable que desee realizar una exportación ad-hoc para ver el tamaño de cada variante reducida de su aplicación de todos modos.

Rick Ballard
fuente
6

Bitcode incrustado es la razón.

Suponiendo que no desea deshabilitar ENABLE_BITCODE, puede quitar los símbolos de depuración.

Consulte http://oguzbastemur.blogspot.com/2015/09/xcode-7-and-increaded-binary-size.html, ya que eliminar los símbolos de depuración antes de incrustar el código de bits es una de las opciones que puede hacer.

Nuray Altin
fuente
1
¿No significa eso que no obtendrá informes de fallos simbolizados?
Iulian Onofrei