Upload
david-rosen
View
6
Download
0
Tags:
Embed Size (px)
DESCRIPTION
Presented at the OnAndroidConf, October 22 2013, http://www.onandroidconf.com/sessions.html Abstract: Optimizing the Android build environment to perform at world-class level is a big challenge for many Android device and chipset makers today. Churning through thousands of platform builds per week requires laser-focus on high-performance infrastructure and tooling. If you’re looking at improving your overall engineering and developer productivity, the software build use case is an obvious area to prioritize. This technical talk will focus on the following aspects of the Android platform build: Common Android platform build challenges and opportunities with real-life production references The various Android build use cases and their needs – full integration and release builds, developer incremental builds Evolution of the Android build and codebase with trends and statistics Detailed technical analysis of the Android platform build, highlighting opportunities for improvements Proposed solutions and technical tricks to optimize an Android software build environment
Citation preview
Accelerating the Android Platform Build
David Rosen, Product [email protected]@adr0sen
OnAndroidConf 2013
What’s this Android buzz all about?
2
Qualcomm Reference Design Program<60 days TTM, and pushing for faster
Source: http://www.qualcomm.com/connect/analyst-relations/events/americas-analyst-summit-2012
Android Development LandscapeReal-world challenges at large APAC mobile device maker
Automotive6%
Mobile38%
Consumer electron-ics
18%
In-dus-trial con-trol and au-
toma-tion6%
Med-ical4%
Mili-tary/aerospac
e3%
Other25%
Users of Android by Vertical
Electric Cloud Android/Embedded Survey(Q1 2013)
• Survey• Focused on Android
development & delivery
• Global embedded contacts in Electric Cloud marketing lists
• 350+ respondents• 175+ Android
Android Delivery Process Today
Technical Challenges
• Slow Android Builds• Slow, Complex CTS
Testing• Complex B-T-R Matrix• Custom Testing –
Volume, Complexity
Negative Business Impacts
• Slow Time to Market• Poor Quality of products• Poor productivity of
teams
Less than 1 hour; 22.5%
1-4 hours; 57.5%
4-8 hours; 15.0%
More than 8 hours; 5.0%
Avg. time to execute CTS
Less than 5 minutes; 7.8%
5-20 min-utes; 21.0%
20 minutes - 1 hour; 28.8%
1-4 hours; 27.0%
More than 4 hours; 15.3%
Avg. release build time
Accelerating the Android build
Why look at Android builds?
• Android is everywhere• 68% of global mobile phone market share1
• Explosion of non-phone applications• Automotive (Saab, Renault)• Entertainment (Ouya, Nvidia)• Exercise equipment (NordicTrack)• Rice cookers! (Panasonic)
• Android is everywhere• … and that means thousands of developers building Android
• What if we can make those builds faster?• How would your development process change?• How much more could you achieve?
1 Source: Gartner, February 2013
What is (and is not) covered in this part of the talk?
• Build acceleration techniques fall into two broad categories:• Hardware improvements like faster CPU’s and better disks• Software improvements like smarter build tools and faster compilers
• In general, hardware and software improvements are complimentary• If you want the fastest possible builds, leverage both!
• This talk is about software techniques for build acceleration• Given a fixed hardware platform, how fast can we build Android?• Or, what do you do when you reach the limits of your hardware?
January 2009
July 2009
January 2010
July 2010
January 2011
July 2011
January 2012
July 2012
January 2013
0
2,000,000
4,000,000
6,000,000
8,000,000
10,000,000
12,000,000
14,000,000
16,000,000
18,000,000
Linux Kernel
Android
Mozilla Firefox
Chromium
Webkit
AOSP LOC Evolution
Jan 2009 – Jan 20131
4.0.1 ICS
4.1.1 JB
2.3.4 GB
4.2.2 JB
2.2 Froyo
1 Source: http://www.ohloh.net, http://en.wikipedia.org/wiki/Android_version_history (February 2013)
2.2 2.3.4 4.0.1 4.1.1 4.2.2 00:00
00:14
00:28
00:43
00:57
01:12
01:26
01:40
0
2,000,000
4,000,000
6,000,000
8,000,000
10,000,000
12,000,000
14,000,000
16,000,000
18,000,000
+15%
+123%
+19%+2%
+30%+12%
+17% +2%
Build Time
LOC
AOSP Build Evolution
Android Version Release Date LOC1 LOC Growth %
GNU Make Build Time2
Build TimeGrowth %
2.2 May 2010 8,837,858 - 28m55s -
2.3.4 April 2011 11,492,324 30% 33m10s 15%
4.0.1 October 2011 12,827,330 12% 1h13m54s 123%
4.1.1 July 2012 15,028,331 17% 1h28m11s 19%
4.2.2 February 2013 15,266,8033 2% 1h32m56s 2%
1 http://www.ohloh.net, 2 Builds performed on 8-core 16GB RAM server, 3 LOC data as of December 2012
Common wisdom about Android builds
• I can just…• … add more cores• … use distcc• … use ccache
• “The Android build is as optimized as it can be!”
The common wisdom is wrong.
Sidebar: how much faster is “interesting”?
• Some large mobile device makers run > 50K builds/week• At 15 minutes per build that’s 12,500 hours of build time• A reduction of just one minute would save 800 hours every week
• What about wait time?
• Faster builds = more iterations• Faster builds = higher quality• Faster builds = lower time to market
How fast is GNU make?
• Best time: ~15m• 48-cores• 128GB RAM
Problem: Visibility
• Knowing the end-to-end time is great but not actionable• We need visibility
• Where is the time going?• What are the bottlenecks?• Are there opportunities for improvement?
• How do we get that visibility?• Instrument the build… somehow! strace, echo, hack gmake, or…
• ElectricInsight• Visualization and analysis of builds run with ElectricMake• Let’s pump this build through emake and see how it looks!
Solution: ElectricInsight
What can we see from here?
• An ideal build would look like a tightly packed box• Overall looks almost perfect – well done, Android team!
• But! a couple of things stand out:• Crazy long parse time1
• Gaps at the end of the build, indicative of serializations• Some very long serial chunks at the bottom of graph
• We’ll investigate these issues, but first: what if we just use more cores?
1 emake parsing may be slower than gmake parsing
Longest serial chain
• Best possible runtime is about 15m
Best possible is about 15m
Projected runtime with more cores
What else can we learn?
• Lots of non-compile work in the build - ~25% of total time
Problem: long parse time
• Why do we build?• To transform sources into deliverables (programs, docs, etc).
• Does parsing makefiles transform sources into deliverables?• Nope.
• Parsing makefiles is pure overhead• But you have to tell make what to do somehow• Unless you want to manually invoke the compiler, linker, etc.
Solution: parse avoidance
• What if we don’t parse (every time)?• Makefiles don’t change very often, so why reparse every time?
• Reuse parse results from a previous build, as long as…• Makefiles are unchanged (MD5)• Command-line is unchanged• Environment is unchanged
• How do we do it?• Electric Make already has parse results in a reloadable form, just
need to add cache management• GNU make doesn’t, but could be modified
Parse avoidance impactBuild time reduced to about 13m30s
Problem: serializations
• Gaps in visualization suggest serializations
• Q: How many dependencies are there in the Android build?
• A: More than you think!
Android Dependency Graph
• Dump all makefile rules• 100,000 files/targets• 1,990,628 dependencies
Dependencies in Android
• ~19 dependencies per file: why so many?• Consider a typical build structure:
• Some files will have many dependencies• Most have only a few• What is going on in Android?
lib.a: foo.o bar.ofoo.o: foo.c foo.h util.hbar.o: bar.c bar.h util.h
Superfluous dependencies in Android
• Do we really need all 1.9M dependencies?• The filesystem can tell us!
• Collect a list of files actually used to generate a target• Compare to the list of prerequisites specified in the makefile
• Example:
• Why not run foo.txt and bar.txt in parallel?
foo.txt: echo “Hello” > foo.txt
bar.txt: foo.txtecho “World” > bar.txt
Actual dependencies in Android
• 100,000 files/targets• 288,804 dependencies
Specified vs. Actual dependencies in Android
Specified Actual
Solution: dependency optimization
• Impossible to manually eliminate superfluous dependencies
• Electric Make can prune them automatically• If you use gmake, you can achieve the same effect:
• Remove existing dependency specifications• Generate minimal dependency specifications from emake data• Before:
• After:
$(OBJECTS): %.o: %.cpp $(ALL_HEADERS) $(OTHER_DEPS)$(COMPILE.CC)
$(OBJECTS): %.o: %.cpp$(COMPILE.CC)
foo.o: foo.h util.hbar.o: bar.h util.h generated.h
Dependency optimization impactBuild time reduced to about 12m30s
Problem: long serial jobs
• Long serial jobs prohibits further parallelization• Dominates longest serial chain:
• In Android, Javadoc generation is a performance albatross• Typically a long, monolithic job• Not decomposable/parallelizable, not incremental
• Javadoc generation can be cached• Stash output after running javadoc• Reuse output in future builds if inputs match• Like ccache, but for javadoc
Solution: Javadoc Caching
Carving 4 minutes away from job!
Javadoc Caching impactBuild time reduced to about 9m30s
Summary
• Google has done a great job of optimizing Android builds• But there’s still room for improvement!
• By caching parse results and javadoc output while pruning dependencies, we have shown to carve off 5m+ or ~37% from build
24 26 30 32 34 38 42 46 4800:00
02:24
04:48
07:12
09:36
12:00
14:24
16:48
19:12
21:36
19:3017:45
15:00
15:00
11:55
09:30
Gmake
Emake
Questions?David Rosen, Product [email protected]@adr0senhttp://www.electric-cloud.com/eade