Game World!

Join A World Of Gamers

Enter your email address:

Delivered by FeedBurner

Followers

Popular Posts

Friday 25 June 2021

What is enable bit code?

 Yesterday I recognized a ton of warnings regarding the parse.com library:

URGENT: all bitcode will be dropped because '[path]/Parse.framework/Parse(PFAnalytics.o)' was built without bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. Note: This will be an error in the future.

I am aware of the fact that I can remove those warning with this answer but am now wondering if it will have any negative impact in regards to AppStore submission and / or actual performance of my app.

Xcode informs you regarding bitcode

Activating this setting indicates that the target or project should generate bitcode during compilation for platforms and architectures which support it. For Archive builds, bitcode will be generated in the linked binary for submission to the app store. For other builds, the compiler and linker will check whether the code complies with the requirements for bitcode generation, but will not generate actual bitcode. [ENABLE_BITCODE]

But I am not getting any really useful information out of this text.

  • Can I use the linked answer to circumvent the issue without any negative impact and without compromising a future AppStore submission?
  • What does the ENABLE_BITCODE actually do, will it be a non-optional requirement in the future?
  • Are there any performance impacts if I enable / disable it?
428
+50
  • What does the ENABLE_BITCODE actually do, will it be a non-optional requirement in the future?

I'm not sure at what level you are looking for an answer at, so let's take a little trip. Some of this you may already know.

When you build your project, Xcode invokes clang for Objective-C targets and swift/swiftc for Swift targets. Both of these compilers compile the app to an intermediate representation (IR), one of these IRs is bitcode. From this IR, a program called LLVM takes over and creates the binaries needed for x86 32 and 64 bit modes (for the simulator) and arm6/arm7/arm7s/arm64 (for the device). Normally, all of these different binaries are lumped together in a single file called a fat binary.

The ENABLE_BITCODE option cuts out this final step. It creates a version of the app with an IR bitcode binary. This has a number of nice features, but one giant drawback: it can't run anywhere. In order to get an app with a bitcode binary to run, the bitcode needs to be recompiled (maybe assembled or transcoded… I'm not sure of the correct verb) into an x86 or ARM binary.

When a bitcode app is submitted to the App Store, Apple will do this final step and create the finished binaries.

Right now, bitcode apps are optional, but history has shown Apple turns optional things into requirements (like 64 bit support). This usually takes a few years, so third party developers (like Parse) have time to update.

  • can I use the above method without any negative impact and without compromising a future appstore submission?

Yes, you can turn off ENABLE_BITCODE and everything will work just like before. Until Apple makes bitcode apps a requirement for the App Store, you will be fine.

  • Are there any performance impacts if I enable / disable it?

There will never be negative performance impacts for enabling it, but internal distribution of an app for testing may get more complicated.

As for positive impacts… well that's complicated.

For distribution in the App Store, Apple will create separate versions of your app for each machine architecture (arm6/arm7/arm7s/arm64) instead of one app with a fat binary. This means the app installed on iOS devices will be smaller.

In addition, when bitcode is recompiled (maybe assembled or transcoded… again, I'm not sure of the correct verb), it is optimized. LLVM is always working on creating new a better optimizations. In theory, the App Store could recreate the separate version of the app in the App Store with each new release of LLVM, so your app could be re-optimized with the latest LLVM technology.

  • 23
    "Apple will create separate versions of your app for each machine architecture (arm6/arm7/arm7s/arm64) instead of one app with a fat binary. This means the app installed on iOS devices will be smaller." That is what Slicing does. This is unrelated to Bitcode. – user102008 Jul 6 '15 at 21:31
  • 13
    "The ENABLE_BITCODE option cuts out this final step." It doesn't cut out any step. All the architecture binaries are still produced. PLUS bitcode information is then added for EACH architecture. See stackoverflow.com/a/31030741/102008 – user102008 Jul 6 '15 at 21:35
  • 7
    See developer.apple.com/library/prerelease/watchos/documentation/… "Slicing is the process of creating and delivering variants of the app bundle for different target devices. A variant contains only the executable architecture and resources that are needed for the target device." – user102008 Jul 7 '15 at 1:27
  • 7
    It is not a true statement that enabling Bitcode will make the app installed on the device smaller compared to when Bitcode is disabled. Nowhere does it say that. – user102008 Jul 7 '15 at 19:22
  • 7
    @onmyway133 Not all vendors provide source. If all the vendor provides is a static lib and header files (or a Framework), then the vendor needs to have their stuff compiled with bitcode enabled. – Jeffery Thomas Aug 28 '15 at 11:19
 
Making an impact that matters
 
68

Make sure to select "All" to find the enable bitcode build settings:

Build settings

36

Bitcode is a new feature of iOS 9

Bitcode is an intermediate representation of a compiled program. Apps you upload to iTunes Connect that contain bitcode will be compiled and linked on the App Store. Including bitcode will allow Apple to re-optimize your app binary in the future without the need to submit a new version of your app to the store.

Note: For iOS apps, bitcode is the default, but optional. If you provide bitcode, all apps and frameworks in the app bundle need to include bitcode. For watchOS apps, bitcode is required

So you should disabled bitcode until all the frameworks of your app have bitcode enabled.

  • 'Re-optimize your app binary in the future' - can you explain a little more? – genaks Jun 2 '16 at 9:05
  • Here it says that: "Bitcode is a new feature of iOS 9" and that "[...] For watchOS apps, bitcode is required [...]". So, what if I'd like to create a WatchOS app under iOS 8? – matteopuc Nov 14 '16 at 14:37
33

Bitcode makes crash reporting harder. Here is a quote from HockeyApp (which also true for any other crash reporting solutions):

When uploading an app to the App Store and leaving the "Bitcode" checkbox enabled, Apple will use that Bitcode build and re-compile it on their end before distributing it to devices. This will result in the binary getting a new UUID and there is an option to download a corresponding dSYM through Xcode.

Note: the answer was edited on Jan 2016 to reflect most recent changes

14

@vj9 thx. I update to xcode 7 . It show me the same error. Build well after set "NO"

enter image description here

set "NO" it works well.

enter image description here

6

From the docs

  • can I use the above method without any negative impact and without compromising a future appstore submission?

Bitcode will allow apple to optimise the app without you having to submit another build. But, you can only enable this feature if all frameworks and apps in the app bundle have this feature enabled. Having it helps, but not having it should not have any negative impact.

  • What does the ENABLE_BITCODE actually do, will it be a non-optional requirement in the future?

For iOS apps, bitcode is the default, but optional. If you provide bitcode, all apps and frameworks in the app bundle need to include bitcode. For watchOS apps, bitcode is required.

  • Are there any performance impacts if I enable / disable it?

The App Store and operating system optimize the installation of iOS and watchOS apps by tailoring app delivery to the capabilities of the user’s particular device, with minimal footprint. This optimization, called app thinning, lets you create apps that use the most device features, occupy minimum disk space, and accommodate future updates that can be applied by Apple. Faster downloads and more space for other apps and content provides a better user experience.

There should not be any performance impacts.

0

Can I use the linked answer to circumvent the issue without any negative impact and without compromising a future AppStore submission?

yes

What does the ENABLE_BITCODE actually do, will it be a non-optional requirement in the future?

ENABLE_BITCODE adds an intermediate representation of your code into binary. For watchOS, tvOS now it is mandatory

Are there any performance impacts if I enable / disable it?

It has an impact on Xcode build and memory footprint when you archive your project

[Bitcode]

Floating Button

Button