Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
498 views
in Technique[技术] by (71.8m points)

xcode - How to reduce the size of my iPhone application?

Alternative Titles (to aid searches)

Compressing PNGs

Reduce the size of an iPhone Archive (.ipa)

Adding a build rule to compress images in Xcode


iOS Apps can only be downloaded via 3G if they are less than 100MB. What are the best strategies for reducing the size of an App?

Areas I'd like to focus on are:

  • Images
  • Databases
  • Code
  • Static Libraries

NB: The original question can be viewed in the revisions of this question

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Adding an Xcode Build Rule to compress PNGs

Images in an iOS App can make up the majority of it size. This is especially true if it is a Universal App requiring it to have all image in triplicate (iPhone Standard, iPhone Retina iPad).

The best type of image to use in an iOS App is a PNG. When your designer created these images in Photoshop they are saved with a lot of meta data that can be discarded.

However you don't want to loose all that data completely as it's useful to designers if they need to alter the image.

PNGOUT Optimisation

There are several tools for optimising PNG files, but pngout seems to be the best option.

  1. Download the Mac Version of pngout.
  2. Copy the binary command-line application pngout to a directory with in your project. Adding the binary to the project directory makes sure is is available to anyone building the project on any system.

Creating a Build Rule (Xcode 4)

Build rules are Target specific, so if you have more than one target you must copy the rule into each.

  1. Add DEBUG and DISTRIBUTION macros to your build configurations. Optimising the PNGs is quite processor intense and as such you only want to do it on distribution builds. Pre-processor macros As you can see amongst others I have added DEBUG_BUILD=1 and DISTRIBUTION_BUILD=1.

  2. Add a build rule for PNG files. A build rule simply processes a specific file (and/or) file type during the build process. The power of this is rules can be chained together. Build Rule - Xcode 4 http://tinypic.com/images/404.gif

  3. Click the "Add Rule" button;

    • Set Process to "Source files with names matching" and its value *.png.
    • Set Using to "Custom Script"

Paste this code into the script box

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"

There are several environment variables that are of note:

  • ${INPUT_FILE_PATH} — full path to the image file
  • ${INPUT_FILE_NAME} — image file name (with extension)
  • ${DERIVED_FILES_DIR} — where Xcode stores build files etc
  • ${GCC_PREPROCESSOR_DEFINITIONS} — the macros you set above

The work is done on this line:

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

${PROJECT_DIR} is the full path to your project, the -y overwrites existing files, -q limits pngouts output and -force prevents pngout from exiting with status of 2 when a file can't be optimised and causing Xcode report build errors.

This script simply tests the ${GCC_PREPROCESSOR_DEFINITIONS} to see if it a DISTRIBUTION_BUILD if so it uses pngout to optimise the file, otherwise it copies it to the ${DERIVED_FILES_DIR} so Xcode can continue to process it.

Finally, don't forget to add ${DERIVED_FILES_DIR}/${INPUT_FILE_NAME} to the "Output files" list this is how Xcode knows how to find the files you have processed.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...