Difference between revisions of "CM-QS600: Android: Building from source code"

From Compulab Mediawiki
Jump to: navigation, search
(New page: === This section is under construction. === Category:Android Category:CM-QS600)
 
(Flash ''boot.img'' onto eMMC)
 
(3 intermediate revisions by one other user not shown)
Line 1: Line 1:
=== This section is under construction. ===
+
= 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.<br/>
 +
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).<br/>
 +
Install required packages, as outlined on [http://source.android.com/source/initializing.html#installing-required-packages-ubuntu-1404  AOSP web-page].<br/>
 +
Install additional packages (not listed on AOSP web-page):
 +
$ sudo apt-get install xz-utils make flex lib32z1 zip curl
 +
Install {{filename|repo}} tool for work with multiple {{filename|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"
 +
 +
{{Note | 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:
 +
<pre>
 +
$ 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
 +
</pre>
 +
 +
== Deploy CompuLab Android package ==
 +
=== Download software package ===
 +
Download CM-QS600 [http://www.compulab.co.il/products/computer-on-modules/cm-qs600/#devres  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 {{filename|~/tmp}} directory.
 +
 +
=== Unpack Qualcomm proprietary prebuilt libraries ===
 +
Extract prebuilt Qualcomm proprietary libraries:
 +
<pre>
 +
$ tar -xJf ~/tmp/cm-qs600-android/development/cm-qs600-qcom-proprietary.tar.xz -C ~/android/vendor/qcom/
 +
</pre>
 +
 +
=== Apply CompuLab patch ===
 +
Apply CompuLab patch with the aid of the provided utility:
 +
<pre>
 +
$ cd ~/android
 +
$ ~/tmp/cm-qs600-android/development/compulab-patch-apply.sh ~/tmp/cm-qs600-android/development/patches
 +
</pre>
 +
 +
 +
 +
= Building Android image =
 +
<pre>
 +
$ cd ~/android
 +
$ export USE_CCACHE=1
 +
$ source build/envsetup.sh
 +
$ choosecombo 1 bellatrix 3
 +
$ make -j4 BUILD_ID=CM-QS600 BUILD_NUMBER=20140901
 +
</pre>
 +
 +
{{note|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:<pre>$ export JAVA_HOME=/path/to/JDK</pre>}}
 +
 +
While the {{cmd|make}} instruction above builds the whole Android image, including all its partitions, it is possible to build {{filename|boot}} partition alone, which is useful for most Android hacking use cases as the {{filename|boot}} partition contains the '''kernel''' and the '''ramfs''' with most of configuration files:
 +
* Bring up kernel configuration menu for adjusting the kernel configuration:<pre>$ make kernelconfig</pre>
 +
* Build boot image (kernel + initramfs):<pre>$ make bootimage -j4</pre>
 +
 +
== Build Summary ==
 +
Upon successful build, the output directory ({{filename|~/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:
 +
{| class="wikitable" border="1" cellspacing="0"
 +
! partition<br/>name
 +
! directory
 +
! image file
 +
! file system<br/>type
 +
! access
 +
! mount point
 +
! default<br/>partition<br/>size [MB]
 +
! designation
 +
! notes
 +
|-
 +
| boot
 +
| root
 +
| boot.img
 +
| style="text-align:center;" | -
 +
| read only
 +
| style="text-align:center;" | -
 +
| style="text-align:center;" | 20
 +
| kernel, ramdisk
 +
| style="text-align:center;" | -
 +
|-
 +
| recovery
 +
| recovery
 +
| recovery.img
 +
| style="text-align:center;" | -
 +
| read only
 +
| style="text-align:center;" | -
 +
| style="text-align:center;" | 20
 +
| alternative to ''boot'' for recovery and upgrade
 +
| currently not in use
 +
|-
 +
| system
 +
| system
 +
| system.img
 +
| style="text-align:center;" | ext4
 +
| read only
 +
| /system
 +
| style="text-align:center;" | 512
 +
| the entire OS:<br/>
 +
Android UI, system applications
 +
| style="text-align:center;" | -
 +
|-
 +
| cache
 +
| cache
 +
| cache.img
 +
| style="text-align:center;" | ext4
 +
| read / write
 +
| /cache
 +
| style="text-align:center;" | 64
 +
| frequently accessed data cache
 +
| style="text-align:center;" | -
 +
|-
 +
| userdata
 +
| data
 +
| userdata.img
 +
| style="text-align:center;" | ext4
 +
| read / write
 +
| /data
 +
| style="text-align:center;" | 2048
 +
| user applications and content
 +
| style="text-align:center;" | -
 +
|-
 +
|}
 +
<br/>
 +
 +
= Deploying Android Image on Target Medium =
 +
The root of Android file system is located on a RAM-disk. Physical storage device partitions, such as {{filename|system}}, {{filename|cache}}, {{filename|userdata}}, are mounted under the root.
 +
These partitions mounting rules are specified in {{filename|/fstab}} file.<br/>
 +
Root on a physical device or on NFS are also viable options. Those options are useful throughout development stage.<br/>
 +
On CM-QS600, LK bootloader expects a valid boot partition ({{filename|boot.img}}) to be present on the eMMC.
 +
In case LK cannot identify a valid boot partition, it falls back to [[Android: Fastboot setup|fastboot mode]].
 +
 +
=== Deploy file system on eMMC ===
 +
* Enter ''fastboot mode''.
 +
* Flash each partition image file to the eMMC with the aid of ''fastboot'' utility:
 +
<pre>
 +
$ fastboot flash boot    boot.img
 +
$ fastboot flash system  system.img
 +
$ fastboot flash cache    cache.img
 +
$ fastboot flash userdata userdata.img
 +
</pre>
 +
 +
{{note|More detailed description of the file system deployment on the eMMC is available on the [[CM-QS600: Android: Getting started#Installation onto eMMC | Getting started]] page.}}
 +
 +
=== Deploy file system on SD-card ===
 +
==== Prepare SD-card ====
 +
* [http://linux.die.net/man/8/gdisk  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 {{filename|system}} partition contents, maintaining proper file permissions:
 +
<pre>
 +
$ 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
 +
</pre>
 +
 +
{{note|The {{parameter|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 {{filename|device/qcom/bellatrix/fstab.qcom}} file, in order to override default destination storage medium:
 +
<pre>
 +
--- 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
 +
</pre>
 +
 +
* Rebuild {{filename|boot.img}}:
 +
<pre>$ make bootimage -j4</pre>
 +
 +
==== Flash ''boot.img'' onto eMMC ====
 +
As pointed out above, ''boot.img'' has to reside on the eMMC.
 +
Flash it via ''fastboot'' utility:
 +
<pre>
 +
$ fastboot flash boot boot.img
 +
</pre>
 +
 +
{{Note|The same considerations are applicable to file system deployment on mSATA drive.}}
 +
 +
= See Also =
 +
* [[CM-QS600: Android: Software package | Software package contents]]
 +
* [https://www.codeaurora.org  CodeAurora Forum website]
 +
* [http://source.android.com/source/building.html  Android|Downloading and Building]
 +
* [http://source.android.com/source/developing.html  Android|Developing with Repo and Git]
 +
* [http://source.android.com/devices/index.html  Android|Subsystems explained]
 +
* [http://www.kandroid.org/online-pdk/guide/build_system.html  AOSP|Android Build System]
 +
* [http://blogofterje.wordpress.com/2012/01/14/optimizing-fs-on-sd-card  Some thoughts about partitioning flash storage devices]
  
 
[[Category:Android]]
 
[[Category:Android]]
 
[[Category:CM-QS600]]
 
[[Category:CM-QS600]]

Latest revision as of 13:23, 1 November 2015

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