Note: This guide is super old and some steps might be changed, please refer to the community edited guide for a more recent guide.


As you read this guide now I’ll assume you already have a previous knowledge about How to build android from source, so I won’t cover some points with too many basic details. So, let’s start:

What you’ll need:

  • A treble enabled device, basically all devices that come with Android 8.1 out of box support it.
  • A relatively recent 64-bit computer (Linux, OS X, or Windows) with a reasonable amount of RAM and about 100 GB of free storage (more if you enable ccache or build for multiple devices). The less RAM you have, the longer the build will take (aim for 8 GB or more). Using SSDs results in considerably faster build times than traditional hard drives.
  • A USB cable compatible with your device
  • A decent internet connection & reliable electricity
  • Some familiarity with basic Android operation and terminology. It would help if you’ve installed custom ROMs on other devices and are familiar with recovery. It may also be useful to know some basic command line concepts such as cd for “change directory”, the concept of directory hierarchies, that in Linux they are separated by /. etc.

Summary

  1. Installing SDK
  2. Installing build packages
  3. Install the repo command
  4. Configuring git
  5. Turning on caching to speed up build
  6. Building using phhusson’s script
  7. Building using dakkar’s script
  8. Building using the manual way

1. Installing SDK

If you haven’t previously installed adb and fastboot, you can download them from Google. Extract it using:

1unzip platform-tools-latest-linux.zip -d ~

Now we have to add adb and fastboot to our path. Open ~/.profile and add the following:

1# add Android SDK platform tools to path
2if [ -d "$HOME/platform-tools" ] ; then
3    PATH="$HOME/platform-tools:$PATH"
4fi

Then, run this to update your environment.

1source ~/.profile

2. Installing build packages

Several packages are needed to build Android. You can install these using your distribution’s package manager. You’ll need:

1bc bison build-essential curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev
2lib32readline-gplv2-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk3.0-dev
3libxml2 libxml2-utils lzop pngcrush schedtool squashfs-tools xsltproc zip zlib1g-dev openjdk-8-jdk

3. Installing the repo command

Enter the following to download the repo binary and make it executable (runnable):

1mkdir -p ~/bin
2curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
3chmod a+x ~/bin/repo

Put the ~/bin directory in your path of execution

In recent versions of Ubuntu, ~/bin should already be in your PATH. You can check this by opening ~/.profile with a text editor and verifying the following code exists (add it if it is missing):

1# set PATH so it includes user's private bin if it exists
2if [ -d "$HOME/bin" ] ; then
3    PATH="$HOME/bin:$PATH"
4fi

Then, use this to update your environment.

1source ~/.profile

4. Configuring git

You’ll need to set up git identity in order to sync the source, run these commands:

1git config --global user.name "your username"
2git config --global user.email [email protected]

5. Turning on caching to speed up build

You can speed up subsequent builds by running:

1export USE_CCACHE=1
2export CCACHE_COMPRESS=1

And adding that line to your ~/.bashrc file. Then, specify the maximum amount of disk space you want the cache to use by typing this from the top of your Android tree:

1prebuilts/misc/linux-x86/ccache/ccache -M 50G

Where 50G corresponds to 50GB of cache. This needs to be run once. Anywhere from 25GB-100GB will result in very noticeably increased build speeds (for instance, a typical 1hr build time can be reduced to 20min). If you’re only building for one device, 25GB-50GB is fine. If you plan to build for several devices that do not share the same kernel source, aim for 75GB-100GB. This space will be permanently occupied on your drive, so take this into consideration. See more information about ccache on Google’s Android build environment initialization page.

6. Building using phhusson’s script

We can’t deny that @phhusson has made amazing works and countless contributions to Project Treble ROMs development apart from his experimentations is a build script which make build a GSI super simple job. By default, it supports building LineageOS - RR - Carbon. 1- Open your terminal and run:

1git clone https://github.com/phhusson/treble_experimentations

2- To clone and build enter the following command and replace “romname” with lineage|rr|carbon

1mkdir romname; cd romname
2bash ../treble_experimentations/build-rom.sh android-8.1 romname

3- The script will automatically initialize the repository, sync the source, apply patches and start building.

7. Building using dakkar’s script

dakkar’s script is another treble building script, originally made by @Dakkar and improved by contributors on treble experimentations repo. It’s customizable, easy to understand and can build almost all ROMs with simple edits.

1- Open your terminal and run:

1git clone https://github.com/phhusson/treble_experimentations

2- To start the process:

1bash ../treble_experimentations/build-dakkar.sh romname variant

Variants are dash-joined combinations of (in order):

  • processor type
  • “arm” for ARM 32 bit
  • “arm64” for ARM 64 bit
  • A or A/B partition layout (“aonly” or “ab”)
  • GApps selection
  • “vanilla” to not include GApps
  • “gapps” to include opengapps
  • “go” to include gapps go
  • SU selection (“su” or “nosu”) for example:
  • arm-aonly-vanilla-nosu
  • arm64-ab-gapps-su

Click to collapse

Note: check patches when you use these auto scripts, if some patch is broken you’ll have build errors :p

8. Building using the manual way

In simple steps:

  1. Repo init the rom you want to build GSI for.
1mkdir ~/rom &&  cd ~/rom
2repo init -u https://github.com/LineageOS/android.git -b lineage-15.1
  1. Add phh repos to your local_manifest
1git clone https://github.com/phhusson/treble_manifest .repo/local_manifests -b android-8.1

After git clone you need to remove replace.xml if you’re building any rom expect aosp.

phhusson said:

The replace.xml is meant only for AOSP, if you build a custom ROM, remove it, but don’t forget to cherry-pick the patches.

  1. Sync the source
1repo sync -c -j4 --force-sync --no-tags --no-clone-bundle
  1. Modify the source to fix issues in other devices using one of these methods:
1git clone https://github.com/phhusson/treble_patches -b android-8.1

Then apply each path in its project

1patch -p1 < patch
1git fetch repo branch && git cherry-pick commit
  1. Go to the phh device repo and edit the .mk for your ROM (example lineage.mk)
  2. Lunch the build varaint you want (ex. treble_arm64_avN-userdebug) and start the build
1. build/envsetup.sh
2lunch treble_arm64_avN-userdebug
3WITHOUT_CHECK_API=true make -j8 systemimage
  1. If you want to compress the system image after build finishes, go to out/target/product/phh_*/ folder and run
1xz -c system.img > system.img.xz

Credits:

  • @phhusson for all his contributions, without his efforts this can’t be possible.
  • @Dakkar for his build script
  • @fAIyaZ for helping me build my first GSI
  • @sooti for his simplified instruction on phh-treble telegram.
  • @lineageos guys for their wiki

Note: This article was posted originally on XDA Developers forums, you can find it here.