In this article, I analyze the version 87.0 of the Facebook.app for iOS.

Want to support this blog? Please check out

  • Easily preview Mermaid diagrams
  • Sequence diagrams, flowcharts, …
  • Built-in editor
  • Export to PDF, PNG, and SVG
  • Quick Look integration
  • Available on macOS, iOS, and iPadOS
  • Free download on the App Store
MarkChart

6 months ago I analyzed the version 66.0 of the Facebook.app for iOS: https://blog.timac.org/2016/1018-analysis-of-the-facebook-app-for-ios

The version 66.0 was a 165 MB app on an iPad Air 2 (64-bit). It was a monolithic app with its main binary being more than 100 MB.

The version 87.0 is now available: 253 MB on the same iPad Air 2 with only 64-bit code. In just 6 months, the Facebook.app size grew by 88 MB!

Download Info

Let’s see what changed…

App content

Looking at the app content of the version 87.0 using GrandPerspective gives a good overview:

Facebook 87.0 content

Here is how the content of the version 66.0 looked like: Facebook 66.0 content

As you can see, the Facebook.app has been completely restructured:

  • the main binary is now only 19 MB
  • there is a huge 136 MB framework FBSharedFramework
  • there is another 26 MB framework called FBNotOnStartupPathFramework
  • …

Duplicated resources

One of the reason the app size grew is due to multiple copies of the same resources inside the app.

unetshallow_init.pb

You can actually see in the previous screenshot 3 copies of the same file unetshallow_init.pb:

  • Facebook.app/Frameworks/FBNotOnStartupPathFramework.framework/opticalflow_resource/unetshallow_init.pb
  • Facebook.app/Frameworks/FBSharedFramework.framework/opticalflow_resource/unetshallow_init.pb
  • Facebook.app/opticalflow_resource/unetshallow_init.pb

unetshallow_init

Keeping only one copy would save 7.2 MB.

DataFiles

Similarly the DataFiles folder appears 3 times. Keeping a single copy would save around 2 MB:

  • Facebook.app/DataFiles/
  • Facebook.app/Frameworks/FBNotOnStartupPathFramework.framework/DataFiles/
  • Facebook.app/Frameworks/FBSharedFramework.framework/DataFiles/

DataFiles

FBFacecastTipJarResources

Some resources called FBFacecastTipJarResources appear to be duplicated no less than 6 times in the app! The FBFacecastTipJarResources resources only take 150 KB on disk but 6 times makes 900 KB.

One example:

  • Facebook.app/FBFacecastTipJarResources/sent.m4a
  • Facebook.app/Frameworks/FBNotOnStartupPathFramework.framework/FBFacecastTipJarResources/sent.m4a
  • Facebook.app/Frameworks/FBNotOnStartupPathFramework.framework/sent.m4a
  • Facebook.app/Frameworks/FBSharedFramework.framework/FBFacecastTipJarResources/sent.m4a
  • Facebook.app/Frameworks/FBSharedFramework.framework/sent.m4a
  • Facebook.app/sent.m4a

Other duplicated resources

There are a bunch of other duplicated resources, amongst them:

  • modelMetaData.bin: 4 x 1 MB
  • schemaMetaData.bin: 4 x 830 KB
  • FBCommunicationSoundKit.bundle: 3 x 741 KB
  • MNSounds.bundle: 3 x 528 KB
  • FBSoundControllerResources: 3 x 500 KB
  • RelaySchema.json: 3 x 319 KB
  • libPhoneNumber.bundle: 3 x 172 KB
  • CACerts.plist: 3 x 168 KB
  • FBFacecastBroadcastKitResources: 3 x 98 KB
  • Montserrat-SemiBold.ttf: 3 x 70 KB
  • ReactMobileConfigMetadata.json: 3 x 33 KB
  • FBEntityCardsModuleResources: 3 x 33 KB
  • add-photo@2x.jpg: 3 x 29 KB
  • FBFacecastWithKitResources: 3 x 20 KB
  • FBNativeArticleEngagementActionsResources: 3 x 20 KB
  • FBFeedbackReactionsKitResources: 3 x 12 KB

These listed resources count for 15.5 MB. By removing the duplicated resources, you could save at least 10 MB.

Duplicated images

The Facebook.app contains 3 assets.car files:

  • Facebook.app/Assets.car: 11.3 MB for 2267 items
  • Facebook.app/Frameworks/FBNotOnStartupPathFramework.framework/Assets.car: 10.3 MB for 2126 items
  • Facebook.app/Frameworks/FBSharedFramework.framework/Assets.car: 9.5 MB for 1972 items

assets

All the 1972 images in FBSharedFramework are inside the main Assets.car and also part of the FBNotOnStartupPathFramework Assets.car. So there are 3 times the same 1972 images taking 3 x 9.5 MB = 28.5 MB.

Keeping a single set of these 1972 images would save 19 MB.

The remaining images in the main Assets.car (2267 - 1972 = 295) and in the FBNotOnStartupPathFramework Assets.car (2126 - 1972 = 154) are unique.

New localizations

The Facebook.app gained 5 new localizations, increasing the app size by 4.2 MB:

  • hi.lproj (1.3 MB)
  • hr.lproj (692 KB)
  • hu.lproj (750 KB)
  • ro.lproj (709 KB)
  • sk.lproj (713 KB)

Also each localization got a new 12 KB file called AdsCountriesConfig.json. This adds 336 KB.

DO_NOT_USE_OR_YOU_WILL_BE_FIRED

When analyzing the version 66.0 I completely missed some amusing Objective-C interfaces, protocols and methods:

@protocol FBDeprecatedAppModule_DO_NOT_USE_OR_YOU_WILL_BE_FIRED

@protocol FBLoginFacilitatingAppModule <FBDeprecatedAppModule_DO_NOT_USE_OR_YOU_WILL_BE_FIRED>

@interface FBTimelineModule : FBNativeAppModule_DO_NOT_USE_OR_YOU_WILL_BE_FIRED

@interface FBNotificationsModule : FBNativeAppModule_DO_NOT_USE_OR_YOU_WILL_BE_FIRED

@interface FBProductionLockoutModule : FBNativeAppModule_DO_NOT_USE_OR_YOU_WILL_BE_FIRED

@interface FBSearchModule : FBNativeAppModule_DO_NOT_USE_OR_YOU_WILL_BE_FIRED

…

__RODATA segment

Although the main binary is much smaller than the App Review limitation, the Facebook.app still uses a __RODATA segment containing sections generally found inside the __TEXT segment. For more information about it, please look at the previous post https://blog.timac.org/2016/1018-analysis-of-the-facebook-app-for-ios.

Want to support this blog? Please check out

DotChart

Conclusion

Between version 66.0 and 87.0, the Facebook.app has been completely restructured. The main -and only- binary has been split in several frameworks.

It appears however that during this process a couple of resources have been unnecessarily duplicated:

  • opticalflow_resource: 3 x 3.6 MB
  • DataFiles: 3 x 1 MB
  • images: 3 x 9.5 MB
  • FBFacecastTipJarResources: 750 KB
  • Other duplicated resources: 15.5 MB

Removing the duplicated resources would save at least 40 MB. This partially explains why the app size has increased by 90 MB.

Update 15.04.2017: Facebook.app for iOS [v. 88.0] cleans up duplicates