一、嵌入式Android开发环境搭建

说实话,嵌入式Android开发最让人头疼的往往不是写代码本身,而是环境搭建。我见过太多新手卡在这一步,折腾一整天连个Hello World都跑不起来。今天我就把这几年的经验掰开揉碎讲给你听。

核心要点:嵌入式Android开发环境搭建主要包含三大块——交叉编译工具链、ADB与Fastboot工具、源码下载与编译。这三块缺一不可,顺序也别搞反了。

嵌入式Android开发环境搭建知识体系 交叉编译工具链 ADB & Fastboot 源码下载与编译 gcc-arm-linux-gnueabihf 环境变量配置 adb devices / push / pull fastboot flash / reboot repo init / sync make / lunch / m 三者配合:工具链编译 → ADB调试 → Fastboot烧录

1.1 交叉编译工具链安装

交叉编译,说白了就是在你的PC上编译出能在ARM芯片上跑的程序。我刚开始做的时候总想不通——为什么不能直接在板子上编译?后来发现板子那点算力,编译个Linux内核得等到天荒地老。

我个人习惯用Linaro提供的工具链,稳定且社区支持好。安装步骤其实很简单:

# 下载ARM交叉编译工具链
wget https://releases.linaro.org/components/toolchain/binaries/latest-7/arm-linux-gnueabihf/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz

# 解压到指定目录
tar -xvf gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf.tar.xz -C /opt/

# 配置环境变量
export PATH=/opt/gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf/bin:$PATH
export CROSS_COMPILE=arm-linux-gnueabihf-
export ARCH=arm

小技巧:把环境变量写到 ~/.bashrc 里,这样每次打开终端就不用重新export了。我当年就是忘了这茬,每次编译前都要敲一遍,烦得很。

验证是否安装成功,跑一下这个命令:

arm-linux-gnueabihf-gcc --version

如果能看到版本信息,说明工具链已经就绪。嗯,这里要注意——不同芯片厂商可能有不同的工具链,比如全志、瑞芯微都有自己的定制版本,但原理都一样。

1.2 ADB与Fastboot配置

ADB和Fastboot是Android调试的两把刷子。ADB负责设备运行时的调试,Fastboot负责底层烧录和刷机。

ADB安装:

# Ubuntu/Debian系
sudo apt-get install android-tools-adb android-tools-fastboot

# 或者从Google官方下载platform-tools
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
unzip platform-tools-latest-linux.zip
export PATH=$PATH:$(pwd)/platform-tools

配置完记得加个udev规则,不然Linux下adb devices会显示unauthorized:

# 创建udev规则文件
sudo vim /etc/udev/rules.d/51-android.rules

# 添加内容(以某款开发板为例)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d001", MODE="0666"

# 重载udev规则
sudo udevadm control --reload-rules
sudo udevadm trigger

避坑指南:我曾经因为idVendor写错,折腾了一下午才发现是复制粘贴时漏了个数字。建议用lsusb命令先确认设备的vendor ID和product ID,别想当然。

Fastboot的使用场景通常是设备处于bootloader模式。进入方式因设备而异,大部分开发板是按住某个按键再上电,或者在adb模式下执行:

adb reboot bootloader

进入fastboot后,常用的操作有:

  • fastboot devices — 查看连接的设备
  • fastboot flash boot boot.img — 烧录boot分区
  • fastboot flash system system.img — 烧录system分区
  • fastboot reboot — 重启设备

1.3 源码下载与编译

Android源码下载是个体力活。AOSP(Android Open Source Project)的代码量巨大,第一次同步可能要几十G的数据。我建议用repo工具来管理,它是Google专门为Android多仓库设计的。

安装repo:

mkdir ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
export PATH=$PATH:~/bin

下载源码:

# 创建工作目录
mkdir android-12
cd android-12

# 初始化repo
repo init -u https://android.googlesource.com/platform/manifest -b android-12.0.0_r1

# 同步源码(这一步很慢,建议用 -j4 参数)
repo sync -j4

经验之谈:国内下载AOSP源码,建议用清华或中科大的镜像站,速度能快10倍不止。我当年用官方源下了三天三夜,后来换了镜像站,半天搞定。

编译源码:

# 设置编译环境
source build/envsetup.sh

# 选择编译目标
lunch aosp_arm-eng

# 开始编译(-j参数根据CPU核心数调整)
make -j8

编译完成后,输出文件在 out/target/product/ 目录下。你会看到一堆.img文件,这些就是最终要烧录到开发板上的镜像。

镜像文件 说明 烧录分区
boot.img 内核+ramdisk boot
system.img 系统文件 system
vendor.img 厂商定制内容 vendor
userdata.img 用户数据分区 userdata

小提示:第一次编译建议用 make -j4,别贪多。我试过 -j32 直接把服务器搞崩了,内存不够用。先跑通一次,后面再调优。

编译过程中如果报错,八成是依赖没装全。常见的依赖包有:

sudo apt-get install git-core gnupg flex bison build-essential \
  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
  libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev \
  lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip

说实话,环境搭建这一步确实繁琐,但这是后面所有开发的基础。我见过太多人跳过这一步直接写代码,结果调试时各种莫名其妙的问题。磨刀不误砍柴工,把环境搭好了,后面就顺了。

公众号:蓝海资料掘金营,微信deep3321