# Phytium-Android-Device **Repository Path**: phytium_embedded/phytium-android-device ## Basic Information - **Project Name**: Phytium-Android-Device - **Description**: 该项目是介绍如何在飞腾平台上,移植启动Android操作系统。当前支持Android 16/13,支持芯片D3000M。 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: android16_d3000m - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 9 - **Forks**: 2 - **Created**: 2025-10-22 - **Last Updated**: 2026-09-09 ## Categories & Tags **Categories**: android-modules **Tags**: None ## README # Phytium D3000M Android16 Device ## 引言 该项目主要是介绍如何在飞腾腾珑D3000M芯片开发板上移植Android16 aosp。 Phytium Android内核仓库地址:https://gitee.com/phytium_embedded/phytium-android-common-kernel ---
## 一.搭建开发环境 万事开头难,不过木有关系,千里之行始于足下!让我们先从最最简单的搭建Android aosp编译开发环境为起点,来开始我们的Android系统启动之旅! #### 1.1 准备一台装有ubuntu20.04及以上系统X86主机,内存最低配置要求16G,建议32G。 >当然这个只是最低配置的要求,机器性能肯定是多多益善。配置越高,编译速度越快!而且强烈建议不要使用虚拟机安装ubuntu,而是直接安装ubuntu系统。不要问为什么,因为虚拟机跑ubuntu的效率太低,编译起来那酸爽,你懂的! #### 1.2 新建一个存放下载脚本文件的目录: ```bash $ mkdir ~/bin $ PATH=~/bin:$PATH ``` #### 1.3 下载repo脚本文件 ```bash $ 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' ``` #### 1.4.安装JDK 8 ```bash $ sudo apt-get install openjdk-8-jdk ``` #### 1.5.安装编译依赖库 构建Android编译需要依赖的库非常多,如下都是我们需要安装下载的库: ```bash $ 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 #### 1.6.修改编译服务器默认python版本 将默认python版本指定位python2 ,执行如下命令 ```bash $ ln -s /usr/bin/python2 /usr/bin/python ``` ---
## 二.Android aosp源代码下载 经过前面的一顿操作,我们Android的开发环境已经构建OK了(Android源码下载环境和编译环境),此时我们可以进行下载Android aosp源码的步骤了。 #### 2.1 创建存放android aosp源码的目录,进到该目录: ```bash $ mkdir AN $ cd AN ``` #### 2.2.下载初始化包 执行如下命令: ```bash wget -c -t 0 https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar tar xvf aosp-latest.tar ``` #### 2.3.解压后看到一个aosp的目录,进到该目录,同步到android16-qpr2-release版本 ```bash cd aosp repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android16-qpr2-release repo sync ``` >温馨提示:
>1.此处我们通过wget下载的是清华打包好的源,由于地域或者网络因素可能下载会很慢而且可能wget会异常退出,这个建议开发者最好是最清晨或者网络比较空闲的时候下载
>2.如果使用清华的源下载的速度非常慢的话,建议开发者可以切换到中科大的源进行先关的操作,具体可以详见博客[使用清华或中科大AOSP源镜像下载Android源码](https://www.kaelli.com/19.html)和[中科大AOSP 镜像使用帮助](https://mirrors.ustc.edu.cn/help/aosp.html)。 ----
## 三. 代码整合 不容易啊到这里,我们Android的编译环境和aosp源码也都已经下载OK了。是时候合入飞腾适配相关的源码了! #### 3.1 下载飞腾相关Android源码部分> 这里强烈建议朋友们,不要将飞腾对Android源码修改部分下载到前面Android aosp仓库的根目录下面,最好是和Android根目录平级的一个目录。 开始下载,执行clone命令: ```bash cd ~/AN ~/AN$ git clone git@gitee.com:phytium_embedded/phytium-android-device.git ~/AN$ cd phytium-android-device ~/AN/phytium-android-device$ git checkout -b android16_d3000m origin/android16_d3000m ``` 执行完成之后,飞腾部分Android源码下载ok,通过命令查看下: ```bash $ tree -L 2 device_phytium/ device_phytium/ ├── common │   ├── audio │   └── patch └── pd2508 ├── AndroidProducts.mk ├── BoardConfig.mk ├── fstab.pd2508 ├── gpu ├── init.pd2508.rc ├── init.pd2508.usb.rc ├── manifest.xml ├── overlay ├── pd2508.mk ├── sepolicy ├── trusty_base.mk ├── uefi_loader └── ueventd.pd2508.rc 8 directories, 9 files ``` #### 3.2 合入飞腾android相关源码 飞腾android相关源码下载完毕之后,要将工程 project代码合入到aosp代码中,执行project中的phytium_env.sh脚本,可以方便快捷的完成,具体如下: ```bash ~/AN/phytium-android-device$ chmod 777 phytium_env.sh ~/AN/phytium-android-device$ ./phytium_env.sh /home/xxx/AN/aosp THE ANDROID_PATH_ROOT /home/xxx/AN/aosp #### sync phytium env start! #### #### sync device_phytium #### #### apply patch #### #### apply patch end #### #### sync phytium end! #### ``` 执行脚本的第一个参数,为aosp源码路径,我们这里就是“/home/xxx/AN/aosp”这个目录。 ## 四.编译Android代码 执行到这里,万事俱备只欠东风了。我们可以开始最终的Android源码编译和构建了。这里我们分为如下两部分进行: #### 4.1 lunch编译项目 进入前面aosp的根目录执行,可以根据需要选择product,目前pd2508有两种可选择的product,如下命令: | 选项 | 适用场景 | 主要特性 | 差别说明 | |------|----------|----------|----------| | `pd2508_pad-bp4a-userdebug` | 平板设备 | 支持传感器、NFC、触摸屏、蓝牙、WLAN、摄像头 | 包含完整的传感器支持(加速度计、陀螺仪等)和NFC功能,适合需要移动感知和近场通信的平板应用场景 | | `pd2508_laptop-bp4a-userdebug` | 笔记本设备 | 支持触摸屏、蓝牙、WLAN、摄像头 | 不包含传感器和NFC支持,适合传统笔记本形态的设备,更注重桌面办公体验 | ```bash ~/AN/aosp$ source build/envsetup.sh ~/AN/aosp$ lunch pd2508_pad-bp4a-userdebug ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=16 TARGET_PRODUCT=pd2508_pad TARGET_BUILD_VARIANT=userdebug 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_OS=linux HOST_OS_EXTRA=Linux-6.8.0-111-generic-x86_64-Ubuntu-22.04.5-LTS HOST_CROSS_OS=windows BUILD_ID=BP4A.251205.006 OUT_DIR=out SOONG_ONLY=false ============================================ ``` ```bash ~/AN/aosp$ source build/envsetup.sh ~/AN/aosp$ lunch pd2508_laptop-bp4a-userdebug ============================================ PLATFORM_VERSION_CODENAME=REL PLATFORM_VERSION=16 TARGET_PRODUCT=pd2508_laptop TARGET_BUILD_VARIANT=userdebug 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_OS=linux HOST_OS_EXTRA=Linux-6.8.0-111-generic-x86_64-Ubuntu-22.04.5-LTS HOST_CROSS_OS=windows BUILD_ID=BP4A.251205.006 OUT_DIR=out SOONG_ONLY=false ============================================ ``` >温馨提示:
>1.在开发阶段我们可以选择userdebug工程,实际生产或者测试相关性能的时候建议切到user模式, lunch pd2508_pad-bp4a-user or lunch pd2508_laptop-bp4a-user
>2.当我们从userdebug切到user模式进行相关烧录的时候,注意一定要对userdata分区进行相关清除工作(格式化或者直接删除掉该分区相关的内容),否则Android系统会启动异常
#### 4.2 开始构建lunch项目 ```bash ~/AN/aosp$ make -j32 ``` 执行make开始编译,这里j后面的数字依据cpu的核数调整。第一次编译很耗时,例如Intel I5-9500 cpu,为6核6线程CPU,编译时间为5小时左右。j后面数字参考make命令关于-j参数的说明,建议定义为cpu核数,最大不要超过核数的2倍。另外,不同的product会生成在不同的out/target/product目录下互不影响,并且共同的代码如framework不需要重新编译;所以,在保证代码一致性并第一次编译成功的情况下可以不需要删除out编译,切换这两种product编译耗时很短。 #### 4.3 查看最终构建结果 编译成功,我们可以到out/target/product目录下查看,会看到编译生成的相关镜像文件。 比如编译的是pd2508的工程,编译生成的文件如下: ```bash ~/AN/aosp$ cd out/target/product/pd2508/ ~/AN/aosp/out/target/product/pd2508$ ls *img ramdisk.img system.img userdata.img vendor.img ``` -----
## 五.编译pd2508内核 通过前面一顿猛如虎的操作,我们完成了Android镜像的编译了,是时候来编译飞腾相关的内核镜像了。大致流程无外乎,下载,配置编译环境,编译! ### 5.1下载pd2508内核 ```bash cd ~/AN/ ~/AN$ git clone git@gitee.com:phytium_embedded/phytium-android-common-kernel.git git checkout -b android16_d3000m origin/android16_d3000m ``` ### 5.2 构建编译环境开始编译 - 系统中安装arm64 gcc交叉编译器 ```bash $ sudo apt install gcc-aarch64-linux-gnu ``` - 配置clang交叉编译环境,google要求用clang编译kernel,aosp工程代码中提供了clang的交叉编译工具链。 路径在 aosp/prebuilts/clang/host/linux-x86/clang-r547379, 按下面方法配置环境并编译kernel,注意这里PATH路径以自己实际目录为准。 ```bash $ export PATH=~/AN/aosp/prebuilts/clang/host/linux-x86/clang-r547379/bin:$PATH $ export MAKE_OPTIONS="ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- CC=clang HOSTCC=clang" $ make ${MAKE_OPTIONS} phytium_gki_defconfig $ make ${MAKE_OPTIONS} -j6 ``` - 如果编译没有报错,将会在kernel目录arch/arm64/boot下,生成kernel的镜像文件Image。 -----
## 六. 镜像烧写 通过前面艰苦卓绝的战斗,我们终于构建出来我们想要的各种Android镜像文件了,是时候见证奇迹的时刻了,让我们通过上述镜像来开启我们的Android启动之旅! #### 6.1 烧录分区初始化 首先准备一块nvme ssd硬盘,删除原有分区后,创建4个分区, 这里我们在linux下以伪代码来介绍下fdisk创建相关分区 ```bash p1 256MB for BOOT p2 1920MB for /system : Do fdisk, new primary partition p3 256MB for /vendor : Do fdisk, new primary partition p4 16MB for /metadata : Do fdisk, new primary partition p5 remainings for /data, data分区依据硬盘大小,可以分的大一些,应用都会装在这个分区里。 ``` >温馨提示:
>1.对于fdisk的使用不是很熟悉的,请开发者自行百度或者谷歌。
>2.上述分区的大小只是建议,开发者可以根据实际情况来确定每个分区的大小。通常system分区和vendor分区和data分区分大点,预留升级空间。
>3.且随着Android版本的sync,可能编译出来的vendor和system分区都会大于上述我们既定的大小,这个开发者可以自行修改不会影响正常的启动,并且对于data分区这个就是多多益善了。 #### 6.2 格式化boot分区和userdata分区 将Boot分区格式化为vfat格式,userdata分区格式化成ext4,/dev/sdX中的X要依据该盘实际名字修改,伪代码如下: ```bash sudo mkfs.vfat -L boot /dev/ sudo mkfs.ext4 -L metadata /dev/ sudo mkfs.ext4 -L userdata /dev/ ``` 还需要给分区设置分区名称,要不在fstab.pd2508中无法通过by-name方式访问。伪代码如下: ```bash sudo parted /dev/sdX 2 "system" sudo parted /dev/sdX 3 "vendor" sudo parted /dev/sdX 4 "metadata" sudo parted /dev/sdX 5 "userdata" ``` #### 6.3 烧写system分区和vendor分区 ```bash ~/AN/aosp/out/target/product/pd2508$ sudo dd if=system.img of=/dev/ bs=1M ~/AN/aosp/out/target/product/pd2508$ sudo dd if=vendor.img of=/dev/ bs=1M sync ``` #### 6.4 拷贝的kernel镜像、ramdisk、EFI引导文件到boot分区 ```bash cd ~ $ mkdir tmp $ sudo mount /dev/ tmp $ sudo cp ~/AN/android_common_kernel_6.6/arch/arm64/boot/Image tmp $ sudo cp ~/AN/aosp/device/phytium/pd2508/uefi_loader/EFI/ tmp -r $ sudo cp ~/AN/aosp/out/target/product/pd2508/ramdisk.img tmp $ sudo umount tmp ``` ---
## 七. 启动设备 见证奇迹的时刻就要到了,成功还是失败就在这把操作了。将烧写好的硬盘和调试串口线,连接到开发板上。上位机的串口调试工具波特率设置为115200,上电开机。 飞腾提供了两种引导启动,UEFI和Uboot启动。D3000M平台默认是UEFI启动。 ### 7.1 UEFI启动 UEFI的启动参数配置在boot分区/EFI/BOOT/grub.cfg文件中,源码路径: ``` ~/AN/aosp/device/phytium/pd2508/uefi_loader/EFI/BOOT/grub.cfg ``` 默认配置的参数能支持大部分场景启动,上电后,会直接进入系统。 如果不出意外的话,静等片刻就可以看到我们的Android开机动画了,最终进入Android的启动界面。 ![Android开机动画](res/bootanimation.png) ![Android Launcher](res/launcher.png) ### 7.2 设置DPI DPI会影响Android界面图标的大小。如果图想要调整DPI,可以在grub.cfg中添加一项 DPI=xxx. -------
## 八. 开源许可协议 这个项目我们采用的协议是: Apache 2.0 ----
## 九.项目维护者联系方式 各位朋友,如果在使用过程中有遇到相关疑问,可以联系如下的相关维护者,我们将在第一时间为您提供答疑解惑,助您及时解决相关问题。
zhangjianwei@phytium.com.cn tangkaiwen@phytium.com.cn xiayan1086@phytium.com.cn chenda2442@phytium.com.cn