web-dev-qa-db-fra.com

Comment réduire la taille de mon application iPhone?

Titres alternatifs (pour faciliter les recherches)

Compression des PNG

Réduire la taille d'une archive iPhone (.ipa)

Ajout d'une règle de construction pour compresser des images dans Xcode


les applications iOS ne peuvent être téléchargées via la 3G que si elles ont moins de 100 Mo. Quelles sont les meilleures stratégies pour réduire la taille d'une application?

Les domaines sur lesquels j'aimerais m'attarder sont:

  • Images
  • Bases de données
  • Code
  • Bibliothèques statiques

NB: La question d'origine peut être visualisée dans les révisions de cette question}

31
Sudharsanan

Le format PNG est vraiment la meilleure option pour la compression d’images sans perte. Vous pouvez optimiser la taille de vos PNG avec PNGOUT , mais puis-je savoir quels fichiers prennent spécifiquement beaucoup d’espace? Comment se compare-t-il à une version sans débogage?

Edit: Si vous souhaitez une version gratuite de PNGOUT avec une interface graphique, regardez PNGGauntlet .

6
Paul Lammertsma

Ajout d'une règle de construction Xcode pour compresser les fichiers PNG

Les images dans une application iOS peuvent représenter la majorité de sa taille. Cela est particulièrement vrai s'il s'agit d'une application universelle nécessitant une image en triple exemplaire (iPhone Standard, iPhone Retina iPad).

Le meilleur type d'image à utiliser dans une application iOS est un PNG . Lorsque votre concepteur a créé ces images dans Photoshop, celles-ci sont enregistrées avec un grand nombre de métadonnées pouvant être supprimées. 

Toutefois, vous ne voulez pas perdre complètement toutes ces données car elles sont utiles aux concepteurs s’ils doivent modifier l’image.

Optimisation PNGOUT

Il existe plusieurs outils pour optimiser les fichiers PNG, mais pngout semble être la meilleure option.

  1. Téléchargez la version Mac de pngout
  2. Copiez l'application de ligne de commande binaire pngout dans un répertoire de votre projet. L'ajout du fichier binaire au répertoire du projet permet de s'assurer qu'il est disponible pour quiconque construit le projet sur n'importe quel système.

Créer une règle de construction (Xcode 4)

Les règles de construction sont spécifiques à la cible. Par conséquent, si vous avez plusieurs cibles, vous devez les copier dans chacune d’elles.

  1. Ajoutez des macros DEBUG et DISTRIBUTION à vos configurations de construction. L’optimisation des fichiers PNG est assez intense en processeur et vous ne voulez donc le faire que sur des versions de distribution. Macros de préprocesseur http://i52.tinypic.com/jtteg4.png Comme vous pouvez le voir parmi d’autres, j’ai ajouté DEBUG_BUILD=1 et DISTRIBUTION_BUILD=1.

  2. Ajouter une règle de construction pour les fichiers PNG. Une règle de construction traite simplement un fichier spécifique (et/ou) de type de fichier au cours du processus de construction. Le pouvoir de ceci est que les règles peuvent être chaînées ensemble. Règle de construction - Xcode 4 http://i56.tinypic.com/ioovut.png

  3. Cliquez sur le bouton "Ajouter une règle". 

    • Définissez Process sur "Fichiers sources avec les noms correspondants" et sa valeur *.png
    • Définir en utilisant "Script personnalisé"

Collez ce code dans la boîte de script

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"

Plusieurs variables d'environnement sont à noter:

  • ${INPUT_FILE_PATH} - chemin complet du fichier image
  • ${INPUT_FILE_NAME} - nom du fichier image (avec extension)
  • ${DERIVED_FILES_DIR} - où Xcode stocke les fichiers de construction, etc.
  • ${GCC_PREPROCESSOR_DEFINITIONS} - les macros que vous avez définies ci-dessus

Le travail est fait sur cette ligne:

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

${PROJECT_DIR} est le chemin d'accès complet à votre projet, le -y écrase les fichiers existants, -q limite la sortie pngouts et -force empêche pngout de quitter avec le statut 2 lorsqu'un fichier ne peut pas être optimisé et provoque des erreurs de génération de rapports Xcode.

Ce script teste simplement le ${GCC_PREPROCESSOR_DEFINITIONS} pour voir s'il s'agit d'un DISTRIBUTION_BUILD s'il utilise pngout pour optimiser le fichier, sinon il le copie dans le ${DERIVED_FILES_DIR} afin que Xcode puisse continuer à le traiter.

Enfin , n'oubliez pas d'ajouter ${DERIVED_FILES_DIR}/${INPUT_FILE_NAME} à la liste "Fichiers de sortie". C'est ainsi que Xcode sait comment trouver les fichiers que vous avez traités. 

23
rjstelling

Une version de débogage sera généralement beaucoup plus grande qu'une version validée. Essayez de construire en mode release.

Quelques options du compilateur peuvent également aider. Pas sûr de ce qui est par défaut pour le mode de libération de l'iphone cependant -Os optimisera pour un plus petit binaire. Il existe également une option de suppression du code mort qui supprime tout code qui ne peut jamais être exécuté. Aussi, vous pouvez essayer de supprimer le fichier binaire .. pas sûr si cela fonctionne pour les binaires iphone cependant.

Cela suppose que votre problème est dû à la taille du binaire exécutable et non aux ressources de l'image.

4
Michael Anderson

J'ai utilisé ImageOptim et ImageAlpha pour réduire la taille de l'application. Regardez cette étude de cas pour plus d'informations. Tweetbot pour iPad

3
Amit Vaghela

J'ai réduit une application iOS de 90 Mo à 50 Mo au cours des derniers mois. Voici quelques conseils et outils:

Pour profiler la taille d'une application iOS  

  1. décompressez votre ipa pour vérifier les ressources telles que les fichiers vidéo, les polices et les images.

  2. Profil de votre fichier binaire par bibliothèque et fichiers objet (classes) en utilisant le fichier Linkmap et XCode Linkmap Parser .

Pour réduire les fichiers image

  • utiliser ImageOptim-CLI pour automatiser le processus de compression d'image
  • utilisez Unused-image pour rechercher des fichiers image non utilisés

Pour réduire le fichier binaire

  • Supprimer les symboles de débogage
  • Recherchez les importations non utilisées avec fui
1
Jakehao

@rjstelling a vraiment une bonne réponse, et je ne pourrais pas commencer à mieux le dire, mais il y a un petit problème avec cela. Cela ne fonctionnera pas avec des images localisées. Ce n'est un problème que si vous intégrez du texte dans des images, ce que je recommande fortement de ne jamais faire si vous pouvez l'éviter. Toutefois, si vous devez utiliser des images localisées, suivez toutes les étapes de rjstelling, à la place des instructions suivantes:

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

utilisez le code ci-dessous:

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

Notez que le seul changement concerne le chemin du fichier d'exportation. Vous devez ajouter INPUT_FILE_REGION_PATH_COMPONENT au chemin d’exportation pour que la localisation de l’image fonctionne correctement. INPUT_FILE_REGION_PATH_COMPONENT est vide normalement sauf s'il existe un dossier localisé pour le fichier spécifique. Cela étant le cas, il fournit le nom du dossier et une barre oblique finale, pour que vous n'ayez pas à le faire.

Vous devez également modifier votre paramètre Output Files en ${DERIVED_FILES_DIR}/${INPUT_FILE_REGION_PATH_COMPONENT}${INPUT_FILE_NAME} pour que cela fonctionne. 

Je ne sais pas si je suis le seul à avoir eu ce problème, mais j'espère que cela aidera quelqu'un.

1
btomw

Inspection d'un fichier .ipa

Modifiez simplement l’extension d’un fichier .ipa en .Zip, puis ouvrez-le avec le Finder pour le décompresser. Cliquez avec le bouton droit de la souris sur le lot .app décompressé Et choisissez "Afficher le contenu du paquet" pour afficher les ressources Qu'il contient. Cela peut vous donner une idée de ce qui utilise le plus d'espace .

Vous pouvez examiner la taille compressée de chaque élément de votre fichier .ipa en ouvrant le terminal Et en exécutant la commande suivante:

unzip -lv /path/to/your/app.ipa

La colonne taille a la taille compressée de chaque fichier dans votre fichier .ipa . Vous devez évaluer cette taille pendant que vous travaillez à réduire la taille de Ressources dans votre application. Vous pouvez réduire considérablement la taille d'une ressource, Mais après avoir créé un fichier .ipa, vous pouvez découvrir que la taille compressée De cette ressource n'a pas changé de façon aussi spectaculaire. La technique la plus efficace Pour réduire la taille d'un fichier .ipa consiste à supprimer Des ressources inutiles.

Pour accéder à l'article complet, voir le lien link à partir du site Web du développeur Apple. 

0
Murat Yasar