Cómo reducir el tamaño de mi aplicación de iPhone?

Títulos alternativos (para ayudar a las búsquedas)

Comprimir PNG

Reduce el tamaño de un archivo de iPhone (.ipa)

Agregar una regla de comstackción para comprimir imágenes en Xcode


Las aplicaciones iOS solo se pueden descargar a través de 3G si tienen menos de 100 MB. ¿Cuáles son las mejores estrategias para reducir el tamaño de una aplicación?

Las áreas en las que me gustaría enfocar son:

  • Imágenes
  • Bases de datos
  • Código
  • Bibliotecas estáticas

NB: la pregunta original se puede ver en las revisiones de esta pregunta

PNG es realmente la mejor opción para la compresión de imágenes sin pérdidas. Puede optimizar sus PNG para el tamaño usando PNGOUT , pero ¿puedo preguntar qué archivos están ocupando mucho espacio? ¿Cómo se compara con una versión sin depuración?

Editar: si desea una versión GUI gratuita de PNGOUT, eche un vistazo a PNGGauntlet .

Agregar una regla de comstackción Xcode para comprimir PNG

Las imágenes en una aplicación iOS pueden constituir la mayor parte de su tamaño. Esto es especialmente cierto si se trata de una Aplicación Universal que requiere que tenga todas las imágenes por triplicado (iPhone Standard, iPhone Retina iPad).

El mejor tipo de imagen para usar en una aplicación iOS es un PNG . Cuando su diseñador creó estas imágenes en Photoshop, se guardan con una gran cantidad de metadatos que pueden descartarse.

Sin embargo, no desea perder todos esos datos por completo, ya que es útil para los diseñadores si necesitan modificar la imagen.

Optimización PNGOUT

Existen varias herramientas para optimizar archivos PNG, pero pngout parece ser la mejor opción.

  1. Descargue la versión para Mac de pngout .
  2. Copie la aplicación de línea de comandos binaria pngout a un directorio con en su proyecto. Agregar el binario al directorio del proyecto se asegura de que esté disponible para cualquiera que construya el proyecto en cualquier sistema.

Crear una regla de comstackción (Xcode 4)

Las reglas de comstackción son específicas del objective, por lo que si tiene más de un objective, debe copiar la regla en cada uno.

  1. Agregue macros DEBUG y DISTRIBUTION a sus configuraciones de comstackción. La optimización de los PNG es bastante intensa y, como tal, solo desea hacerlo en las comstackciones de distribución. Macros del DEBUG_BUILD=1 http://sofes.miximages.com/iphone/jtteg4.png Como puede ver, entre otros, he agregado DEBUG_BUILD=1 y DISTRIBUTION_BUILD=1 .

  2. Agregue una regla de comstackción para archivos PNG. Una regla de comstackción simplemente procesa un archivo específico (y / o) tipo de archivo durante el proceso de comstackción. El poder de esto es que las reglas se pueden encadenar juntas. Regla de comstackción – Xcode 4 http://sofes.miximages.com/iphone/404.gif

  3. Haga clic en el botón “Agregar regla”;

    • Establezca el Proceso en “Archivos de origen con nombres coincidentes” y su valor *.png .
    • Establezca el uso de “Script personalizado”

Pegue este código en el cuadro de secuencia de comandos

 echo "----------------------------------------------------------------" >> "${DERIVED_FILES_DIR}/pngout-log.txt" echo "${INPUT_FILE_PATH}" >> "${DERIVED_FILES_DIR}/pngout-log.txt" echo "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" >> "${DERIVED_FILES_DIR}/pngout-log.txt" echo ${GCC_PREPROCESSOR_DEFINITIONS} >> "${DERIVED_FILES_DIR}/pngout-log.txt" BUILD=`echo ${GCC_PREPROCESSOR_DEFINITIONS} | grep -o DISTRIBUTION_BUILD` echo $BUILD >> "${DERIVED_FILES_DIR}/pngout-log.txt" if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt" "${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" else echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt" cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" fi echo "...done." >> "${DERIVED_FILES_DIR}/pngout-log.txt" 

Hay varias variables de entorno que son notables:

  • ${INPUT_FILE_PATH} – ruta completa al archivo de imagen
  • ${INPUT_FILE_NAME} – nombre del archivo de imagen (con extensión)
  • ${DERIVED_FILES_DIR} : donde Xcode almacena archivos de comstackción, etc.
  • ${GCC_PREPROCESSOR_DEFINITIONS} : las macros que configuraste arriba

El trabajo se hace en esta línea:

  "${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" 

${PROJECT_DIR} es la ruta completa a su proyecto, el -y sobrescribe los archivos existentes, -q limita la salida de pngout y -force evita que pngout salga con el estado de 2 cuando un archivo no puede optimizarse y provoca errores de generación de informes Xcode .

Este script simplemente prueba ${GCC_PREPROCESSOR_DEFINITIONS} para ver si es DISTRIBUTION_BUILD si es así, usa pngout para optimizar el archivo, de lo contrario, lo copia a ${DERIVED_FILES_DIR} para que Xcode pueda seguir ${DERIVED_FILES_DIR} .

Finalmente , no olvide agregar ${DERIVED_FILES_DIR}/${INPUT_FILE_NAME} a la lista “Archivos de salida”, así es como Xcode sabe cómo encontrar los archivos que ha procesado.

Una comstackción de depuración generalmente será mucho más grande que una versión de lanzamiento. Intenta construir en modo de lanzamiento.

Hay algunas opciones de comstackción que también pueden ser útiles. Sin embargo, no estoy seguro de cuál es el predeterminado para el modo de lanzamiento de iphone. -Os optimizará para un binario más pequeño. También hay una opción para quitar el código muerto que eliminará cualquier código que nunca se pueda ejecutar. También puedes intentar eliminar el binario … aunque no estoy seguro si eso funciona para los binarios de iphone.

Esto supone que su problema se debe al tamaño binario ejecutable y no a los recursos de la imagen.

Usé ImageOptim e ImageAlpha para reducir el tamaño de la aplicación. Eche un vistazo a este estudio de caso para más información. Tweetbot para iPad

@rjstelling tiene una muy buena respuesta, y no podría comenzar a decirlo mejor, pero hay un pequeño problema con eso. No funcionará con imágenes localizadas. Esto solo es un problema si incrusta texto en imágenes, algo que recomiendo encarecidamente que nunca haga si puede evitarlo. Sin embargo, si tiene que usar imágenes localizadas, siga todos los pasos de rjstelling, excepto en lugar de usar:

 if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt" "${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" else echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt" cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_NAME}" fi 

usa el siguiente código:

 if [ "${BUILD}" == "DISTRIBUTION_BUILD" ]; then echo "COMPRESS" >> "${DERIVED_FILES_DIR}/pngout-log.txt" "${PROJECT_DIR}/build-process/pngout" -y -q -force "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}" else echo "COPY" >> "${DERIVED_FILES_DIR}/pngout-log.txt" cp -f "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME}" fi 

Tenga en cuenta que el único cambio es en la ruta del archivo de exportación. INPUT_FILE_REGION_PATH_COMPONENT a la ruta de exportación para que la localización de la imagen funcione correctamente. INPUT_FILE_REGION_PATH_COMPONENT está vacío normalmente a menos que haya una carpeta localizada para el archivo específico. Siendo ese el caso, proporciona el nombre de la carpeta y una barra inclinada, por lo que no es necesario.

También debe cambiar la configuración de los Output Files a ${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME} para que esto funcione.

No estoy seguro si soy el único que ha tenido ese problema, pero espero que ayude a alguien.

Reduje una aplicación para iOS de 90 MB a 50 MB en los últimos meses. Aquí hay algunos consejos y herramientas:

Para personalizar el tamaño de la aplicación de iOS

  1. descomprime tu ipa para verificar recursos como archivos de video, fonts e imágenes.

  2. Perfile su archivo binario por archivos de biblioteca y objeto (clases) usando el archivo Linkmap y XCode Linkmap Parser .

Para reducir los archivos de imagen

  • utilice ImageOptim-CLI para automatizar el proceso de compresión de imagen
  • usa la imagen no utilizada para encontrar archivos de imágenes no utilizados

Para reducir el archivo binario

  • Símbolos de depuración de banda
  • Encuentra importaciones sin usar usando fui

Inspeccionando un archivo .ipa

Simplemente cambie la extensión de un archivo .ipa a .zip, luego ábralo con Finder para descomprimirlo. Haga clic con el botón derecho en el paquete .app descomprimido y seleccione “Mostrar contenido del paquete” para ver los recursos que contiene. Esto puede darle una idea de qué está usando más espacio.

Puede examinar el tamaño comprimido de cada elemento en su .ipa abriendo Terminal y ejecutando el siguiente comando:

descomprimir -lv /ruta/a/tu/app.ipa

La columna de tamaño tiene el tamaño comprimido de cada archivo dentro de su archivo .ipa. Debe evaluar este tamaño mientras trabaja para reducir el tamaño de los recursos en su aplicación. Puede reducir el tamaño de un recurso por mucho, pero después de producir un archivo .ipa, puede descubrir que el tamaño comprimido de ese recurso no ha cambiado tan dramáticamente. La técnica más efectiva para reducir el tamaño de un archivo .ipa es eliminar recursos innecesarios.

Para acceder al artículo completo, consulte el enlace del sitio web para desarrolladores de Apple.