https://www.emergetools.com/blog/posts/how-xcode14-unintentionally-increases-app-size logo Blog Documentation Jobs logo Blog Documentation Jobs []how-xcode14-unintentionally-increases-app-size how-xcode14-unintentionally-increases-app-size How Xcode 14 unintentionally increases app size 11/10/22 by Max Topolsky & Josh Cohenzadeh Estimated read time: 5-10 minutes Copy URL to clipboard Loading tweet... Switching to Xcode 14 Xcode 14 released on September 12th with many new features and improvements. "The first thing you'll notice" is that Xcode is faster and 30% smaller.^1 Increased parallelism makes building projects up to 25% faster and long running tests up to 30% faster. Shortly after Xcode 14's release, a number of iOS apps saw significant size increases. We first tweeted about observing a large spike in the Zillow iOS app. Zillow was not an isolated example. Between mid-September and early-October: * On October 8th, the Nike iOS app install size was 182.2 MB. A week later, it was 322.1 MB (+68%) * American Airlines went from 182.2 MB to 389.1 MB -- with Xcode 14 causing 76.2 MB (+42%) of the increase * Chime increased from 162.8 MB to 212.8 MB (+31%) Chart with significant install size increase for Nike, American, Chime, and Zillow iOS Apps Install size over time for Nike, American, Chime, and Zillow iOS apps In each case, the size jump is due to these apps releasing with Xcode 14 for the first time. Among other features, Xcode 14 disabled bitcode by default. Xcode no longer builds bitcode by default... The capability to build with bitcode will be removed in a future Xcode release. IPAs that contain bitcode will have the bitcode stripped before being submitted to the App Store. - Xcode 14 Release Notes What is bitcode? Bitcode is an alternate way of packaging the app, which leaves part of the build process for Apple to complete after submitting it to the App Store. One of the things that Apple does is strip binary symbols. And binary symbol stripping? Binary symbol stripping is where certain types of metadata that are unnecessary for running the app in production are removed from the binary. This is metadata that can be helpful prior to production, e.g. to generate dSYM files with, but only adds bloat to a user's phone in a production build. The simple explanation is that bitcode optimizes production builds, partly by stripping binary symbols. Without bitcode turned on, Xcode build settings have to be changed to strip binary symbols. This blog is not about whether deprecating bitcode is good or bad, but instead about highlighting a lesser known effect of releasing apps with Xcode 14. Below we'll: * Compare app builds before and after Xcode 14 * Investigate which apps had a size regression due to Xcode 14 * And finally, show how any app can strip binary symbols Comparing Nike before and after Xcode 14 With Xcode 14, any app that relied on bitcode is no longer stripping binary symbols from their production app. This means an app can get much bigger without adding any functionality. Here is Emerge's Size Analysis X-Ray for version 22.35.0 (measured 10 /8) of the Nike iOS app. In this version, frameworks make up 163.7 MB of the 191.7 MB install size. Try interacting with the treemap if you're on a larger screen to see granular size breakdowns. Emerge Size Analysis X-Ray for v22.35.0 of the Nike iOS App Emerge Size Analysis X-Ray Loading... In version 22.36.1 (10/15), frameworks spike to 293.8 MB (+127.3 MB) of a total 322.1 MB. Notice the addition of the dark blue "String Table(s)" found in each framework. Emerge Size Analysis X-Ray for v22.36.1 of the Nike iOS App Emerge Size Analysis X-Ray Loading... When we compare the two builds, we see that practically all of the 130 MB increase is coming from increases in DYLD.String Tables. These String Tables are the unnecessary metadata that has now made it into production. Emerge Comparison table between two Nike builds Size comparison between two Nike builds Nike went from 213.9 KB of binary symbols (0.11% of total app size) to 127.5 MB of binary symbols -- nearly 40% of the entire app. Binary symbol size in v22.35.0 (before Xcode 14) Binary symbol size in v22.35.0 (before Xcode 14) Binary symbol size in v22.36.1 (after Xcode 14) Binary symbol size in v22.36.1 (after Xcode 14) Overall, the Nike iOS app increased by 130 MB, without any major changes. Bar chart of Nike iOS app size increase How many apps were affected Emerge Tools regularly downloads apps from the App Store for analysis, which let us detect these regressions and take a closer look. The below data represents all apps where: * There are more than 2 MB of binary symbols * More than 5% of the app is binary symbols * The percent of the app that is binary symbols grew by at least 5% between builds All apps are pulled directly from the App Store. Analysis provided is for educational purposes only and does not represent Emerge Tools customers. App Install Symbol Install Symbol Prev. Size Size Diff Diff Version +127.3 Nike 323.0 MB 128.6 MB +130.4 MB MB Base Nike 323.0 MB 128.6 MB +130.4 MB +127.3 Base MB - American 407.8 MB 121.8 MB +206.9 MB +76.2 MB Base American 407.8 MB 121.8 MB +206.9 MB +76.2 MB Base - Chime 229.4 MB 90.7 MB +49.9 MB +47.0 MB Base Chime 229.4 MB 90.7 MB +49.9 MB +47.0 MB Base - Zillow 204.6 MB 49.9 MB +31.8 MB +46.4 MB Base Zillow 204.6 MB 49.9 MB +31.8 MB +46.4 MB Base - BeReal 96.7 MB 39.4 MB +41.7 MB +39.2 MB Base BeReal 96.7 MB 39.4 MB +41.7 MB +39.2 MB Base - Robinhood 309.8 MB 25.1 MB +39.1 MB +24.5 MB Base Robinhood 309.8 MB 25.1 MB +39.1 MB +24.5 MB Base - Lucid 222.5 MB 11.8 MB +15.1 MB +24.0 MB Base Lucid 222.5 MB 11.8 MB +15.1 MB +24.0 MB Base - MyFitnessPal 134.7 MB 17.4 MB +15.5 MB +16.3 MB Base MyFitnessPal 134.7 MB 17.4 MB +15.5 MB +16.3 MB Base - Fonts Art 254.2 MB 22.5 MB +39.5 MB +12.9 MB Base Fonts Art 254.2 MB 22.5 MB +39.5 MB +12.9 MB Base - OfferUp 94.0 MB 10.9 MB +11.9 MB +10.8 MB Base OfferUp 94.0 MB 10.9 MB +11.9 MB +10.8 MB Base - Peloton 204.9 MB 12.8 MB +27.2 MB +8.5 MB Base Peloton 204.9 MB 12.8 MB +27.2 MB +8.5 MB Base - VPN - Super Unlimited Proxy 74.9 MB 9.9 MB +23.7 MB +7.8 MB Base VPN - Super 74.9 MB 9.9 MB +23.7 MB +7.8 MB Base Unlimited Proxy - Hinge 69.7 MB 7.4 MB +10.2 MB +5.7 MB Base Hinge 69.7 MB 7.4 MB +10.2 MB +5.7 MB Base - Musi 39.9 MB 3.2 MB +5.7 MB +3.2 MB Base Musi 39.9 MB 3.2 MB +5.7 MB +3.2 MB Base - Duo Mobile 24.7 MB 3.4 MB +4.4 MB +3.3 MB Base Duo Mobile 24.7 MB 3.4 MB +4.4 MB +3.3 MB Base - Widgetsmith 40.0 MB 3.3 MB +6.5 MB +2.7 MB Base Widgetsmith 40.0 MB 3.3 MB +6.5 MB +2.7 MB Base - Shazam 34.1 MB 2.2 MB +3.6 MB +2.1 MB Base Shazam 34.1 MB 2.2 MB +3.6 MB +2.1 MB Base - Each of the above apps likely regressed due to releasing with Xcode 14. That said, there are many other apps that have significant savings from stripping binary symbols that aren't definitively attributable to Xcode 14. Toyota (v2.0.9), the app tweeted about at the start of the blog, has an install size of 550.2 MB and could save 109.8 MB (20% of total app size) from stripping binary symbols. That was the first time Emerge Tools analyzed the Toyota app and we can't say if it had binary symbol bloat in previous builds. There are also apps like TurboTax, which we've analyzed weekly since April 2022. TurboTax has over 100 MB of potential savings in every build we've measured. The three main Intuit iOS apps - TurboTax, Mint , and Quickbooks - have a combined install size of 1.37 GB. They could save 578 MB (42% of size) just by stripping binary symbols. The following is a list of apps where there are more than 15 MB of binary symbols, but we can't say for sure if it is related to switching to Xcode 14. App Install Size Symbol Size QuickBooks 605.9 MB 246.4 MB QuickBooks 605.9 MB 246.4 MB Mint 436.0 MB 200.1 MB Mint 436.0 MB 200.1 MB TurboTax 347.6 MB 132.2 MB TurboTax 347.6 MB 132.2 MB Google Earth 262.3 MB 113.3 MB Google Earth 262.3 MB 113.3 MB Toyota 550.2 MB 109.8 MB Toyota 550.2 MB 109.8 MB Fidelity 318.9 MB 102.8 MB Fidelity 318.9 MB 102.8 MB Xfinity 288.2 MB 102.7 MB Xfinity 288.2 MB 102.7 MB iRobot 533.5 MB 94.2 MB iRobot 533.5 MB 94.2 MB Skyscanner 209.5 MB 91.4 MB Skyscanner 209.5 MB 91.4 MB Amazon Alexa 378.6 MB 87.3 MB Amazon Alexa 378.6 MB 87.3 MB Prime Video 208.0 MB 82.7 MB Prime Video 208.0 MB 82.7 MB Premiere Rush 449.7 MB 78.8 MB Premiere Rush 449.7 MB 78.8 MB Nike Run Club 308.3 MB 78.0 MB Nike Run Club 308.3 MB 78.0 MB Bleacher Report 286.9 MB 75.7 MB Bleacher Report 286.9 MB 75.7 MB Citi Mobile 313.9 MB 73.6 MB Citi Mobile 313.9 MB 73.6 MB Amazon Music 256.3 MB 64.4 MB Amazon Music 256.3 MB 64.4 MB Glovo 195.7 MB 55.7 MB Glovo 195.7 MB 55.7 MB BofA 393.3 MB 53.7 MB BofA 393.3 MB 53.7 MB Turo 197.3 MB 51.4 MB Turo 197.3 MB 51.4 MB SoundCloud 156.1 MB 51.0 MB SoundCloud 156.1 MB 51.0 MB Chargemap 137.5 MB 44.1 MB Chargemap 137.5 MB 44.1 MB Taco Bell 209.7 MB 43.6 MB Taco Bell 209.7 MB 43.6 MB Wendy's 182.8 MB 38.5 MB Wendy's 182.8 MB 38.5 MB Klarna 226.2 MB 37.5 MB Klarna 226.2 MB 37.5 MB MasterClass 128.7 MB 37.2 MB MasterClass 128.7 MB 37.2 MB AllTrails 205.8 MB 36.1 MB AllTrails 205.8 MB 36.1 MB Twitch 150.0 MB 33.1 MB Twitch 150.0 MB 33.1 MB GroupMe 97.9 MB 31.2 MB GroupMe 97.9 MB 31.2 MB Chrome 177.7 MB 30.0 MB Chrome 177.7 MB 30.0 MB Twitter 256.5 MB 27.4 MB Twitter 256.5 MB 27.4 MB Spendesk 121.0 MB 26.1 MB Spendesk 121.0 MB 26.1 MB Yelp 244.3 MB 25.5 MB Yelp 244.3 MB 25.5 MB Authenticator 143.0 MB 23.0 MB Authenticator 143.0 MB 23.0 MB Bloomberg 138.1 MB 22.0 MB Bloomberg 138.1 MB 22.0 MB Bible 133.0 MB 21.9 MB Bible 133.0 MB 21.9 MB Domino's 140.5 MB 19.1 MB Domino's 140.5 MB 19.1 MB Proton VPN 115.8 MB 19.5 MB Proton VPN 115.8 MB 19.5 MB Fly Delta 172.0 MB 18.0 MB Fly Delta 172.0 MB 18.0 MB DraftKings 149.2 MB 17.5 MB DraftKings 149.2 MB 17.5 MB Fantasy 124.1 MB 17.8 MB Fantasy 124.1 MB 17.8 MB Panda Express 116.9 MB 16.1 MB Panda Express 116.9 MB 16.1 MB ESPN 119.0 MB 15.6 MB ESPN 119.0 MB 15.6 MB JetBlue 112.0 MB 15.8 MB JetBlue 112.0 MB 15.8 MB Zelle 66.9 MB 15.8 MB Zelle 66.9 MB 15.8 MB How to strip binary symbols without bitcode Luckily, stripping binary symbols from the final build product is straightforward. Here are two ways you can strip binary symbols. Using Xcode build settings You can do automatic stripping of builds during the Archive build action by setting: * "Deployment Postprocessing" = "Yes" * "Strip Linked Product" to "Yes" * "Additional Strip Flags" to -rSTx * All other stripping settings to their defaults However, with this method, you have to be careful that settings are the same for all targets. Also, there can be pitfalls when used with package managers, such as for Cocoapods. Using a Shell Script Our recommendation is to add a "Run Script" build phase at the very end of your build process that strips frameworks manually. This method is clear and reliable, regardless of which package managers and build settings are used to create the app. Below is an example of a script you can use for binary stripping. Huge thanks to Filip Busic from Doordash for helping here! In the build phases's settings, make sure that "Based on dependency analysis" is unchecked so that the script is run on every build. You can read more about this method on our documentation. Note: binary stripping has to be done before codesigning the app or else the code signature will be invalidated. Why this matters As Apple said in their Xcode 14 video, app size is the first thing your user will notice. And users do pay attention, as a recent reviewer of the American Airlines iOS app puts it: Negative review of the American Airlines iOS app due to its install size App Store review of American Airlines iOS app Google's Play Console documentation has a similar recommendation: App size is one of the biggest factors that can affect your app's install and uninstall metrics. It's important to regularly monitor and understand how you can reduce your app's download and install sizes. - Play Console Documentation Ok ... size matters ... Assuming that's true, how could this regression have been avoided? It's unrealistic to expect devs to stay on top of all the nuances in platform version changes. This is where continuous monitoring comes in. If measurement is manual, regressions won't consistently be caught before reaching production. Slack message to Emerge Tools about size increase due to Xcode 14 Above is a Slack from one of our customers asking about their app size increase after switching to Xcode 14. They caught the regression before their release with the help of Emerge's continuous integration tooling. The bitcode deprecation that happened as part of Xcode 14 is certainly an extreme example of app size regression. However, we find that smaller regressions happen all the time, whether it be from an SDK update or a new feature. Over time these changes accumulate into a noticeably worse user experience, which is all the more reason to be proactive about your app size. --------------------------------------------------------------------- We're hiring! Copy URL to clipboard --------------------------------------------------------------------- Resources Email us directly Privacy Policy Terms of Service Security 2022 (c) Emerge Tools, Inc. All rights reserved. Backed by Y Combinator