Invalid Executable Size – From iTunes Connect


I am uploading my iOS application on iTunes. I am using MonoTouch for compiling my LibGdx Game for iOS. In Android it is hardly 7-8mb. But When I upload on iTunes AppStore then its goes to 78 mb. I dont know why ? Please Let me know.

I have also received this error from Apple.

Dear developer,

We have discovered one or more issues with your recent delivery for “Run Panda Run: Racing”. To process your delivery, the following issues must be corrected:

Invalid Executable Size – The executable size of 72037504 bytes exceeds the maximum allowed size of 60 MB.

Source: Xamarin.ios Questions

Categorised as Uncategorised Tagged , ,


It’s hard to give a definite answer without more details. There’s a lot of things that can affect the size of the applications. Let’s start with the basic.

What you should check:

  • First, ensure that your application is not being build with Don’t link. That will create very big applications since you’ll be AOT’ing nearly the full .NET framework that Xamarin.iOS ships;

  • Second, make sure you’re building for a single architecture (ARMv7). FAT binaries (e.g. ARMv7 and ARMv7s) are build two times and needs twice the space;

  • Third make sure you have not enabled the Debug build (it’s possible to do so in Release build, it’s a checkbox). That will create larger binaries to support debugging;

  • Fourth make sure you’re using the LLVM compiler. It takes more time to compile but it generates better (and smaller) code;

Those initial checks are pretty easy to do and are the most common reasons for getting very large binaries.

To understand where the size come from you need to know how the application are built.

  • The main difference between the Android and iOS version is that JIT’ing (just-in-time compilation) is not allowed on iOS (Apple’s rules).

  • That means the code must be AOT’ed (ahead-of-time compilation) and that process creates much larger executables (because IL is way more compact than native code);

  • If your code is generic-heavy then the final binary can get quite large since it will need to natively compile every generic possibilities (many cases can be shared, but value-types cannot).

What you can do to reduce size:

  • First try to reduce your managed code size. The easy way to do this is the enable the linker on every assemblies, i.e. Link all assemblies in your project options.

Many people think it’s not worth linking their own code – because they know it will be needed at runtime (so the linker cannot remove it) or else they would not have written that code.

That’s half true. The linker might not be able to remove most of your application code but if you’re using 3rd party assemblies they are not likely 100% used. The linker can remove that extra code (and also remove, from the SDK, all the code that is kept to support that unneeded code). The more shared code you have the more the linker can help you.

Less IL code means faster AOT time, which translate to faster builds and smaller final binaires (including the executable size).

Note: there’s a lot of documents and blog entries on how you can control the linker to skip some assemblies, some types or method from being processed/removed.

  • Second try to reduce your native size. If you’re building native libraries then have a second look at them as they will be statically (not dynamically) linked to your final binary (another rule for iOS applications). Some of them might not be worth (feature wise) their weight in your final binary (and there might be lighter alternatives).

Cora Cummerata

Leave a Reply

Your email address will not be published. Required fields are marked *

Still Have Questions?

Our dedicated development team is here for you!

We can help you find answers to your question for as low as 5$.

Contact Us