Android AOSP入门之环境搭建

简介: 最近在做移动机器人项目,要给机器人做一个头台,搭载Android操作系统,要为系统做一些定制。在 好多年前,还是Android 5.0以下系统的时候做游戏画面采集做个AOSP的编译,那个时候电脑配置查,网络也差,搭建一次环境特别费劲。编译完还没有现成的设备可以给刷,一直也没有真正的framework和内核、驱动层的开发经验,现在有了实际的需求了,硬着头皮开搞。

image.png


1. 背景


最近在做移动机器人项目,要给机器人做一个头台,搭载Android操作系统,要为系统做一些定制。在 好多年前,还是Android 5.0以下系统的时候做游戏画面采集做个AOSP的编译,那个时候电脑配置查,网络也差,搭建一次环境特别费劲。编译完还没有现成的设备可以给刷,一直也没有真正的framework和内核、驱动层的开发经验,现在有了实际的需求了,硬着头皮开搞。


这次现在供应商推荐了开发板,买开发板的时候顺带着把资料也带过来了,这是一块开源的板子,支持Android9.0系统,资料里面源码和镜像都有,已经刷机工具,本文开始搭建环境,后续逐步的完善功能。


2. 组装


image.png


组装比较简单,把板子用螺丝固定到另外购买的显示屏上,将LVDS模块接起来,将wifi天线和4G模块安装上就可以加电启动了。


3. AOSP编译环境搭建


编译 AOSP 对机器的配置要求较高:


  • 64 位 CPU
  • 16GB 物理内存+交换内存
  • 30GB 空闲的磁盘空间用于构建,源码树另外占用大约 25GB, 如果要编译源码则还需要 150GB 的磁盘空间。


这里正好有刚从公司申请的笔记本,512G磁盘, 24G内存,i7处理器,装了ubuntu20操作系统。


编译环境的初始化参考了Android官网提示: source.android.com/source/init…

  • 安装 OpenJDK 8:


sudo apt-get install openjdk-8-jdk


  • 安装 openjdk-8-jdk,会更改 JDK 的默认链接,这时可用下面工具来切换 JDK 版本。:


$ sudo update-alternatives --config java
$ sudo update-alternatives --config javac


  • Ubuntu软件包安装:


sudo apt-get update
sudo apt-get install git gnupg flex bison gperf libsdl1.2-dev \
libesd-java libwxgtk3.0-dev squashfs-tools build-essential zip curl \
libncurses5-dev zlib1g-dev pngcrush schedtool libxml2 libxml2-utils \
xsltproc lzop libc6-dev schedtool g++-multilib lib32z1-dev lib32ncurses5-dev \
lib32readline-dev gcc-multilib libswitch-perl libssl-dev unzip zip


4. 编译9.0固件


解压从资源盘中自带的源码压缩包,这里用了7x压缩工具。然后进入源码路径执行:


cd ./aosp
git reset --hard


4.1 编译显示器驱动


它提供了HDMI、LVDS + HDMI和MIPI + HDMI三种显示屏,执行对应脚本即可,这里我们用的是LVDS,编译LVDS即可。


4.2 编译AOSP


  • 编译前执行如下命令配置环境变量:


export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar


  • 编译kernel:


make ARCH=arm64 xxx_defconfig
make -j8 ARCH=arm64 BOOT_IMG=../xxx/Image-xxx/boot.img xxx.img


若进行内核 debug,需要将 resource.img 和 kernel.img 打包进去 boot.img 后对 boot 分区进行烧写才能生效。


  • 编译 uboot


./make.sh 


  • 编译Android


source build/envsetup.sh
lunch xxx-userdebug
make -j8
./mkimage.sh


5. 编译产物


  • boot.img: Android 的 initramfs 映像,包含Android根目录的基础文件系统,它负责初始化和加载系统分区。
  • system.img: ext4 文件系统格式的 Android 文件系统分区映像。
  • kernel.img: 内核映像。
  • resource.img: Resource 映像, 包含启动图片和内核设备树。
  • misc.img: misc 分区映像, 负责启动模式的切换和急救模式参数的传递。
  • recovery.img: Recovery 模式映像。
  • rk3399_loader_v1.12.112.bin: Loader 文件。
  • uboot.img: U-Boot 映像文件。
  • trust.img: Arm trusted file (ATF) 映像文件。
  • parameter.txt: 分区布局和内核命令行。


6. 更新固件(刷机)


开发板有2种工作模式。一般情况下,开机直接进入Normal 模式正常启动系统。如需对板子系统进行升级,可以根据情况选择合适的升级模式进行固件升级。


image.png


目前支持3种升级模式,各有优缺点:


  1. MaskRom 升级模式
  2. Loader 升级模式
  3. SD 升级模式


6.1 MaskRom 升级模式


一般情况下是不用进入 MaskRom 升级模式的,只有在 bootloader 校验失败(读取不了 IDB 块,或 bootloader 损坏) 的情况下,BootRom 代码 就会进入此模式。此时 BootRom 代码等待主机通过 USB 接口传送 bootloader 代码,加载并运行之。当板子变砖无法正常启动或升级程序时,也可以手动进入MaskRom 升级模式.


6.2 Loader 升级模式


Loader 升级模式下,bootloader 会进入升级状态,等待主机命令,用于固件升级等。要进入此模式,必须让 bootloader 在启动时检测到 RECOVERY(恢复)键按下,且 USB 处于连接状态。


6.3 SD 升级模式


使用SD升级,本质上是制作一个可启动的SD启动的升级固件,让板子SD启动,擦除和烧写EMMC。


这里我们先使用SD卡将资料盘中自带的系统更新到板子,跑起来看看效果。


7. 总结


本文介绍了基于开发板自带AOSP编译Android镜像过程,整个过程比较顺利,而且由于电脑性能还不错,近20G的压缩包,解压后整个编译过程花了两个半小时,比之前动不动两三天还总失败高效了很多。

目录
相关文章
|
2月前
|
IDE Java 开发工具
深入探索安卓应用开发:从环境搭建到第一个"Hello, World!"应用
本文将引导读者完成安卓应用开发的初步入门,包括安装必要的开发工具、配置开发环境、创建第一个简单的安卓项目,以及解释其背后的一些基本概念。通过一步步的指导和解释,本文旨在为安卓开发新手提供一个清晰、易懂的起点,帮助读者顺利地迈出安卓开发的第一步。
216 65
|
2月前
|
存储 Oracle Java
深入探索安卓应用开发:从环境搭建到第一个"Hello, World!"
本文旨在为安卓开发初学者提供一个清晰、简洁的入门指南。我们将一步步引导您完成安卓开发环境的搭建,并详细介绍如何创建您的第一个安卓应用程序。通过这篇文章,您不仅能够理解安卓应用开发的基本流程,还能掌握一些实用的技巧和方法,为进一步深入学习打下坚实的基础。
|
3月前
|
Ubuntu 开发工具 Android开发
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
本文介绍了在基于Ubuntu 22.04的环境下配置Python 3.9、安装repo工具、下载和同步AOSP源码包以及处理repo同步错误的详细步骤。
209 0
Repo下载AOSP源码:基于ubuntu22.04 环境配置,android-12.0.0_r32
|
15天前
|
存储 前端开发 测试技术
Android kotlin MVVM 架构简单示例入门
Android kotlin MVVM 架构简单示例入门
22 1
|
11天前
|
XML IDE Java
安卓应用开发入门:从零开始的旅程
【10月更文挑战第23天】本文将带领读者开启一段安卓应用开发的奇妙之旅。我们将从最基础的概念讲起,逐步深入到开发实践,最后通过一个简易的代码示例,展示如何将理论知识转化为实际的应用。无论你是编程新手,还是希望扩展技能的软件工程师,这篇文章都将为你提供有价值的指导和启发。
22 0
|
1月前
|
开发框架 移动开发 Android开发
安卓与iOS开发中的跨平台解决方案:Flutter入门
【9月更文挑战第30天】在移动应用开发的广阔舞台上,安卓和iOS两大操作系统各自占据半壁江山。开发者们常常面临着选择:是专注于单一平台深耕细作,还是寻找一种能够横跨两大系统的开发方案?Flutter,作为一种新兴的跨平台UI工具包,正以其现代、响应式的特点赢得开发者的青睐。本文将带你一探究竟,从Flutter的基础概念到实战应用,深入浅出地介绍这一技术的魅力所在。
72 7
|
2月前
|
Android开发 开发者
安卓开发中的自定义视图:从入门到精通
【9月更文挑战第19天】在安卓开发的广阔天地中,自定义视图是一块充满魔力的土地。它不仅仅是代码的堆砌,更是艺术与科技的完美结合。通过掌握自定义视图,开发者能够打破常规,创造出独一无二的用户界面。本文将带你走进自定义视图的世界,从基础概念到实战应用,一步步展示如何用代码绘出心中的蓝图。无论你是初学者还是有经验的开发者,这篇文章都将为你打开一扇通往创意和效率的大门。让我们一起探索自定义视图的秘密,将你的应用打造成一件艺术品吧!
58 10
|
28天前
|
Web App开发 编解码 视频直播
视频直播技术干货(十二):从入门到放弃,快速学习Android端直播技术
本文详细介绍了Android端直播技术的全貌,涵盖了从实时音视频采集、编码、传输到解码与播放的各个环节。文章还探讨了直播中音视频同步、编解码器选择、传输协议以及直播延迟优化等关键问题。希望本文能为你提供有关Andriod端直播技术的深入理解和实践指导。
39 0
|
2月前
|
IDE Java 程序员
安卓应用开发入门:打造你的第一个“Hello World”
【9月更文挑战第11天】在编程的世界里,每一个初学者的旅程都从一个简单的“Hello World”开始。本文将带领安卓开发的新手们,通过简单直观的方式,一步步构建出自己的第一个安卓应用。我们将探索安卓工作室(Android Studio)的安装、项目的创建,以及如何运行和调试你的应用。无论你是编程新手还是想扩展技能的老手,这篇文章都将为你打开一扇通往安卓世界的大门。
161 7
|
2月前
|
IDE Java API
安卓应用开发入门:打造你的第一个"Hello World"
【9月更文挑战第11天】在探索安卓开发的海洋中,每个开发者的航行都从简单的"Hello World"开始。本文将作为你的航标,引导你驶向安卓应用开发的精彩世界。我们将一起启航,通过浅显易懂的语言和步骤,学习如何构建并运行你的第一个安卓应用。无论你是编程新手还是希望扩展技能的老手,这篇文章都将为你提供所需的知识和信心。准备好了吗?让我们揭开安卓开发的神秘面纱,一起创造些令人兴奋的东西吧!