如何让自定义Chromium对接XML更新服务器?修复更新错误9
自定义Chromium(129.0.6664.0 arm64开发者版)更新服务器配置故障排查
问题概述
为自定义Chromium配置私有更新服务器,修改了/chromium/src/third_party/updater/chromium_mac_arm64/3pp/fetch.py的更新地址,但更新功能仍失效。修改前「关于Chromium」界面已报错:An error occurred while checking for updates: 9 (error code 0)。修改后的代码如下:
import argparse import functools import json import os import sys import urllib.request import xml.etree.ElementTree as ET # MIN_VERSION is the earliest working version of the updater for self-update # testing. If a backwards-incompatible change to the updater is made, it may be # necessary to increase the version. MIN_VERSION = 1290000 # Update this to a version number for testing UPDATE_XML_URL = 'https://www.generalcodestudios.com/updates/trevin/trevin-update.xml' LAST_CHANGE_URL = 'https://www.generalcodestudios.com/updates/trevin/trevin-last-change.txt' UPDATER_ZIP_URL = 'https://www.generalcodestudios.com/updates/trevin/trevin-updater.zip' def get_platform(): return 'Mac_Arm' # For ARM-based systems def int_or_inf(v): try: return int(v.replace('.', '')) except ValueError: return -float('inf') def fetch_from_xml(platform, minimum): """ Fetches version information from the XML update file. """ response = urllib.request.urlopen(UPDATE_XML_URL) xml_data = response.read().decode('utf-8') root = ET.fromstring(xml_data) min_version = float('inf') max_version = '' for version in root.findall('.//version'): version_text = version.text if int_or_inf(version_text) > minimum: min_version = min(min_version, int_or_inf(version_text)) max_version = max(max_version, version_text) if min_version == float('inf'): min_version = None return min_version, max_version def find(platform, minimum, maximum): """ Returns a version from XML closest to `minimum` but not more than `maximum` for `platform`. May return maximum even if it does not exist in XML. """ found_min = maximum pivot = str(minimum) while pivot < str(maximum): found, pivot = fetch_from_xml(platform, minimum) found_min = min(found_min, found) return found_min def lastDatum(platform): """ Returns a version from XML that only updates every n versions. """ try: latest = int(urllib.request.urlopen(LAST_CHANGE_URL).read().decode('utf-8')) except ValueError: latest = MIN_VERSION return max(MIN_VERSION, find(platform, latest - latest % 1000, latest)) def print_latest(): print(lastDatum(get_platform())) def get_url(): print( json.dumps({ 'url': [ UPDATER_ZIP_URL ], 'ext': '.zip', 'name': ['updater.zip'] })) def main(): ap = argparse.ArgumentParser() sub = ap.add_subparsers() sub.add_parser('latest').set_defaults(func=lambda _opts: print_latest()) sub.add_parser('get_url').set_defaults(func=lambda _opts: get_url()) opts = ap.parse_args() return opts.func(opts) if __name__ == '__main__': sys.exit(main())
故障排查与修复步骤
1. 先解决原始报错(error code 9)
Error code 9通常表示更新服务无法连接或验证失败,优先确认基础项:
- 检查更新服务状态:在Mac上执行
launchctl list | grep updater,确认自定义Chromium对应的更新plist(如com.yourdomain.Chromium.updater)已加载。 - 验证网络与证书:直接在浏览器或终端访问你的更新XML、文件URL,排除防火墙、代理拦截;若使用自签HTTPS证书,需将证书添加到系统信任列表,或启动Chromium时添加
--ignore-certificate-errors参数临时测试。
2. 验证fetch.py脚本逻辑
- 手动测试脚本:在终端运行
python3 fetch.py latest和python3 fetch.py get_url,查看输出是否符合预期:- 若XML解析报错,检查
trevin-update.xml结构是否符合Chromium规范:需包含与当前版本格式一致的version节点(如129.0.6664.0),且节点层级正确。 - 若
LAST_CHANGE_URL触发ValueError,确保trevin-last-change.txt仅包含纯整数版本号(如12906664,对应129.0.6664.0去掉点的数值)。
- 若XML解析报错,检查
- 修正版本号转换逻辑:当前
int_or_inf函数将129.0.6664.0转为129066640,但MIN_VERSION设为1290000,数值差距过大导致版本判断失效。建议将MIN_VERSION同步为对应版本的整数形式(如129066640),或调整转换逻辑只取主版本号(如1290000对应129.0.0.0)。 - 修复
find函数循环问题:当前while pivot < str(maximum)逻辑存在缺陷,pivot初始为字符串类型的minimum,但fetch_from_xml返回的pivot是字符串格式的max_version,易导致无限循环或错误判断。简化逻辑:直接从XML中筛选大于minimum的最高版本,替代现有循环。
3. 确认Chromium编译配置
- 检查编译gn参数:确保编译时指定了正确的更新服务器参数,如
GOOGLE_UPDATE_URL、UPDATER_SERVER,这些参数会覆盖fetch.py中的硬编码值,需与你的私有服务器地址匹配。 - 验证updater二进制:确认编译产物中的updater二进制文件路径正确,且已包含修改后的
fetch.py逻辑。
4. 日志调试定位
- 开启Chromium更新日志:启动Chromium时添加
--v=1参数,查看控制台输出的更新流程日志,定位具体失败环节。 - 查看系统日志:通过Mac的
Console.app搜索updater相关日志,获取更详细的错误堆栈信息。
内容的提问来源于stack exchange,提问作者Averi
相关产品推荐
相关产品推荐

