2. 全量包制作环境搭建:Linux环境准备与工具链安装
说实话,做全量包制作,环境搭建这一步看着简单,但坑不少。我见过太多人一上来就急着写脚本,结果被工具链的版本问题卡住半天。咱们先把地基打牢,后面才走得稳。
2.1 为什么选 Linux?
你可能要问:Windows 不行吗?嗯,理论上可以,但实操中你会遇到各种编码问题、路径分隔符问题、还有签名工具兼容性问题。我个人习惯用 Ubuntu 20.04 LTS 或 CentOS 7+,这两个发行版在 Android 生态里支持最好。
核心原则:全量包制作环境必须与目标系统保持一致。比如你的设备跑的是 Android 10,那编译和打包环境最好也用对应的 Linux 内核版本。
2.2 必要工具链安装
咱们需要的东西不多,但每个都不能少。我列个清单,你照着装就行。
| 工具 | 用途 | 安装命令 (Ubuntu/Debian) | 安装命令 (CentOS/RHEL) |
|---|---|---|---|
| zip | 压缩打包 | sudo apt install zip |
sudo yum install zip |
| unzip | 解压校验 | sudo apt install unzip |
sudo yum install unzip |
| openssl | 签名与哈希计算 | sudo apt install openssl |
sudo yum install openssl |
| rsync | 增量同步与校验 | sudo apt install rsync |
sudo yum install rsync |
我的小习惯:装完后跑一遍 zip --version && unzip --version && openssl version && rsync --version,确认版本号都正常。我曾经在 CentOS 6 上遇到过 openssl 版本太老,导致签名算法不兼容的问题,折腾了一下午。
2.3 构建目录结构设计
目录结构这事,看着是小事,但直接影响后续脚本的可维护性。我建议你按照「输入-处理-输出」的逻辑来组织。
ota_workspace/
├── input/ # 原始固件存放
│ ├── source_ota.zip # 基础版本全量包
│ └── target_ota.zip # 目标版本全量包
├── output/ # 生成的增量包
│ ├── incremental_patch.zip
│ └── full_package.zip
├── tools/ # 工具脚本与签名密钥
│ ├── sign.sh
│ ├── verify.sh
│ └── keys/
│ ├── release_key.pk8
│ └── release_key.x509.pem
├── temp/ # 临时解压目录(可清理)
│ ├── source/
│ └── target/
└── config/ # 配置文件
└── build_config.ini
这个结构我用了好几年,基本没大改过。你想想看,每个目录的职责很清楚:input 只管放原材料,output 只管收成品,temp 用完就删,不会污染其他目录。
注意:temp 目录一定要放在工作区内部,不要用 /tmp。为什么?因为 /tmp 可能被系统定时清理,你跑了一半的打包任务突然发现文件没了……嗯,我吃过这个亏。
2.4 环境验证脚本
装完工具、建好目录,我建议你写一个快速验证脚本。每次换机器或者重装系统后,跑一遍就能确认环境是否就绪。
#!/bin/bash
# check_env.sh - 环境验证脚本
echo "=== 工具链版本检查 ==="
echo "zip: $(zip --version 2>&1 | head -n 1)"
echo "unzip: $(unzip --version 2>&1 | head -n 1)"
echo "openssl: $(openssl version)"
echo "rsync: $(rsync --version 2>&1 | head -n 1)"
echo ""
echo "=== 目录结构检查 ==="
BASE_DIR="ota_workspace"
for dir in input output tools temp config; do
if [ -d "$BASE_DIR/$dir" ]; then
echo "[OK] $BASE_DIR/$dir"
else
echo "[MISS] $BASE_DIR/$dir"
fi
done
echo ""
echo "=== 签名密钥检查 ==="
if [ -f "ota_workspace/tools/keys/release_key.pk8" ]; then
echo "[OK] 私钥存在"
else
echo "[WARN] 私钥未找到,请后续生成"
fi
这个脚本我每次搭建新环境都会跑一遍。说白了,就是给自己省点排查时间。
2.5 知识结构总览
下面这张图把本章的核心逻辑串起来了。你可以把它当作一个快速索引。
2.6 避坑指南
最后,分享几个我踩过的坑,你遇到了可以直接跳过。
- openssl 版本太老:我曾经在 CentOS 6 上默认装的是 1.0.1,结果签名算法不支持 SHA256-RSA,折腾了半天才发现。建议用 1.1.1 以上版本。
- zip 中文乱码:如果固件文件名包含中文,记得设置
export LANG=en_US.UTF-8,否则解压出来全是乱码。 - rsync 权限问题:用 rsync 同步大文件时,加上
--partial参数,这样断网了还能续传,不用从头再来。 - temp 目录磁盘空间:全量包解压后可能占用 10GB+,确保
temp所在分区有足够空间。我建议至少预留 20GB。
一句话总结:环境搭建别图快,工具版本和目录结构搞对了,后面写脚本就是水到渠成的事。