该项目主要是是介绍如何在飞腾开发板FT2004和D2000上面,移植Android11 aosp和自研GPU X100启动方案!如果您对该项目感兴趣的话,让我们一起来愉快的开启飞腾芯片运行Android系统之旅!
万事开头难,不过木有关系,千里之行始于足下吗!让我们先从最最简单的搭建Android aosp编译开发环境为起点,来开始我们的Android系统启动之旅!
当然这个只是最低配置的要求,机器性能肯定是多多益善。配置越高,编译速度越快!而且强烈建议不要使用虚拟机安装ubuntu,而是直接安装ubuntu系统。不要问为什么,因为虚拟机跑ubuntu的效率太低,编译起来那酸爽,你懂的!
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
vi ~/bin/repo
REPO_URL = 'https://gerrit.googlesource.com/git-repo'
改为
REPO_URL = 'https://gerrit-google.tuna.tsinghua.edu.cn/git-repo'
sudo apt-get install openjdk-8-jdk
构建Android编译需要依赖的库非常多,如下都是我们需要安装下载的库:
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
sudo apt-get install libncurses5
如果在安装依赖库时遇到libesd0-dev 安装不成功,出现如下的错误信息
E: 无法定位软件包 libesd0-dev
sudo vim /etc/apt/sources.list //在行尾添加如下两行的内容
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
sudo apt-get update && sudo apt-get install libesd0-dev
将默认python版本指定位python2 ,执行如下命令
ln -s /usr/bin/python2 /usr/bin/python
经过前面的一顿操作,我们Android的开发环境已经构建OK了(Android源码下载环境和编译环境),此时我们可以进行下载Android aosp源码的步骤了。
mkdir android_source
cd android_source
执行如下命令:
wget -c -t 0 --user-agent="Mozilla" https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
tar xvf aosp-latest.tar
cd aosp
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-11.0.0_r37
repo sync
下载完成后的目录结构如下:
温馨提示:
1.此处我们通过wget下载的是清华打包好的源,由于地域或者网络因素可能下载会很慢而且可能wget会异常退出,这个建议开发者最好是最清晨或者网络比较空闲的时候下载
2.如果使用清华的源下载的速度非常慢的话,建议开发者可以切换到中科大的源进行先关的操作,具体可以详见博客使用清华或中科大AOSP源镜像下载Android源码和中科大AOSP 镜像使用帮助。
妈啊,不容易啊到这里,我们Android的编译环境和aosp源码也都已经下载OK了。是时候和入飞腾的相关源码了!
这里强烈建议朋友们,不要将飞腾对Android源码修改部分下载到前面Android aosp仓库的根目录下面,最后是和Android根目录平级的一个目录。
开始下载,执行clone命令:
tangkw@dell-PowerEdge-R740xd:~/android_source$ git clone https://gitee.com/phytium_embedded/phytium-android11-device.git
正克隆到 'phytium-android11-device'...
remote: Enumerating objects: 12281, done.
remote: Counting objects: 100% (12281/12281), done.
remote: Compressing objects: 100% (8432/8432), done.
remote: Total 12281 (delta 2878), reused 12270 (delta 2876), pack-reused 0
接收对象中: 100% (12281/12281), 237.84 MiB | 6.36 MiB/s, 完成.
处理 delta 中: 100% (2878/2878), 完成.
正在更新文件: 100% (10311/10311), 完成.
执行完成之后,飞腾部分Android源码下载ok,这里我通过命令查看下:
tangkw@dell-PowerEdge-R740xd:~/android_source$ ls
aosp phytium-android11-device
tangkw@dell-PowerEdge-R740xd:~/android_source$ tree -L 1 phytium-android11-device/
phytium-android11-device/
├── device_phytium_ft2004
├── external_alsa-lib
├── external_alsa-utils
├── external_shaderc
├── external_toybox
├── hardware_interfaces
├── hardware_libaudio
├── hardware_libcamera
├── phytium_env.sh
├── LICENSE
├── README.md
├── system_core
└── phytium_android11_patch
飞腾android相关源码下载完毕之后,我们就可以执行和入代码呢,我们可以执行如下的操作:
tangkw@dell-PowerEdge-R740xd:~/android_source$ cd phytium-android11-device/
tangkw@dell-PowerEdge-R740xd:~/android_source/phytium-android11-device$ chmod a+x phytium_env.sh
tangkw@dell-PowerEdge-R740xd:~/android_source/phytium-android11-device$ ./phytium_env.sh /home/tangkw/android_source/aosp
THE ANDROID_PATH_ROOT /home/tangkw/android_source/aosp
#### sync phytium env start! ####
#### sync system_core ####
#### sync system_core end ####
#### sync device_phytium_ft2004 ####
#### sync device_phytium_ft2004 end ####
#### sync hardware_libaudio ####
#### sync hardware_libaudio end ####
#### sync hardware_libcamera ####
#### sync hardware_libcamera end ####
#### sync hardware_interfaces ####
#### sync hardware_interfaces end ####
#### sync external_alsa-lib ####
#### sync external_alsa-lib end ####
#### sync external_alsa-utils ####
#### sync external_alsa-utils end ####
#### sync external_shaderc ####
#### sync external_shaderc end ####
#### sync external_toybox ####
#### sync external_toybox end ####
#### apply patch ####
#### apply patch end ####
#### sync phytium end! ####
这里我们需要对上述脚本传入一个参数,即前面我们下载好之后的aosp源码路径。
执行到这里,万事俱备只欠东风了。我们可以开始最终的Android源码编译和构建了。这里我们分为如下两部分进行:
进入前面aosp的根目录执行,如下命令:
tangkw@dell-PowerEdge-R740xd:~/android_source/aosp$
tangkw@dell-PowerEdge-R740xd:~/android_source/aosp$ source build/envsetup.sh && lunch 41
============================================
PLATFORM_VERSION_CODENAME=REL
PLATFORM_VERSION=11
TARGET_PRODUCT=ft2004
TARGET_BUILD_VARIANT=userdebug
TARGET_BUILD_TYPE=release
TARGET_ARCH=arm64
TARGET_ARCH_VARIANT=armv8-a
TARGET_CPU_VARIANT=generic
TARGET_2ND_ARCH=arm
TARGET_2ND_ARCH_VARIANT=armv8-a
TARGET_2ND_CPU_VARIANT=generic
HOST_ARCH=x86_64
HOST_2ND_ARCH=x86
HOST_OS=linux
HOST_OS_EXTRA=Linux-5.13.0-27-generic-x86_64-Ubuntu-20.04.3-LTS
HOST_CROSS_OS=windows
HOST_CROSS_ARCH=x86
HOST_CROSS_2ND_ARCH=x86_64
HOST_BUILD_TYPE=release
BUILD_ID=RQ2A.210505.003
OUT_DIR=out
PRODUCT_SOONG_NAMESPACES=device/generic/goldfish device/generic/goldfish-opengl
============================================
tangkw@dell-PowerEdge-R740xd:~/android_source/aosp$ make
温馨提示:
1.在开发阶段我们可以选择userdebug工程,实际生产或者测试相关性能的时候强烈建议切到user模式
2.当我们从userdebug切到user模式进行相关烧录的时候,注意一定要对userdata分区进行相关清除工作(格式化或者直接删除掉该分区相关的内容),否则Android系统会启动异常
开始编译过程,这里j后面的数字依据cpu的核数调整。第一次编译很耗时,Intel I5-9500 6核
4线程CPU编译时间为5小时左右(当然线程数越多越好,但是如果编译服务器不够强大,那么开几个线程都是假的了)
make -j4
温馨提示:
1.如果编译机器的配置不是特别高,强烈建议编译线程数不要过多,否则编译机器会出现操作迟缓甚至卡死的情况
2.在make的过程中可能会出现稍许错误(这个和个人的编译环境有关,有些情况我们也有可能是不能预知的),这个开发者可以根据实际情况来进行修改从而使编译通过
3.在编译过程中有开发者反馈会出现system分区分配的空间过小,导致编译失败的问题,如果出现这种情况,开发者可以根据实际情况修改device/phytium/ft2004/BoardConfig.mk的配置选项,如下:
编译成功,我们可以到out/target/product/ft2004目录下查看,就会看到编译生成的相关镜像文件。 如下:
通过前面艰苦卓绝的战斗,我们终于构建出来我们想要的各种Android镜像文件了,是时候见证奇迹的时刻了,让我们通过上述镜像来开启我们的Android启动之旅!
首先准备一块SATA硬盘,删除原有分区后,创建4个分区, 这里我们在linux下以伪代码来介绍下fdsik创建相关分区
p1 256MB for BOOT
p2 1920MB for /system : Do fdisk, new primary partition
p3 256MB for /vendor : Do fdisk, new primary partition
p4 remainings for /data, data分区依据硬盘大小,可以分的大一些,应有都会装在这个分区里。
这里我简单的来实际操作一番,如下:
tangkw@tangkw:~$ sudo fdisk /dev/sdb
Welcome to fdisk (util-linux 2.34).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Partition number (1-128, default 1):
First sector (2048-1953525134, default 2048):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-1953525134, default 1953525134): +256M
Created a new partition 1 of type 'Linux filesystem' and of size 256 MiB.
Command (m for help): n
Partition number (2-128, default 2):
First sector (526336-1953525134, default 526336):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (526336-1953525134, default 1953525134): +2G
Created a new partition 2 of type 'Linux filesystem' and of size 2 GiB.
Partition #2 contains a ext4 signature.
Do you want to remove the signature? [Y]es/[N]o: Y
The signature will be removed by a write command.
Command (m for help): n
Partition number (3-128, default 3):
First sector (4720640-1953525134, default 4720640):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (4720640-1953525134, default 1953525134): +256M
Created a new partition 3 of type 'Linux filesystem' and of size 256 MiB.
Command (m for help): n
Partition number (4-128, default 4):
First sector (5244928-1953525134, default 5244928):
Last sector, +/-sectors or +/-size{K,M,G,T,P} (5244928-1953525134, default 1953525134): +20G
Created a new partition 4 of type 'Linux filesystem' and of size 20 GiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
温馨提示:
1.对于fdisk的使用不是很熟悉的,请开发者自行百度或者谷歌。或者通过命令查看帮助选项如下:2.上述分区的大小只是建议,开发者可以根据实际情况来确定每个分区的大小。通常system分区和vendor分区和data分区分大点,预留升级空间。
3.且随着Android版本的sync,可能编译出来的vendor和system分区都会大于上述我们既定的大小,这个开发者可以自行修改不会影响正常的启动,并且对于data分区这个就是多多益善了。
将Boot分区格式化为ext4格式,并设置分区名称,/dev/sdX中的X要依据该盘实际名字修改 ,伪代码如下:
sudo mkfs.ext4 -L boot /dev/sdX1
sudo mkfs.ext4 -L userdata /dev/sdX4
我们将前面前面创建的分区,进行格式化如下:
tangkw@tangkw:~$ sudo mkfs.ext4 -L boot /dev/sdb1
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 65536 4k blocks and 65536 inodes
Filesystem UUID: 3ccd6c98-ef91-4b16-a871-f2775d9f0ada
Superblock backups stored on blocks:
32768
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
tangkw@tangkw:~$ sudo mkfs.ext4 -L userdata /dev/sdb4
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: f0c1ff27-4ceb-4d15-bdbb-c14de2b4360c
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
还是老规矩先使用伪指令演示一下:
sudo dd if=system.img of=/dev/sdX2 bs=1M
sudo dd if=vendor.img of=/dev/sdX3 bs=1M
sync
结合前面我们编译的环境,以及具体的创建的分区,进到out/target/product/ft2004目录下 ,执行如下指令:
tangkw@tangkw:~/hgfs/android_source/aosp/out/target/product/ft2004$ sudo dd if=system.img of=/dev/sdb2 bs=1M
dd: error writing '/dev/sdb2': No space left on device
2049+0 records in
2048+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 184.983 s, 11.6 MB/s
tangkw@tangkw:~/hgfs/android_source/aosp/out/target/product/ft2004$ sudo dd if=vendor.img of=/dev/sdb3 bs=1M
256+0 records in
256+0 records out
268435456 bytes (268 MB, 256 MiB) copied, 25.6534 s, 10.5 MB/s
还是老规矩先使用伪指令演示一下:
sudo cp kernel/arch/arm64/boot/Image to p1:/
sudo cp kernel/arch/arm64/boot/dts/phytium/ft2004-devboard-d4-dsk.dtb p1:/
结合前面我们编译的环境,以及具体的创建的分区,我们来具体烧录:
tangkw@tangkw:~/xxx$ sudo cp arch/arm64/boot/Image /media/tangkw/boot/
tangkw@tangkw:~/xxx$ sudo cp arch/arm64/boot/dts/phytium/ft2004-devboard-d4-dsk.dtb /media/tangkw/boot/
温馨提示:
如果使用的是D2000的开发板,应该选择d2000-devboard-dsk.dtb设备树文件
见证奇迹的时刻就要到了,成功还是失败就在这把操作了。让我们紧跟步伐来执行这最后一套组合拳,步骤如下:
setenv bootargs console=ttyAMA1,115200 earlycon=p1011,0x28001000 root=/dev/ram0 elevator=deadline rootwait rw loglevel=7 androidboot.hardware=ft2004 androidboot.selinux=permissive
ext4load scsi 0:1 0x90100000 ft2004-devboard-d4-dsk.dtb
ext4load scsi 0:1 0x90200000 Image
booti 0x90200000 - 0x90100000
如果不出意外的话,静等片刻就可以看到我们的Android开机动画了,最终进入Android的启动界面。
细心的朋友一定发现了,在前面的文档介绍中,我们介绍了怎么烧录内核和设备树的相关点,却并没有放出内核相关的源码和编译的文档。这个不是文档编写人员的疏漏,勿喷。因为现在内核部分还牵涉到一些核心知识产权的东西,暂时不便开源出来。关于内核源码部分的申请,可以联系该项目的相关维护者。所以这里只能望各位朋友体谅了!
这个项目我们采用的协议是:Apache 2.0 。
各位朋友,如果在使用过程中有遇到相关疑问,可以联系如下的相关维护者,我们将在第一时间为您提供答疑解惑,助您及时解决相关问题。
zhangjianwei@phytium.com.cn
tangkaiwen@phytium.com.cn
gengjuqiang0937@phytium.com.cn
xiayan1086@phytium.com.cn
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。