2. 全志Tina SDK入门

好,咱们正式开始动手。这一章我带你走一遍Tina SDK的完整获取和编译流程。说实话,很多初学者卡就卡在第一步——环境没配好、源码没下对、编译命令敲错。别急,我把自己踩过的坑都标出来,你跟着走就行。

2.1 环境准备:先把坑填平

在下载源码之前,有几样东西必须装好。我见过有人Ubuntu 14.04折腾三天编译不过,最后发现是Python版本太老。

依赖项 最低版本 备注
Ubuntu 16.04 / 18.04 我推荐18.04,兼容性最好
Python 2.7 + 3.x Tina同时依赖两个版本
gcc / g++ 5.4+ apt install build-essential
repo工具 最新 Google的repo,用于多仓库管理
磁盘空间 至少80GB 全编译后约40GB,留余量
我的习惯:装完系统第一件事,跑一遍 sudo apt install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip python python3。这条命令我存了个脚本,每次新机器直接执行。

2.2 源码下载:repo sync的正确姿势

Tina SDK不是单个git仓库,而是由几十个仓库组成的。全志用Google的repo工具来管理。我第一次用repo时也被它的逻辑绕晕过——说白了,repo就是一个脚本,帮你批量操作多个git仓库。

下载步骤很简单,但有几个细节要注意:

  1. 创建工作目录:mkdir tina-sdk && cd tina-sdk
  2. 初始化repo:repo init -u https://github.com/allwinner-tina/tina-manifest.git -b master
  3. 同步源码:repo sync -j4
我曾经踩过的坑:第一次repo sync时网络断了,重新跑居然报错。后来发现repo sync中途中断后,有些仓库处于“半拉子”状态。解决办法是:repo sync --force-sync -j4,强制重新同步。另外,-j4是并发数,网络好的话可以开到-j8,但别超过CPU核心数。

同步完成后,你会看到这样的目录结构:

tina-sdk/
├── build/          # 编译系统核心脚本
├── device/         # 板级配置(全志各芯片)
├── kernel/         # Linux内核源码
├── lichee/         # 启动相关(uboot、boot0等)
├── out/            # 编译输出目录(初始为空)
├── package/        # 应用层包配置
├── prebuilt/       # 预编译工具链
├── target/         # 根文件系统配置
├── tools/          # 辅助工具
└── Makefile        # 顶层Makefile

2.3 首次编译:source、make、pack三部曲

编译Tina SDK就三个命令,但顺序不能乱。我见过有人直接敲make然后报错——因为环境变量没加载。

第一步:source环境变量

source build/envsetup.sh

这条命令会加载所有编译需要的环境变量,包括交叉编译链路径、目标架构、包路径等。执行后你会看到类似这样的输出:

Setup environment for tina SDK...
Usage: lunch [platform] [board] [config]

然后执行lunch选择目标平台:

lunch
# 会列出所有支持的平台,比如:
# 1. tina-v853-xxx
# 2. tina-t113-xxx
# 选择对应的数字即可

我个人习惯直接指定:lunch tina-v853-perf1,省得每次选。

第二步:make编译

make -j8

这里-j8是并行编译线程数。我建议设为CPU核心数的1.5倍左右。第一次全编译大概需要30分钟到1小时,取决于机器性能。

编译过程会依次做这些事:

  • 编译交叉工具链(如果prebuilt里没有)
  • 编译uboot
  • 编译Linux内核
  • 编译根文件系统(busybox + 应用包)
  • 生成最终镜像

编译过程中如果报错,别慌。90%的错误都是依赖缺失。看错误日志最后几行,缺什么装什么。我遇到过最奇葩的一次是缺libncurses5-dev,装完就好了。

第三步:pack打包

pack

这个命令把编译出来的内核、根文件系统、uboot打包成一个完整的烧录镜像。执行后会在out/目录下生成tina_xxx.img文件。

整个流程可以用下面这张图来理解:

Tina SDK 编译流程 source envsetup.sh 加载环境变量 lunch 选择目标平台 make -jN 编译内核+文件系统 pack 打包生成烧录镜像 out/tina_xxx.img 最终烧录镜像 ⚠ 顺序不能乱 source → lunch → make → pack

2.4 编译产物分析:到底生成了什么?

编译完成后,out/目录下会多出一堆东西。很多新手看到这堆文件就懵了。我帮你拆开看:

out/
├── tina_xxx.img          # 完整烧录镜像(约200MB)
├── boot.img              # 内核+dtb+ramdisk
├── rootfs.img            # 根文件系统镜像
├── u-boot-sunxi-with-spl.bin  # uboot+SPL
├── zImage                # 压缩后的内核
├── *.dtb                 # 设备树文件
└── target/               # 各模块编译中间产物
产物文件 大小(典型值) 作用
tina_xxx.img 150~300 MB 最终烧录文件,包含所有分区
boot.img 5~10 MB 启动分区,内核+设备树+initramfs
rootfs.img 50~200 MB 根文件系统,包含busybox和库文件
u-boot-sunxi-with-spl.bin ~500 KB 引导加载程序,负责加载内核
zImage 3~6 MB 压缩后的Linux内核镜像
调试小技巧:如果你只想验证内核修改,不需要每次都pack。直接make kernel -j8只编译内核,然后用pack重新打包。这样能省下一大半时间。我在调试驱动时,一天要编译几十次内核,每次都全编译的话,一天就过去了。

2.5 避坑指南:我替你试过的错

编译过程中有几个常见问题,我直接列出来:

  • repo sync超时:国内网络问题。解决办法:挂代理,或者用全志的国内镜像源。
  • make报错“No rule to make target”:通常是lunch没执行,或者选错了平台。重新lunch一下。
  • pack报错“image too large”:根文件系统超出分区大小。去device/config/下调整分区表。
  • 编译到一半磁盘满了:out/目录占空间最大。可以用rm -rf out清理,但下次要全量编译。
我曾经犯过的错:有一次我改了内核配置,然后直接make,结果发现修改没生效。后来才意识到,Tina的编译系统有缓存机制。修改配置后,需要先make kernel_clean清除内核编译缓存,再重新编译。不然它以为没变化,直接跳过。

嗯,到这里,源码获取和首次编译的流程就走通了。你跟着操作一遍,应该能顺利生成第一个tina_xxx.img。记住,编译环境一次配好,后面就省心了。