最近在给一台CentOS 7服务器搭调试环境,需求很明确:用adb命令操作Android设备,用ffmpeg处理视频文件。本来我预估十分钟能搞定,结果硬是折腾了小半天。倒不是命令多复杂,而是CentOS 7这个系统太老了,官方停止维护后,软件源里要啥没啥,所有包都得自己想办法,各种依赖坑一个接一个。这篇文章就把我在CentOS 7上安装adb命令和ffmpeg命令的完整过程写出来,包括我实际踩过的坑和最后采用的稳定方案。如果你手头也有一台CentOS 7的机器,或者正在给智能电视、安卓盒子配调试环境,这篇文章应该能帮你省下不少时间。
1. 为什么在CentOS 7上装这两个工具会比想象中麻烦
1.1 仓库现状:默认源里什么都没有
CentOS 7的生命周期在2024年6月30日正式画上句号,这意味着官方base源基本不再更新。默认情况下,yum search adb和yum search ffmpeg都是空手而归。我一开始想装EPEL试试,因为它是CentOS生态里最常用的第三方扩展源,结果查了一圈,EPEL仓库里也没有这两个工具。
ffmpeg在CentOS 7上倒是可以通过RPM Fusion仓库安装,但问题在于版本实在太老,停留在4.1.x这个阶段。4.1发布于2018年,对现在常用的编码格式和新滤镜支持都很有限。更麻烦的是RPM Fusion仓库本身还需要额外配置,而且每一两年就要重新处理一次仓库密钥过期的问题,在服务器上非常烦人。adb就更不用说了,某些旧版EPEL源里曾经有过android-tools这个包,但版本老到对现在Android 10以上的设备几乎是半残状态,连设备列表都刷不出来。
1.2 三条路怎么选
面对这种情况,常规思路有三条:
- 配置第三方源,用yum装
- 下载官方编译好的二进制包,直接运行
- 老老实实从源码编译
我在实际项目中三条路都走过。源码编译的体验最差,尤其是ffmpeg,后面我会细说。yum装的问题是版本不可控,而且依赖各种历史包袱。本身这些东西对系统版本并不敏感,跑的是用户态命令而已,完全没有必要跟系统包管理深度绑定。对于运维场景,最稳妥、最可控的方案是下载官方或者社区维护的静态编译二进制包,放到固定目录,配好PATH,逻辑最简单,出问题也好排查。
后面所有操作都基于一个前提:服务器能联网。如果你服务器在隔离网段也没关系,先在有网的电脑上把安装包下载好,再通过U盘或者scp传到服务器上,原理完全一样,只是传输方式不同而已。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. adb安装:直接拉官方platform-tools,别在源里浪费时间
2.1 下载解压三步走
adb的正确安装姿势,是从Google官方仓库下载platform-tools。这个压缩包里面包含adb、fastboot、etc1tool这些Android调试平台工具,全部是编译好的二进制,不需要关心依赖问题。步骤就三步:
bash复制# 先装个unzip,CentOS 7最小化安装经常不带这个
yum install -y unzip
# 下载官方platform-tools
cd /usr/local/src
wget https://dl.google.com/android/repository/platform-tools-latest-linux.zip
# 解压到/opt目录,方便统一管理
unzip platform-tools-latest-linux.zip -d /opt
解压完之后,/opt/platform-tools目录下就有adb、fastboot等可执行文件了。先用绝对路径验证一下能否运行:
bash复制/opt/platform-tools/adb version
正常情况下会输出版本号,例如Android Debug Bridge version 1.0.41。能跑起来,说明这个包在系统层面没问题。
2.2 新版platform-tools与glibc的兼容性问题
这是整个安装过程中我踩的第一个坑,也是CentOS 7用户最容易卡住的地方。如果你是最小化安装的CentOS 7,直接执行新版platform-tools里的adb,大概率会看到这么一行报错:
code复制./adb: /lib64/libc.so.6: version 'GLIBC_2.29' not found
这个报错的意思是,adb这个二进制内部链接了glibc 2.29版本的接口,而CentOS 7自带的glibc是2.17,满足不了它的要求。相当于一个软件要求厨房里有某种特殊厨具,但你的厨房还是二十年前的配置。
遇到这个问题不要慌,说明系统没坏,只是新版工具已经不愿意兼容老系统了。解决办法是下载旧版platform-tools,我实测可用的是r33.0.3这个版本,属于Android 13时代的产物,对glibc 2.17的老系统非常友好,日常adb操作、设备连接、日志抓取完全够用:
bash复制cd /usr/local/src
wget https://dl.google.com/android/repository/platform-tools_r33.0.3-linux.zip
unzip platform-tools_r33.0.3-linux.zip -d /opt
如果你需要支持最新的Android 14或15设备,可以考虑在当前机器上先检查glibc版本,不建议去升级系统glibc,那是给自己挖坑。最安全的做法是:测试新版本adb能否运行,不能就退回r33.0.3。我后来又在一台装了额外依赖包的CentOS 7机器上试过新版platform-tools,能正常跑,但两台机器硬件和系统补丁状态不同,所以最好以实际测试为准。
2.3 为什么不推荐用yum装android-tools
网上不少教程会让你执行yum install -y android-tools,如果你用的是比较老的镜像源或者手动加了旧EPEL,确实可能装上,但装完之后adb devices的列表基本都是空的。原因很简单:这个包里的adb协议实现太老,对现代Android设备的握手和加密方式支持不全,经常出现明明插着手机,列表里却什么都没有,或者设备状态一直显示offline。真到了着急排查问题的时候,这种半残的adb等于没有。既然官方有干净的二进制包,就没必要在这个环节将就。
3. ffmpeg安装:静态构建版本比源码编译香太多
3.1 源码编译的坑,我替你踩过了
ffmpeg在CentOS 7上源码编译是重灾区。因为要编出一个功能完整的ffmpeg,基本绕不开yasm、nasm这些汇编器,想要x264编码还要编libx264,想要x265再编libx265,还有libvpx、libmp3lame、libopus、libvorbis等一堆可选依赖。这一串依赖在CentOS 7上几乎没有现成的rpm包,全都要手动一个个编译,而且它们之间还有版本匹配要求,编译一个ffmpeg,光是准备依赖就可能花掉大半天。更心累的是,有些依赖编译完了,ffmpeg configure时发现某个库版本不对,又要回去重编那个库。
如果你的业务场景只是用ffmpeg做简单的转码、抽帧、切片,完全没必要走这条路。RPM Fusion的预编译包虽然省事,但版本老,前面说过不再重复。我的选择是直接用静态构建版本。
3.2 静态构建版本下载安装
这里推荐使用johnvansickle.com提供的ffmpeg静态构建包,这是一个被广泛使用的Linux x86_64静态编译版本,把x264、x265、libvpx、libmp3lame等常用编码器和滤镜全部编译进去了,不会跟系统里的任何动态库发生冲突。
bash复制cd /usr/local/src
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
tar xvf ffmpeg-release-amd64-static.tar.xz
cp ffmpeg-*-static/ffmpeg /usr/local/bin/
cp ffmpeg-*-static/ffprobe /usr/local/bin/
这里有个小细节:下载的是tar.xz格式,如果系统提示不支持xz解压,先执行yum install -y xz装一下。解压出来的目录名会带版本号,用通配符ffmpeg-*-static来匹配是最稳妥的,省得手动改目录名。复制ffmpeg和ffprobe到/usr/local/bin是因为这个目录默认就在PATH里,无需额外配置。
验证一下:
bash复制ffmpeg -version
能看到版本号和配置参数,说明命令已经可用。此时你还可以用ffmpeg -encoders | grep 264检查libx264编码器是否包含在内,确认这是完整版静态构建。
3.3 装好后先拿这几个经典场景练手
ffmpeg装好之后,建议先用几个最常用的操作验证一下。第一个是修复破损的AVI文件,监控设备或者NAS导出的视频经常出现这种问题,文件头损坏导致播放器打不开。修复方式很简单:
bash复制ffmpeg -i broken.avi -c copy fixed.avi
-c copy表示视频流和音频流都不重新编码,直接拷贝封装,所以速度极快,只修复容器结构问题,不损伤画质。
第二个场景是B站缓存里的m4s转mp4。m4s本质上就是fmp4格式的分片,一个视频轨一个音频轨,合并到mp4容器里:
bash复制ffmpeg -i video.m4s -i audio.m4s -c copy output.mp4
第三个是视频抽帧截图,比如从视频的第60秒截取一帧图片:
bash复制ffmpeg -i input.mp4 -ss 00:01:00 -frames:v 1 frame.png
这三个操作覆盖了ffmpeg好多日常用途,跑通了就说明安装没有问题。
4. 环境变量、路径与基础使用验证
4.1 把adb写进PATH
ffmpeg复制到了/usr/local/bin,这个目录默认在PATH里,所以不用管。但adb在/opt/platform-tools,不在PATH里,需要配置一下。我推荐在/etc/profile.d/下新建一个脚本,这样全局所有用户都能用,登录也自动生效:
bash复制cat > /etc/profile.d/adb-ffmpeg.sh <<'EOF'
export PATH=$PATH:/opt/platform-tools
EOF
source /etc/profile.d/adb-ffmpeg.sh
为什么不改/etc/profile或者~/.bashrc?/etc/profile.d/下的脚本会在shell启动时自动source,逻辑更清晰,而且项目自己一个文件,到时候不用了直接删掉就行。~/.bashrc只对当前用户生效,如果服务器上有多个账号都要用adb,就不方便。
4.2 完整验证清单
配置完之后,用下面这份清单做一次完整验证:
| 命令 | 期望结果 |
|---|---|
| adb version | 显示Android Debug Bridge版本信息 |
| adb start-server | 提示daemon started successfully |
| adb devices | 显示设备列表,没有真机时至少能看到标题行 |
| ffmpeg -version | 显示ffmpeg版本和编译配置 |
| ffprobe -version | 显示ffprobe版本信息 |
如果手边有Android手机,USB连上服务器后跑一下adb devices,正常情况下能看到设备序列号,状态为device。如果连的是电视盒子或智能电视,通常是网络adb模式,需要用adb connect IP:5555指定设备IP去连接。用adb connect连不上时,检查一下设备端IP是否正确、ADB调试开关是否打开。
4.3 adb高频命令速查
既然整个adb环境都搭好了,顺便整理一份我平时用得最多的adb命令清单,方便参考:
adb install app.apk:安装应用adb uninstall package.name:卸载应用adb shell:进入设备shell终端adb shell settings put global http_proxy IP:端口:为设备设置代理,热搜里“adb重置代理”的场景就是用这类命令adb shell settings delete global http_proxy:清除代理设置adb logcat:实时抓取日志,排查App崩溃、ANR问题很好用adb exec-out screencap -p > screen.png:截取设备屏幕并保存到电脑adb push 本地文件 设备路径:从电脑推文件到设备adb pull 设备文件 本地路径:从设备拉文件到电脑
操作电视、盒子这类设备时要特别注意:很多品牌默认隐藏开发者选项,需要进入“设置-关于产品”,连续点击版本号若干次才能解锁USB调试或ADB开关。不同品牌的路径差异很大,有的还需要在官网上输入校验码才能开启,比如小天才手表、老款创维电视都有类似的机制。这个一定要提前查清楚自己设备的开启方法,否则adb设备列表永远都是空的。
5. 连不上设备?USB权限和adb服务排查实录
5.1 最常见的三种连接失败状态
装好adb之后,连接真机时最容易遇到三种问题:
adb devices显示空列表:USB层面就没有枚举成功,通常是驱动或权限问题- 设备状态显示
unauthorized:adb已经识别到设备,但手机端没有确认授权弹窗 - 设备状态显示
offline:adb服务和设备之间的连接不稳定,最常见于网络adb或USB线质量不佳
第一种情况在CentOS 7上尤其常见,原因十有八九是udev规则缺失,系统根本没给普通用户访问USB设备的权限。
5.2 USB权限问题的完整处理过程
先看一个典型现象:手机插上服务器后,lsusb能看到设备,比如小米的设备ID是0x2717,但adb devices就是没有任何输出。这就是系统没有给当前用户访问这个USB设备的权限。
处理链路如下:
bash复制# 1. 确认设备的vendor id
lsusb
# 2. 创建udev规则文件,把idVendor替换成你自己的设备厂商ID
cat > /etc/udev/rules.d/51-android.rules <<'EOF'
SUBSYSTEM=="usb", ATTR{idVendor}=="0x2717", MODE="0666", GROUP="plugdev"
EOF
# 3. 设置规则文件权限
chmod 644 /etc/udev/rules.d/51-android.rules
# 4. 重新加载udev规则
systemctl restart systemd-udevd
# 5. 重启adb服务
adb kill-server
adb start-server
# 6. 再次查看设备
adb devices
这里有两点需要注意。第一,ATTR{idVendor}的值必须和lsusb输出一致,不同品牌的手机ID完全不同,不要照抄我的示例。第二,CentOS 7默认没有plugdev这个用户组,所以规则里的GROUP="plugdev"不生效也没关系,关键是MODE="0666",这个权限位会直接让所有用户都能读写该USB设备,简单粗暴但有效。
5.3 unauthorized状态的处理
adb devices显示设备但状态是unauthorized,说明手机的调试授权弹窗没有确认。处理方法很直接:看手机屏幕,找到“允许USB调试吗”对话框,勾选“始终允许”,点确定。如果手快点了取消,重新插拔数据线,或者执行adb kill-server再adb start-server,弹窗就会再次出现。
如果弹窗根本没有出现在手机屏幕上,一般是数据线质量问题。我在项目里碰过好几次,一根看起来完好的Type-C线,充电没问题,但数据信号完全不通,换上原装线立刻就能识别。给服务器配的USB线,尽量别用那种几块钱的充电线,这是排查adb连接问题最常被忽略的一环。
5.4 ffmpeg运行时的典型报错
ffmpeg这边常见的坑和adb不太一样。如果你执行ffmpeg -i input.mp4 -c:v libx264 output.mp4报错Unknown encoder 'libx264',大概率说明当前PATH里的ffmpeg不是带全编码器的静态构建版本,而是系统里残留的某个精简包。解决办法就是把我前面提到的/usr/local/bin/ffmpeg替换成带完整编码器的版本。
自查方式很简单:
bash复制ffmpeg -encoders | grep 264
如果能看到libx264,说明编码器没问题。看不到就重新下载一次静态构建包,确认复制到了/usr/local/bin,并检查which ffmpeg看到的是不是这个路径。
6. 把整套安装固化成脚本,顺便避坑
6.1 一键安装脚本
当你在多台CentOS 7上重复安装时,手敲命令效率太低,而且容易漏步骤。更合理的做法是直接把整个流程固化成脚本,每次新机器只需要执行一次。这是我整理后的简化版,实测在多台机器上跑过:
bash复制#!/bin/bash
set -e
# 检查root权限
if [ "$EUID" -ne 0 ]; then
echo "请用root运行"
exit 1
fi
# 安装基础依赖
yum install -y unzip tar xz
# 安装adb platform-tools
mkdir -p /usr/local/src
cd /usr/local/src
if [ ! -f platform-tools_r33.0.3-linux.zip ]; then
wget https://dl.google.com/android/repository/platform-tools_r33.0.3-linux.zip
fi
unzip -o platform-tools_r33.0.3-linux.zip -d /opt
# 安装ffmpeg静态构建
if [ ! -f ffmpeg-release-amd64-static.tar.xz ]; then
wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz
fi
tar xvf ffmpeg-release-amd64-static.tar.xz
cp ffmpeg-*-static/ffmpeg /usr/local/bin/
cp ffmpeg-*-static/ffprobe /usr/local/bin/
# 配置环境变量
cat > /etc/profile.d/adb-ffmpeg.sh <<'EOF'
export PATH=$PATH:/opt/platform-tools
EOF
source /etc/profile.d/adb-ffmpeg.sh
# 验证
adb version
ffmpeg -version | head -n 3
echo "安装完成"
脚本里用set -e做严格模式,任何一步失败都会立刻中止,避免带着半截环境继续执行。加了文件存在性判断,重复执行不会反复下载同一个包,可以在多台机器上安全复用。
6.2 生产环境使用的三个建议
如果你要把这套方案用到生产环境,有几点经验值得参考。第一,版本锁定很重要。我脚本里把platform-tools固定到了r33.0.3,ffmpeg虽然是release滚动包,但你也可以手动改成指定版本的URL。锁定版本的意义在于可复现,过三个月再执行同一个脚本,拿到的是同一套环境,不会因为上游更新导致行为变化。第二,如果你有内网软件仓库或者HTTP文件服务器,建议把这两个包上传到内网,脚本里的下载地址改成内网地址,速度更快,也不依赖外网联通性。第三,如果服务器上没有外网访问权限,先在可以联网的电脑上下载好安装包,再通过内网传到服务器,同样可以手动执行后续步骤,这个流程不受影响。
6.3 个人使用体会
整个CentOS 7装adb和ffmpeg的过程走下来,我最大的感受是:在老系统上装工具,最核心的思路不是死记几条命令,而是养成“优先用官方编译好的二进制包,不做无谓的源码编译”的习惯。这样不但省时间,还能把依赖冲突降到最低。后来我在另一台CentOS 7机器上复用这套方案,十分钟不到就完成了全部安装,中间没有任何报错。如果你也正在跟CentOS 7上的这些工具较劲,希望这篇内容能帮你把原本小半天的折腾,压缩到一顿饭的工夫。
