I’ve updated my iOS Artwork Extractor to support iOS 4.2.1.

If you haven’t seen it, the artwork extractor is capable of exporting images to and from the .artwork archive files found in the iOS SDK.

Normally I wouldn’t remark on an update to this tool, but things changed significantly in iOS 4.2.1; this necessitated some larger changes to my tool.

The easy bit of the tool is the script you’ll actually use: iOS-artwork.py. Provided the .artwork file in question is supported (that is, has a corresponding JSON data file in the supported_artwork_files directory), getting PNGs out of SDK files is a snap.

The interesting – and new – bit of code is in how I generate the JSON files. I used to generate these by popping open a hex editor and looking for bits of the UIKit binary that appeared to contain an array of image dimensions. This was painfully slow, though it did work.

Starting with iOS 4.2.1, I’ve taken a more principled approach. The UIKit binary is a Mach-O executable file, so I wrote some python tools to take advantage of this. I built on top of macholib, a Python library for reading Mach-O headers. While macholib reads headers, it offers no support for reading symbol tables or making sense of the constant data structures that C/Objective-C dump into the binaries. My symbol table code is capable of finding data for all symbols, including un-exported symbols; a little poking around showed me that __sharedImagesPhone and __sharedImagesPad were the symbols to look for. After a tiny bit of further work figuring out the relevant data structures, I had a working tool that not only finds image sizes, but also finds their offsets and names.

Anyway, it was a fun hack and I hope you find it useful.