1. 为什么我们需要自动化升级安卓车机?
如果你在汽车电子行业待过,或者自己动手折腾过车机,肯定对“刷机”这个词不陌生。传统的车机系统升级,尤其是给4S店或车队里的几十上百台车做版本更新,那场景简直是一场噩梦。工程师需要抱着一台笔记本电脑,钻进车里,插上USB线,打开电脑上的刷机工具,手动点击“开始升级”,然后盯着进度条,生怕中途断电或出错。一台车搞完,再换下一台,效率低不说,还容易因为人为操作失误导致“变砖”。
我自己就经历过这种痛苦。早些年做项目支持,经常要跑现场给测试车辆刷写新版本。夏天车里闷热,冬天冻手,一待就是大半天。后来我就想,这种重复、机械的体力活,能不能交给电脑自己干?答案就是自动化。
而实现安卓车机自动化的核心钥匙,就是 ADB(Android Debug Bridge)。ADB是安卓系统自带的调试工具,它就像一条连接电脑和车机的“数字脐带”,允许我们通过命令行远程控制车机,执行文件传输、安装应用、执行Shell命令等操作。再结合 Python 强大的脚本能力,我们就能编写一套程序,自动完成从“检查连接”到“推送升级包”,再到“触发升级”的全流程。
这套方案的价值,远不止是“偷懒”。对于车载系统供应商,它可以实现批量静默升级,在夜间或车辆闲置时自动完成,不影响白天用车。对于开发者,它是持续集成/持续部署(CI/CD) 的一环,新版本编译完成后自动推送到测试车机验证。对于极客玩家,也能方便地管理自己爱车的车机系统。接下来,我就把自己踩过坑、验证过的这套自动化升级方案,掰开揉碎了分享给你。
2. 动手前的准备:搭建你的自动化战场
工欲善其事,必先利其器。在开始写代码之前,我们需要把环境和工具准备好。这个过程就像组装一台机床,每个零件都要到位。
2.1 硬件与软件环境清单
首先,确保你手头有这些东西:
- 一台安卓车机或安卓设备:这是我们的升级目标。确保其开发者选项已打开,并且USB调试模式已启用。不同车机的开启方式略有不同,通常在“设置”-“关于系统”-“版本号”上连续点击多次,然后返回设置菜单就能找到“开发者选项”。
- 一台电脑(Windows, macOS, Linux均可):作为控制中心。
- 一条靠谱的USB数据线:别小看它,很多连接问题都出在线材质量上。尽量使用原装或品牌数据线。
- 稳定的网络(用于FTP下载场景):如果你的升级包放在公司内网的FTP服务器上,电脑需要能访问该网络。
软件方面,我们需要安装两个核心工具:
-
ADB工具包:这是与车机通信的桥梁。
- Windows用户:可以直接下载 Android SDK Platform-Tools 的ZIP包,解压后将其路径(例如
C:\platform-tools)添加到系统的环境变量PATH中。这样在命令行任何位置都能直接输入adb命令。 - macOS/Linux用户:可以通过包管理器安装,比如在Ubuntu上使用
sudo apt install adb,或者在macOS上使用brew install android-platform-tools。 - 验证安装:打开终端或命令提示符,输入
adb version,如果能显示出版本号,说明安装成功。
- Windows用户:可以直接下载 Android SDK Platform-Tools 的ZIP包,解压后将其路径(例如
-
Python环境:我们脚本的运行时。推荐使用 Python 3.7及以上版本。
- 去 Python官网 下载安装包,安装时务必勾选“Add Python to PATH”。
- 同样,在命令行输入
python --version或python3 --version验证。
2.2 关键的Python库
我们的脚本会用到几个Python标准库和第三方库,用pip命令一键安装即可。打开终端,执行:
pip install pyftpdlib # 用于FTP客户端操作,如果服务器是FTP的话
其实,原始代码中主要用到了 ftplib(Python自带)、os、sys、time、datetime 和 urllib,这些都是标准库,无需额外安装。但为了更稳健的FTP操作和未来扩展,了解 pyftpdlib 这类库有好处。我们这里先以标准库为主。
2.3 建立ADB连接并授权
这是实操的第一步,也是最容易卡住新手的环节。
- 用USB线连接电脑和车机。
- 在车机上,你可能会看到一个弹窗,询问“是否允许USB调试?”,一定要勾选“始终允许”,然后点击“确定”。这一步至关重要,它建立了电脑对车机的信任关系。
- 回到电脑终端,输入命令:
adb devices - 如果一切正常,你会看到类似下面的输出:
这串字母数字是设备的序列号,后面的List of devices attached 89ABCDEF01234567 devicedevice状态表示已授权并连接成功。如果显示unauthorized,说明车机上没点确认授权;如果什么都没显示,检查USB线、驱动和调试模式。
小技巧:对于批量操作,我们更希望脚本能自动处理连接。可以写一个简单的检测循环,就像原始代码里的 TestAdbConnect 函数,不断尝试 adb shell ls 命令,直到返回成功为止,这样能确保后续操作的基础是稳固的。
3. 核心实战:一步步构建自动化脚本
现在,我们进入最核心的部分,把整个升级流程用Python脚本串起来。我会把原始代码打散,用更清晰的结构和更详细的解释重新组织。
3.1 第一步:从服务器获取升级包
升级包通常不会放在本地,而是由构建服务器生成,存放在某个共享位置。原始代码用的是FTP服务器,这是一个很常见的场景。我们来写一个更健壮的下载模块。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import re
from ftplib import FTP
from datetime import datetime
import urllib.request
import time
class UpgradePackageDownloader:
def __init__(self, host, port=21, username='anonymous', password=''):
"""
初始化FTP下载器
:param host: FTP服务器地址
:param port: 端口,默认21
:param username: 用户名,匿名访问用 'anonymous'
:param password: 密码
"""
self.ftp_host = host
self.ftp_port = port
self.ftp_user = username
self.ftp_pass = password
self.ftp = None
# 本地保存升级包的目录
self.local_save_dir = '/home/devops/tools/autoupdatesystem/updatePackage'
# 确保本地目录存在
os.makedirs(self.local_save_dir, exist_ok=True)
def connect_and_login(self):
"""连接并登录FTP服务器"""


148

被折叠的 条评论
为什么被折叠?



