在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.
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啟動介面呢