树莓派3移植安卓系统指导

前言:树莓派3安卓原生系统的移植主要分成两大步骤:1、Linux和安卓镜像文件的编译;2、就是镜像文件的烧写。由于之前已经编译好了Linux和安卓镜像文件了(资源包附在文章最后百度网盘链接),所以这里就先从怎么烧写系统开始讲起。第二部分再介绍如何去编译Linux内核和安卓镜像。

一、系统镜像文件的烧写
在烧写镜像之前我们首先要对用作树莓派的系统卡进行分区和格式化处理。Linux环境下,可以用fdisk工具进行分区和格式化处理。但是这里为了方便一点我推荐用一款图形化工具软件Gparted(Windows下应该也有该软件)。
首先使用sudo apt-get install gparted下载安装该软件。安装完成后,在任意终端运行命令gparted启动该软件。大概的界面应该是这样的:
树莓派3移植安卓系统指导_第1张图片

做系统大概有这么几个步骤:
1.1、我们要将树莓派的系统卡按照图1分成四个区,分别为boot、system、cache、data。
1.2、将卡分区好后,需要将本文档路径下的android文件夹下system.img这个文件写入到第二个(system)分区里面。具体操作为:在Linux环境下运行命令dd if=system.img of=/dev/ bs=1M;简单的解释一下这条命令:dd就是写盘的工具命令,if后面的就是输入文件(input file),of就是输出文件,/dev/同理可知就是文件输出的路径啦,如果你不确定你要写的分区叫什么名字,那么你可以用fdisk -l的命令来看一下。
1.3、文件写成功后,然后再将本文档路径下的android文件夹下除system.img外的所有文件都复制到第一个(boot)分区(注意这里是复制而不是dd。具体方法你可以将第一个分区挂载到Linux系统的某个文件下再进行操作)
完成了以上三个步骤后,将做好的sd卡插到树莓派3,上电后就启动成功了。

1.4、adb连接测试
系统启动后跟我想象的不一样,没有熟悉的图像界面,但是能确认它已经跑起来了。我们用adb调试工具来连接测试一下。插上网线,获取到树莓派的ip在Linux下执行adb connect 就可以与树莓派连接上了。再执行adb devices就可以看到当前连接的设备。执行adb shell就可进入安卓的文件系统了。
关于adb调试工具的使用可以参考:https://developer.android.google.cn/studio/command-line/adb.html

二、Linux内核和安卓镜像的编译
1、编译环境要求:
硬件配置:硬盘容量至少100G;内存8G;cpu:8核心
系统环境:Ubuntu16;需要提前安装git、repo、openjdk-8-jdk等工具
2、下载Linux内核源码和安卓源码
2.1:更换安卓源码源。运行vim /usr/bin/repo找到REPO_URL并替换成REPO_URL = ‘https://gerrit-google.tuna.tsinghua.edu.cn/git-repo‘保存
2.2:在Linux的/根目录下建立工作目录Android,在建立好的工作目录文件夹下运行repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-7.1.2_r4初始化我们的工作目录,标黄的就是我们要编译的安卓版本号,我们可以根据需要选定特定的版本。
2.3:
git clone https://github.com/android-rpi/local_manifests .repo/local_manifests
2.4:执行repo sync,下载源码文件。具体下载时间看网速,最终下载完成估计有30~40G的文件。
以上过程中,如果出现错误,一般会有提示信息,按照提示一般就可以解决。
3、编译linux内核
3.1:配置交叉编译环境。在raspberrypi的github官方主页的tools仓库有交叉编译环境,地址如下 https://github.com/raspberrypi/tools/tree/master/arm-bcm2708
树莓派3移植安卓系统指导_第2张图片

可以看到上图在arm-bcm2708下面有5个文件夹分别放着不同的平台编译环境下的交叉编译工具链。其中gcc-linaro-arm-linux-gnueabihf-raspbian文件夹是32位的操作系统的工具链,gcc-linaro-arm-linux-gnueabihf-raspbian-x64文件夹是64位操作系统的工具链。
我们先将这个文件夹下载下来放在Linux根目录下的/opt文件夹下面(当然也可以放在别的地方,不管习惯上一般会放在这里)。接下来就是配置交叉编译环境了,执行命令:Vim /etc/profile打开该文件,在最底部追加:
export PATH=”$PATH:/opt/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin”
注意红色字体的地方,刚才我们说了,这个是64位操作系统的交叉编译工具链的路径。如果你的平台是32位的操作系统,那么你要选择的是gcc-linaro-arm-linux-gnueabihf-raspbian这个文件夹。否则到时候编译内核源码时会出错。
修改完成后在终端上运行source /etc/profile使其生效。接下来就可以编译内核了。

3.2:编译Linux内核镜像。依次执行下列命令:

$ ARCH=arm scripts/kconfig/merge_config.sh arch/arm/configs/bcm2709_defconfig android/configs/android-base.cfg android/configs/android-recommended.cfg

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

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

稍微解释一下这几条命令的意思:1.进入内核源码的目录;2.执行脚本自动生成.config文件;3.编译内核镜像;4.生成树莓派的设备树文件。
这里有个坑!!!提示一下,在3.编译内核镜像时。由于当前的编译器不支持-fstack-protector这个编译选项,所以这里需要修改一下Makefile文件。进入Linux内核源码顶层目录(kernel/rpi)vim打开Makefile文件找到667和674行将ifdef CONFIG_CC_STACKPROTECTOR_REGULAR改成ifndef CONFIG_CC_STACKPROTECTOR_REGULAR保存退出,再make。
编译完Linux内核镜像之后就可以编译安卓镜像了。

4、编译安卓镜像。进入安卓工作目录的顶层,执行
sourcebuild/envsetup.sh lunch rpi3-eng //也可以直接执行lunch不带参数,那样会弹出所有的target供选择
$ make -j4
如果顺利的话,几个钟头的时间你就会看到诸如下面的画面,安卓镜像就编译成功了。那么第一部分的系统镜像文件的烧写所需要的文件都在哪里呢?分别如下:
device/brcm/rpi3/boot/*下的所有文件:bootcode.bin,cmdline.txt,config.txt,fixup.dat,start.elf

kernel/rpi/arch/arm/boot/zImage
kernel/rpi/arch/arm/boot/dts/bcm2710-rpi-3-b.dtb
kernel/rpi/arch/arm/boot/dts/overlays/vc4-kms-v3d.dtbo
out/target/product/rpi3/ramdisk.img
out/target/product/rpi3/system.img

5、已知的错误
编译的时候可能会有如下错误,下面就列举一下,以提供参考。
错误1:提示/android/prebuilts/misc/linux-x86/bison/bison没有该文件
原因:这是因为在64位的操作系统中编译,而下载的源码文件是32位系统的文件,所以造成文件不可用。
解决方法:
1、单独make目标bison,make成功后,在android/out/host/linux-x86/bin下找到bison文件并将改文件复制到/android/prebuilts/misc/linux-x86/bison/
2、然后再将android/out/host/linux-x86/bin下的文件libc++.so复制到当前系统/usr/lib下,再在终端执行ldconfig;
3、apt-get install m4
4、make clean后再重新make

错误2:提示Try increasing heap size with Java option ‘-Xmx’
解决方法:
1、停止Server:jack-admin stop-server。
2、添加-Xmx4096m或者-Xmx4g.打开prebuilts/sdk/tools/jack-admin文件,修改29行 JACK_SERVER_VM_ARGUMENTS=”${JACK_SERVER_VM_ARGUMEN

TS:=-Dfile.encoding=UTF-8 -XX:+TieredCompilation}”,

改为JACK_SERVER_VM_ARGUMENTS=”-Xmx2g
-Dfile.encoding=UTF-8 -XX:+TieredCompilation”。
注意:这里不再使用${parameter:=default}的语法,直接给JACK_SERVER_VM_ARGUMENTS赋值。

3、重新编译。

错误3:Communication error with Jack server
解决方法:执行jack-admin start-server

TIPS:
1、如果遇到错误没有提示,没有解决方案时,你不妨提高一下你的虚拟机的性能。例如CPU、内存、硬盘容量等。
2、在编译安卓的内核文件之前最后先配置一下这个文件。在目录/android/device/brcm/rpi3/BoardConfig.mk文件中的尾部追加
ANDROID_JACK_VM_ARGS := -Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4096m; 表示设置jack的缓存空间为4096m
NINJA := false; 表示不是用NINJA工具链编译
3、如果烧完系统后屏幕显示不对,可以参考一下这个链接修改一下有关显示部分的代码。
https://github.com/android-rpi/device_brcm_rpi3/wiki#use-hal_pixel_format_bgra_8888
4、参考链接:
http://www.elicec.com/2017/01/raspberry_pi2_port_android/
https://github.com/android-rpi/device_brcm_rpi3
http://blog.csdn.net/u013553529/article/details/54869266
https://source.android.com/source/
https://source.android.com/source/building
http://pan.baidu.com/s/1i5ig6zFhttp://pan.baidu.com/s/1i5ig6zF(Android资源包)

你可能感兴趣的:(树莓派3,Android,编译内核)