CM-QS600: Android: Building from source code

From Compulab Mediawiki
Jump to: navigation, search

Overview

The following outlines the procedure necessary to acquire the Android source code and build it for CM-QS600 System-on-Module / Computer-on-Module.
CompuLab Android package is obtained by applying CompuLab patches on top of Code Aurora Forum's Android package for APQ8064 CDP platform.

Prerequisites

The required steps, as described below, were tested on Ubuntu 14.04 (Trusty).
Install required packages, as outlined on AOSP web-page.
Install additional packages (not listed on AOSP web-page):

$ sudo apt-get install xz-utils make flex lib32z1 zip curl

Install repo tool for work with multiple git repositories in the context of Android:

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

Getting Android Source Code

Deploy Code Aurora Forum base

Download the code base from Code Aurora Forum (CAF):

$ mkdir ~/android
$ cd ~/android
$ repo init -u git://codeaurora.org/platform/manifest.git -b release -m LNX.LA.2.7-06310-8064.0.xml --repo-url=git://codeaurora.org/tools/repo.git --repo-branch=caf-stable
$ repo sync -j4
$ repo forall -c "git checkout -b codeaurora"


Admolition note.png The last instruction maintains git branch naming convention, which is useful for clarity, but is not strictly necessary.

Deploy Wireless kernel driver

Clone out of tree wireless kernel driver:

$ cd ~/android/external
$ git clone git://codeaurora.org/platform/external/compat-wireless.git compat-wireless
$ git checkout -b codeaurora LNX.LF.3.2-27500-8x10.1

Deploy CompuLab Android package

Download software package

Download CM-QS600 Android software package in order to access the development resources:

  • Prebuilt Qualcomm proprietary libraries for bluetooth, audio, camera, etc.
  • CompuLab patches on top of Android for APQ8064 including Linux kernel patches, Android device configuration files and firmware binary blobs.

Uncompress the software package to ~/tmp directory.

Unpack Qualcomm proprietary prebuilt libraries

Extract prebuilt Qualcomm proprietary libraries:

$ tar -xJf ~/tmp/cm-qs600-android/development/cm-qs600-qcom-proprietary.tar.xz -C ~/android/vendor/qcom/

Apply CompuLab patch

Apply CompuLab patch with the aid of the provided utility:

$ cd ~/android
$ ~/tmp/cm-qs600-android/development/compulab-patch-apply.sh ~/tmp/cm-qs600-android/development/patches


Building Android image

$ cd ~/android
$ export USE_CCACHE=1
$ source build/envsetup.sh
$ choosecombo 1 bellatrix 3
$ make -j4 BUILD_ID=CM-QS600 BUILD_NUMBER=20140901


Admolition note.png In case Java version required by the build system is different from the system default, download and install the required JDK version, and export path to its root directory:
$ export JAVA_HOME=/path/to/JDK

While the make instruction above builds the whole Android image, including all its partitions, it is possible to build boot partition alone, which is useful for most Android hacking use cases as the boot partition contains the kernel and the ramfs with most of configuration files:

  • Bring up kernel configuration menu for adjusting the kernel configuration:
    $ make kernelconfig
  • Build boot image (kernel + initramfs):
    $ make bootimage -j4

Build Summary

Upon successful build, the output directory (~/android/out/target/product/bellatrix) contains ready to deploy OS partitions represented both as directories with appropriate files and compressed image files ready to deploy onto the eMMC:

partition
name
directory image file file system
type
access mount point default
partition
size [MB]
designation notes
boot root boot.img - read only - 20 kernel, ramdisk -
recovery recovery recovery.img - read only - 20 alternative to boot for recovery and upgrade currently not in use
system system system.img ext4 read only /system 512 the entire OS:

Android UI, system applications

-
cache cache cache.img ext4 read / write /cache 64 frequently accessed data cache -
userdata data userdata.img ext4 read / write /data 2048 user applications and content -


Deploying Android Image on Target Medium

The root of Android file system is located on a RAM-disk. Physical storage device partitions, such as system, cache, userdata, are mounted under the root. These partitions mounting rules are specified in /fstab file.
Root on a physical device or on NFS are also viable options. Those options are useful throughout development stage.
On CM-QS600, LK bootloader expects a valid boot partition (boot.img) to be present on the eMMC. In case LK cannot identify a valid boot partition, it falls back to fastboot mode.

Deploy file system on eMMC

  • Enter fastboot mode.
  • Flash each partition image file to the eMMC with the aid of fastboot utility:
$ fastboot flash boot     boot.img
$ fastboot flash system   system.img
$ fastboot flash cache    cache.img
$ fastboot flash userdata userdata.img


Admolition note.png More detailed description of the file system deployment on the eMMC is available on the Getting started page.

Deploy file system on SD-card

Prepare SD-card

  • GPT-partition SD-card, creating system, cache, userdata partitions, and setting GPT names of the partitions appropriately.
  • Format each partition with ext4 file system.
  • Copy system partition contents, maintaining proper file permissions:
$ export OUT=~/android/out/target/product/bellatrix
$ export SYSTEM=/media/user/system
$ cp -a ${OUT}/system/* ${SYSTEM}/.
$ for f in `find ${SYSTEM}`; do [ -f ${f} ] && chmod go-w ${f}; [ `echo ${f} | awk /\.so$/` ] && chmod a-x ${f}; done


Admolition note.png The SYSTEM location above is specified as it appears in Ubuntu 14.04. It may differ in other Ubuntu versions or distributions.

Re-build boot.img with patched fstab

  • Edit device/qcom/bellatrix/fstab.qcom file, in order to override default destination storage medium:
--- HEAD.fstab.qcom	2015-09-22 11:48:27.958235845 +0300
+++ fstab.qcom	2015-09-22 11:48:36.962236014 +0300
@@ -9,5 +9,5 @@
 #boot time mount
-/dev/block/platform/msm_sdcc.1/by-name/system         /system      	   ext4    ro,barrier=1                                      wait
-/dev/block/platform/msm_sdcc.1/by-name/cache          /cache              ext4    nosuid,nodev,noatime,barrier=1                    wait,check
-/dev/block/platform/msm_sdcc.1/by-name/userdata       /data        	   ext4    nosuid,nodev,noatime,barrier=1,noauto_da_alloc    wait,check,length=1073741824,encryptable=footer
+/dev/block/platform/msm_sdcc.3/by-name/system         /system      	   ext4    ro,barrier=1                                      wait
+/dev/block/platform/msm_sdcc.3/by-name/cache          /cache              ext4    nosuid,nodev,noatime,barrier=1                    wait,check
+/dev/block/platform/msm_sdcc.3/by-name/userdata       /data        	   ext4    nosuid,nodev,noatime,barrier=1,noauto_da_alloc    wait,check,length=1073741824,encryptable=footer
  • Rebuild boot.img:
$ make bootimage -j4

Flash boot.img onto eMMC

As pointed out above, boot.img has to reside on the eMMC. Flash it via fastboot utility:

$ fastboot flash boot boot.img


Admolition note.png The same considerations are applicable to file system deployment on mSATA drive.

See Also