1. 程式人生 > >在Ubuntu 16.04上為樹莓派(RaspBerry Pi 3)編譯Android 7(Nougat)

在Ubuntu 16.04上為樹莓派(RaspBerry Pi 3)編譯Android 7(Nougat)

1. 環境準備和介紹        

  • 本文章的測試環境如下:

軟體環境:VMware Workstation Pro + Ubuntu 16.04  64 bit,虛擬機器的記憶體配置6GB,4個CPU

硬體環境:RaspBerry Pi3 + 16GB SD卡

測試Android版本:Android-7.1.2_r19

2.下載Android原始碼

  • 2.1 Installing Repo

Repo是一個用於方便管理Android程式碼的一個工具,管理Android使用的多個Git庫。

    • 安裝Repo

mkdir ~/bin
export PATH=$PATH:$HOME/bin

    • 下載Repo

curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo


chmod a+x ~/bin/repo

  • 2.2 Install python-mako

sudo apt-get install python-mako

  • 2.3 Download Android source code
    • Prepare working directory

$ sudo mkdir -p /workspace/raspberry

$cd /workspace/raspberry

    • Download source codes

$repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.2_r19


$ git clone https://github.com/android-rpi/local_manifests .repo/local_manifests
$ repo sync

sync過程會持續非常長的時間,如果網路狀況比較好,大概需要4-5小時。

可以休息一下了,看下下面的下載參考吧。

3. 編譯RPI 3的Android版本

3.1 編譯Android的RPI版本

編譯過程看起來非常簡單,但是編譯的時間會很漫長,而且有可能出錯。

    • Build Kernel

$ cd kernel/rpi
$ ARCH=arm scripts/kconfig/merge_config.sh arch/arm/configs/bcm2709_defconfig kernel/configs/android-base.config kernel/configs/android-recommended.config


$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make zImage
$ ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- make dtbs

    • Build Android

$ source build/envsetup.sh
$ lunch rpi3-eng
$ make ramdisk systemimage

或者

$make-j4/8/16

如果你有足夠的記憶體和CPU,用-j引數可以加速編譯過程,如果記憶體和CPU太少,就不要加引數慢慢等吧。順便看看下面的連結

3.2 編譯中出現的問題

在編譯過程中,遇到了兩種錯誤資訊,都與記憶體配置有關,也就是說要編譯Android 7來耍一下,你需要至少有5GB以上的記憶體。

    • Jack server report failure

在編譯過程中,如果遇到jack-admin報告錯誤,大體如下,說明你的jack-admin配置的記憶體不夠,請參照下面的解決方法修改prebuilts/sdk/tools/jack-admin中對java引數的配置。

3 warnings

[ 34% 16872/49032] host Java: bouncyca...tle-bcpkix-

host_intermediates/classes)

warning: [options] bootstrap class path not set in conjunction with -

source 1.7

Note: Some input files use unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

1 warning

[ 34% 16888/49032] Building with Jack:...l_intermediates/with-

local/classes.dex

FAILED: /bin/bash out/target/common/obj/JAVA_LIBRARIES/core-

all_intermediates/with-local/classes.dex.rsp

Communication error with Jack server (56). Try 'jack-diagnose'

ninja: build stopped: subcommand failed.

build/core/ninja.mk:148: recipe for target 'ninja_wrapper' failed    

make: *** [ninja_wrapper] Error 1

               該問題可以通過如下的修改解決

@ubuntu:/workspace/raspberry/prebuilts/sdk/tools$ diff -Nru jack-admin jack-admin.original 

--- jack-admin2017-08-03 11:46:29.352035527 +0800

+++ jack-admin.original2017-08-08 10:44:56.580124906 +0800

@@ -451,7 +451,7 @@

     if [ "$RUNNING" = 0 ]; then

       echo "Server is already running"

     else

-      JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS-Xmx5120M -cp $LAUNCHER_JAR $LAUNCHER_NAME"

+      JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR $JACK_SERVER_VM_ARGUMENTS cp $LAUNCHER_JAR $LAUNCHER_NAME"

       echo "Launching Jack server" $JACK_SERVER_COMMAND

       (

         trap "" SIGHUP

在我的環境下,用5GB勉強可以工作,低於4.5GB之後該jack-admin問題就會一直報告。如果記憶體足夠,推薦6GB。

    • Allocate Memory failure.
如果你的記憶體不夠大,或者為虛擬機器分配的記憶體過低時,或者在make時用的-j引數過大,都有可能遇到該問題。解決的方法是分配更多的記憶體給Ubuntu,或者降低-j的引數。

4. 準備RPI 3的SD卡

4.1 Partitions of SD card

  p1 512MB for BOOT : Do fdisk : W95 FAT32(LBA) & Bootable, mkfs.vfat

  p2 512MB for /system : Do fdisk, new primary partition

  p3 512MB for /cache  : Do fdisk, mkfs.ext4

  p4 remainings for /data : Do fdisk, mkfs.ext4

 Set volume label for each partition - system, cache, userdata
  : use -L option of mkfs.ext4, e2label command, or -n option of mkfs.vfat

4.2 Install kernel and ramdisk to BOOT partition

cp -rf  device/brcm/rpi3/boot/* /media/xxx/boot/
cp -rf  kernel/rpi/arch/arm/boot/zImage /media/xxx/boot/
cp -rf  kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb /media/xxx/boot/dts
cp -rf  kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo /media/xxx/boot/dts/overlays/vc4-kms-v3d.dtbo
cp -rf  out/target/product/rpi3/ramdisk.img /media/xxx/boot/

4.3 Install filesystem to SYSTEM partition

$ sudo dd if=out/target/product/rpi3/system.img of=/dev/<p2> bs=1M// 我的環境下system分割槽裝置為sdc2

準備完畢,把SD卡插入到你的樹莓派3上,可否看到熟悉的Android啟動介面呢