Gary Sims / Android Authority
One of the key features of Android is that it is open source. The source code for the full operating system, including the kernel, UI, libraries, and key apps, is available for free. This means that anyone (with the right technical skills) can build Android from source and flash it onto a compatible device. This flexibility has allowed various groups — some commercial and some hobbyist — to develop alternative distributions of Android. These are commonly referred to as custom ROMs, but a better name would be custom firmware.
Since all the necessary building blocks are available, maybe you have wondered how hard it is t
o build your own custom ROM, your personalized version of Android! It is indeed possible; read on to find out more.
Warning
Before we dive into the murky world of building custom versions of Android, we need to pause and assess the enormity of the task ahead, while keeping our expectations in check. If you have absolutely no coding experience, zero Linux experience, or no idea what a Makefile is, this isn’t for you.
Android is a complete operating system. It is complex and contains many different subsystems. Creating an operating system as complex and useful as Android didn’t happen overnight. This means that any customization you wish to perform will have to start small. Creating an alternative Android distribution that is radically different will take many hours of hard work and dedication.
If you are familiar with writing code and know a bit about Makefiles and compilers, then making your own custom Android ROM can be a rewarding experience.
Prerequisites
Theoretically, it would be possible to build a custom Android firmware for any computing device capable of running a modern operating system. However, to make life easy, we will limit ourselves to building Android for Google’s Pixel smartphones.
To build Android, you will need access to, and familiarity with, Linux. You will be using the terminal a lot, and you need to be confident with shell commands. You might be able to use a Linux virtual machine, but I would recommend using a dedicated PC.
You will need at least 400GB of disk space and no less than 16GB of RAM, but 32GB or 64GB is recommended. You will need a modern 64-bit CPU with multiple cores. Google says that it takes about five times longer to build Android on a 6-core machine with 64GB of RAM than to build it on a 72-core machine with a similar RAM. In my testing, I foolishly tried to build it on a dual-core machine with a CPU from 10 years ago. It took about 24 hours!
Learn patience. Building Android isn’t quick. Synchronizing the source repository can take hours (depending on your Internet connection speed). Also, a full clean build will take several hours to complete. Even after making a minor change, you might need to wait 10 to 20 minutes for a build. It all depends on your hardware. Don’t expect to have your new version of Android up and running in just a few moments.
The Android Open Source Project version does not include any Google services. So things like Google Play, YouTube, Gmail, and Chrome will be missing. There are ways to flash those “gapps” onto your custom firmware, but I will leave you to find out how to do that. Hint: Search for “install gapps.”
Where to start when build your own Android ROM
Gary Sims / Android Authority
The basic process for building a custom ROM is this. Download and build Android from the Android Open Source Project, then modify the source code to get your custom version. Simple.
Google provides some excellent documentation about building AOSP. You need to read it, re-read it, and then read it again. Don’t jump any steps, and don’t assume you know what it will say next and skim over parts.
I won’t repeat verbatim what is in the build instructions, but the general steps are:
- Set up a build environment — including installing the correct development tools.
- Grab the source — this is done using the “Repo” tool.
- Obtain proprietary binaries — some of the drivers are only released in binary form.
- Choose a target — using the “lunch” tool.
- Start the build — using “m.”
- Flash the build onto your device — using ADB and fastboot.
Tips and tricks for the custom ROM build process
That all sounds easy, but there are a few gotchas along the way. Here are some notes I made during the process that you might find helpful:
Set up a build environment — Ubuntu 18.04 is the recommended build OS. You will need to install various development-related packages like gcc, git, python, etc. The master branch of Android in AOSP comes with a pre-built version of OpenJDK, so no additional installation is required. However, older versions of Android require a separate installation of the JDK. You should use OpenJDK. Full instructions on setting up your build environment can be found here.
Python3 — Python 2 support is deprecated. To build AOSP, you need to use Python3. If you get Python missing errors, this trick should fix it. It creates a soft link between python and the python3 binary:
Code
sudo ln -s /usr/bin/python3 /usr/bin/python
Grab the source — This is an easy step, but it can take a long time, as in hours. Such a large download only happens once; further syncing with the main source tree will be incremental. To speed up the download, use the -c (current branch) flag and the -jthreadcount flag like this:
Code
repo sync -c -j8
Obtain proprietary binaries — The binaries come as self-extracting scripts. Uncompress the archives and run the self-extracting script from the root of the source tree. The binaries will be installed in the vendor/ directory. Note that there are two sets of binaries for many Pixel devices, one from Google and another from Qualcomm. You need both. Make sure you download the version of the binaries that corresponds with the version of AOSP you are building.
Choose a target — Look at this list of Pixel devices and pick the relevant build name. For example, if you have a Pixel 5, you would use aosp_redfin-userdebug.
Gary Sims / Android Authority
Start the build — You start the build using m. The build system can run multiple jobs simultaneously with the -jN argument. If you don’t use the -j argument, then the build system will automatically select an optimal task count for your system.
Flash the build onto your device — You will need Google’s platform tools to flash your build onto a physical device. You can use the Android SDK Platform-Tools from Google, or alternatively, you will find adb and fastboot in ./out/host/linux-x86/bin.
Flash it
Gary Sims / Android Authority
Once you have successfully flashed it onto your device using “fastboot flashall -w,” you will see a vanilla version of AOSP. There are no Google services, no Play Store, and only a few core apps. This is the bare bones of Android.
However, congratulations are in order. You have managed to build Android from its source code and flash it onto a device. That is no mean feat.
Customization
Now that you have Android up and running, you can start to customize it and make your own specialist ROM. This is actually where things get hard. You are about to tinker with the guts of the Android operating system, and the problem is that Android is huge. My working directory is 350+GB of data, including the source code, the graphics, the compiled binaries, and the tools. That is a lot of stuff.
So, start simple. Here are two simple customizations that will get you going and start you on the path to being an Android firmware hacker.
Customize the messaging app
A relatively easy customization is to change one of the pre-built apps. If you were to develop a full alternative Android distribution, modifying or replacing some of the core apps would be a given. In this case, we will just tweak it, but the principles remain the same for more complex changes and revisions.
The core apps are found in the directory ./packages/apps/, and we are interested in the Messaging app in ./packages/apps/Messaging/. Drill down through res/values/ and edit strings.xml. You can edit it with your favorite GUI editor or if you want to stay on the command line, then use vi or nano.
strings.xml contains all the English text for the app. If you are using another language, you will need to find the relevant XML file in the res/ directory.
Find the place in strings.xml where conversation_list_empty_text is defined. The string part starts with “Once you start…”. Replace it with your own string, something like, “Start a new conversation and you’ll see it listed here.”
Save the file and start another build using the m command. Once the build has finished, flash it onto your device and reboot. Start the Messaging app and look for the new text. Obviously, this is a simple modification, but the potential is there to modify any of the default apps in whatever way you please.
Gary Sims / Android Authority
More customization
Any self-respecting custom Android distribution must include some information about the ROM itself. To do this, we can alter the system properties. Find the sysprop.mk file in the build/core/ directory. Edit it and find the line that defines BUILD_DESC. For a simple alteration, put AOSP++ at the beginning of the line after the :=, like this:
Code
BUILD_DESC := AOSP++ $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT) $(PLATFORM_VERSION) $(BUILD_ID) $(BUILD_NUMBER_FROM_FILE) $(BUILD_VERSION_TAGS)
Save the file, rebuild and re-flash the firmware on your device. Once you reboot, go to Settings->About Phone and scroll to the bottom:
Gary Sims / Android Authority
FAQ
Gary Sims / Android Authority
Since you are building the ROM, then you are able to confirm its contents. This means that it is guaranteed to contain no malicious code or spyware. But, it is worth noting that your data isn’t “safe” when you install a custom ROM, even one you built yourself, as it will likely be erased during the flashing process. There is also the danger of “bricking” your device.
If you follow the steps in this article you will have created your own custom ROM for Android, based on AOSP. However, the hard part is the actual customization. You should consider including other apps, adding ringtones, including custom wallpapers, and even tweaking the Linux kernel
When you buy a smartphone it comes with Android preinstalled from the manufacturer. This is known as the ROM, or better still the firmware. Third-party software built to replace the default firmware is known as a custom ROM.
AOSP stands for the Android Open Source Project. It is the open-source foundation and source code that makes up Android. The biggest difference is that normal Android also includes Google Services like the Play Store, Gmail, YouTube, etc.
AOSP is an open-source basis for Android. It is maintained by Google. AOSP is free to use and alter under its open-source license. Manufacturers like Amazon and Huawei are free to tweak the project for their own purposes and have developed their own spin-offs, including the multi-purpose Fire OS. AOSP can’t provide kernel device drivers for every hardware configuration out there. It also doesn’t come with Google’s software like the Google Play Store or Google’s services that enable features like mobile payments, voice commands, and cloud storage.
The two modifications I have made are very basic, and there are loads more things that could be done, including pre-installing other apps, adding ringtones and wallpapers, and tweaking the kernel. However, I hope this has given you a taste of what is possible or at least given you an idea about how to build a custom AOSP ROM and tinker with the innards of Android.