Android Repo Mirroring

Been playing with the CyanogenMod port during pto this week (yummy gingerbread goodness!) and got a crash course in building Android from scratch. Due to the rapid development, I ran into a huge issue pretty quickly when having to nuke/resync the various repos for building. The total space required for a full source build is roughly 14 gigs and requires pulling from a massive number of git repos. Android has a tool named ‘repo’ (info) which makes checking em all out in a cohesive manner very easy, however it’s still a prohibitive time sync to have to pull multiple times. Bit of digging and poking at repo gave me the ‘–mirror’ and ‘–reference’ params. Basically this allows you to initialize a local mirror of an android repo and then point subsequent repo pulls to that local copy.

My example (my tld here is ~/android/):

# make the local mirror directory for upstream android
mkdir ~/android/mirror; cd ~/android/mirror
# initialize the repo mirror and sync
repo init -u git://android.git.kernel.org/platform/manifest.git --mirror
repo sync -j40

That will take a while, once it’s done it’s time to create the mirror of CyanogenMod sources:

# make local cyanogenmod mirror directory
mkdir ~/android/cyanogen/; cd ~/android/cyanogen/
# since I'm building for gingerbread, grab that branch
repo init -u git://github.com/CyanogenMod/android.git -b gingerbread --mirror --reference=/path/to/home/android/mirror/
repo sync -j40

This will also take quite some time, note the use of the ‘–reference’ param. This uses my local mirror of the android sources instead of pulling across the network again.

Now I can pull one of the various Captivate repos, using that same ‘–reference’ param (pointed at my local cyanogen mirror) and profit:

# using atinm's repo for Captivate build, just an example at the moment
mkdir ~/android/atinm; cd ~/android/atinm
repo init -u http://github.com/atinm/android.git --reference=/path/to/home/android/cyanogen/

Success!

3 thoughts on “Android Repo Mirroring

  1. How do you tackle scenario where they introduce new repo on the server side? Basically, I mean a new project is created on server but the manifest used by you at time –mirror initialization didn’t had that project.

    So now how do you ensure that new projects are also mirrored?

  2. I haven’t run into that situation, but I also haven’t done builds in quite a while so I couldn’t say for sure. If my memory serves tho you can initiate updates to the mirror which should pull in any updates/new repos.

Leave a Reply