一、嵌入式Android开发环境搭建
说实话,嵌入式Android开发最让人头疼的往往不是写代码本身,而是环境搭建。我见过太多新手卡在这一步,折腾一整天连个Hello World都跑不起来。今天我就把这几年的经验掰开揉碎讲给你听。
核心要点:嵌入式Android开发环境搭建主要包含三大块——交叉编译工具链、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
说实话,环境搭建这一步确实繁琐,但这是后面所有开发的基础。我见过太多人跳过这一步直接写代码,结果调试时各种莫名其妙的问题。磨刀不误砍柴工,把环境搭好了,后面就顺了。