The M1 Pro for Android Engineers
If you are reading this, you have probably already read the myriad of reviews praising it. You probably know that it is astoundingly fast in benchmarks or that it has best-in-class battery life. You probably know that it brought back MagSafe, HDMI port, and SD card reader. But what you might not know is how it stacks up for Android development.
If you don’t like reading, the tl;dr is that it is fantastic. These new MacBooks are unequivocally the new benchmark computer for our industry.
I was fortunate to have a triad of modern computers to benchmark. The three computers used for this test are:
- 2021 14" MacBook Pro — M1 Pro (10 core)— 32gb RAM
- Desktop (Pop_OS!) — 4.2ghz AMD 2950x (16 core) — 64gb RAM
- 2019 16" MacBook Pro — 2.4ghz Intel i9 (8 core)–32gb RAM
To benchmark performance, I used Gradle Profiler on the Tonal app (the one that runs on the Tonal hardware as opposed to our companion app). The Tonal app consists of 161 modules, 175kloc Kotlin, 8kloc Java, and 60kloc XML as measured by cloc. You can read a bit more about our app here.
All Android Studio tests were using Bumblebee Beta 1.
Android Development on Apple Silicon
Throughout this experience, I was pleased to find that it was easy to get everything up and running on Apple Silicon. The developer community has now had a year to update their code and with the introduction of these MacBooks, there will be even more effort into fully supporting Apple Silicon.
Android Studio Bumblebee and above natively supports Apple Silicon. You are given the option to download that version on the Android Studio website.
This version of Android Studio bundles a native JDK. Make sure to set your JAVA_HOME globally to that one. If you would rather not use a bundled JDK, you can use a Zulu JDK. I tested it against the bundled version and found them both to perform similarly.
Android emulators are also supported. However, you can only use arm64 emulator images. You cannot run an armv7 or x86 emulator. There is also no arm/x86 translation like there is on Android 11+ emulators on other platforms. Keep this in mind if either of those is important for your day-to-day work.
median of 10 runs
Here is a Gradle build scan timeline to get a sense for how parallelized our build is. The more “rows” (workers) that are filled in, the more parallelized the build is at that point. Those regions will benefit from multi-core performance while the parts of the build that only utilize a 1 or a small number of workers will benefit from single-core performance.
- M1 Pro: 125 seconds
- 2950x: 112 seconds (10% faster)
- i9: 154 seconds (23% slower)
ABI Change in :core (invalidates all feature modules)
median of 10 runs
- M1 Pro: 33 seconds
- 2950x: 35 seconds (6% slower)
- i9: 50 seconds (52% slower)
ABI Change in a feature module
median of 10 runs
- M1 Pro: 13 seconds
- 2950x: 19 seconds (46% slower)
- i9: 19 seconds (46% slower)
Android Studio Invalidate Caches and Restart
This is supposed to be a real-world test, right?
- M1 Pro: 97 seconds
- 2950x: 195 seconds (101% slower)
- i9: 177 seconds (82% slower)
Numbers were consistent across runs
Android Studio Gradle Sync
- M1 Pro: 15 seconds
- 2950x: 24 seconds (60% slower)
- i9: 23 seconds (53% slower)
Open Android Studio
Time until indexing and project loading completes
- M1 Pro: 16 seconds
- 2950x: 27 seconds (68% slower)
- i9: 23 seconds (43% slower)
Measured quickly panning a large file at 2% zoom with the Chrome dev tools FPS counter.
- M1 Pro: consistently 60–120fps. Never dropped below 60.
- 2950x: unfair comparison — 4k monitor.
- i9: Usually at 60 but often 24–60fps while scrolling new areas.
The results from this test are astounding for the M1 Pro. Unsurprisingly, the M1 Pro is faster than the i9 MacBook in every test. However, what I didn’t expect was for it to also outperform my desktop — sometimes by a significant margin. The results speak for themself.
To test battery life, I used Gradle Profiler to do a clean build of our app on repeat with the screen at 1 notch of brightness and nothing else running. This is far beyond normal usage because it keeps nearly all cores running at capacity continuously.
This stress test took my 16" i9 MacBook from 100% to 0% in 58 minutes. An impressively bad result. In that time, it compiled the app 19 times.
The 14" M1 Pro lasted 2 hours 10 minutes. The 16" should offer roughly 30% more battery life which would bring this up closer to 3 hours.
2–3 hours might sound terrible relative to what you might expect from Apple Silicon, however, keep in mind that this test had nearly all 10 cores running continuously.
My only data point for “normal usage” was during my initial setup. I spent the first three hours installing and setting up apps and doing some quick compilation tests and had 66% battery at the end. This would equate to ~9 hours of moderate usage. This is long enough for a full workday or cross country flight — something that isn’t remotely possible with the existing MacBooks.
Thermal throttling is such an infamous problem with the Intel MacBooks that it deserves its own section. During these battery tests, I had pmset -g thermlog | grep CPU_Speed_Limit running to track whether the CPU was throttling. Unsurprisingly, the i9 was consistently in the 60% range, the case was scalding hot, and the fans were audible from the next room. However, build times remained flat. This wasone of the most surprising results of the test.
Apple Silicon isn’t hooked up to pmset thermlog (thanks Zac Sweers) so I could only measure throttling via its impact on build times. The case was only warm, and the fans were audible but sounded about 10x quieter to my ears and were not on for most of the benchmark. Towards the end of the test in which build times went up by about 50%. I restarted Gradle Profiler and then build times returned to their original values. However, they started to climb again after about 20 builds.
Anecdotally, I did find the i9 MacBook to feel dramatically slower during the benchmark. For example, Google Docs, Figma, and Slack became extremely sluggish. However, I was unable to detect any meaningful difference in performance on the M1 Pro while it was running builds. This is very significant for everyday quality of life and while the M1 builds did slow down occasionally, they were still faster than the i9 in almost every iteration.
- DO NOT use the migration assistant tool, especially not from an Intel mac. I found it frustrating to track which apps were universal and which needed updates. It also completely messed up my homedir permissions. I couldn’t even ls my Downloads folder.
- Plugging in an external monitor is lightning fast. The external monitor doesn’t even flash black when opening and closing the MacBook lid.
- Tasks that used to have slight delays (searching for apps in Spotlight, etc) feel nearly instantaneous now.
- The ProMotion display adds to the perceived speed because actions like clicks and keystrokes can now appear in as little as 8ms as opposed to 16ms on 60hz displays.
- Using Linux for the past year has felt second-class compared to macOS. I had to fall back on Chrome extensions for things like Loom and Todoist. Zoom doesn’t support custom backgrounds or blurring. I had a myriad of audio issues that led to frustrating meeting experiences. Random driver issues would cause major lag in all WebKit applications for weeks at a time with no known solution.
As Apple prepared for its transition to Apple Silicon, it fell behind the curve on its final Intel CPUs. The last Intel MacBooks only included 9th generation CPUs which were notorious for their power and thermal problems. Intel recently announced its 12th generation Adler Lake CPUs and the AMD Ryzen 9 mobile CPUs which significantly outperform the 9th gen Intel CPUs. While we will never see either of these in MacBooks, they will be available in Windows laptops. Looking forward, I expect Apple Silicon’s lead to grow even further but it’s only fair to call out advancements in the x86 world.
I don’t have an M1 Max to compare the M1 Pro to. However, despite its larger cache and memory bandwidth, CPU benchmarks between them are nearly identical (Max vs Pro). Ultimately, the M1 Max was designed for people who are GPU constrained, not CPU constrained and the upgrade is unlikely to be worth it for Android development.
My MacBook is equipped with 32gb RAM. Although it’s possible to get 64gb, I don't think it is necessary for the vast majority of people. I allowed Gradle to use 20gb and clean builds spent less than 3 seconds garbage collecting. Apple Silicon has incredibly fast RAM and SSDs which makes swap space much faster than on previous MacBooks when it is needed.
It’s possible that there would be some performance benefits to upgrading but they would likely be marginal at best.
Thoughts and Conclusions
These new MacBooks truly have it all. They have the best performance you can find anywhere while being capable of delivering that power in a coffee shop or airplane for hours without being plugged in or burning your lap. On top of the numbers and benchmarks above, there is no way to fully encapsulate the fact that this computer just feels fast. Typing, switching slack channels, opening large Coda or Google Docs are a breeze.
If you are a professional engineer who works on a large codebase every day, this laptop is a worthy upgrade from any prior generation. The impact this MacBook will have on your ability to iterate quickly pay for itself in no time.
What else do you want to know? Message me on Twitter if you have any more questions!