CM-QS600: Android: Building from source code

From Compulab Mediawiki
Revision as of 12:56, 19 March 2015 by Nadav (talk | contribs)
Jump to: navigation, search

Prerequisites

The required steps, as outlined 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

Getting Android Source Code

Overview

CompuLab Android package is obtained by applying CompuLab patches on top of Code Aurora Forum's Android package for MSM APQ8064 CDP platform.

Download software packages

Proceed to CM-QS600 Downloads page in order to acquire the following software packages:

  • Qualcomm proprietary libraries
Prebuilt Qualcomm proprietary libraries.
  • CompuLab patches on top of Android for MSM APQ8064
CompuLab patches on top of Android source code tree include, among other, Linux kernel patches, Android device configuration files and firmware binary blobs.

Deploy Android source code repository

Code Aurora Forum base

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

$ mkdir myandroid
$ cd myandroid
$ 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.

Qualcomm proprietary prebuilt libraries

Extract prebuilt Qualcomm proprietary libraries:

$ mkdir -p myandroid/vendor/qcom/proprietary
$ tar -xJf cm-qs600-qcom-proprietary.tar.xz -C myandroid/vendor/qcom/proprietary

CompuLab patch

Apply CompuLab patch:

$ mkdir -p /tmp/sandbox
$ tar -xJf cm-qs600-compulab-patch.tar.xz -C /tmp/sandbox
$ cd myandroid
$ /tmp/sandbox/compulab-patch-apply /tmp/sandbox

Wireless kernel driver

Clone out of tree wireless kernel driver:

$ cd myandroid/external
$ git clone --branch upstream https://github.com/compulab/cm-qs600-compat-wireless.git compat-wireless

Building Android image

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

In case Java version different from the system default, is required by the build system, download the required JDK version, and export path to its root directory:

$ export JAVA_HOME=<full path to JDK>

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

Bring up kernel configuration menu

$ make kernelconfig

Build boot image (kernel + initramfs)

$ make bootimage -j4

Summary

Upon successful build, the output directory ( myandroid/out/target/product/bellatrix ) contains ready to deploy OS partitions represented both as directories with appropriate files and compressed image files ready to deploy on 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

Overview

In normal boot mode, the root of the file system is mounted from RAM-disk, whereas storage device partitions containing system utilities, applications and data are mounted under it.
Root on a physical device, or file system mounted via NFS are also viable options, but are used mainly throughout development stage.
LK bootloader expects a valid boot partition (boot.img) on the eMMC. System, userdata and cache partitions mounting is ruled by fstab file - they can reside on any available storage device.
In case LK does not identify a valid boot partition on the eMMC, it falls back to fastboot mode, where it is possible, along with other options, to load boot.img dynamically from PC workstation.

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

Deploy file system on SD-card

Prepare SD-card

  • GPT-partition SD-card, creating system, cache, userdata partitions.
  • Format each partition with ext4 file system.
  • Copy system partition contents, maintaining proper file permissions:
$ 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

Re-build boot.img with patched fstab

  • Edit device/qcom/bellatrix/fstab.qcom file, in order to override default destination medium device:
  #boot time mount
- /dev/block/platform/msm_sdcc.1/by-name/system         /system      	   ext4    ro,barrier=1                                      wait
+ /dev/block/platform/msm_sdcc.3/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.3/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/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

See Also