You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让自定义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去掉点的数值)。
  • 修正版本号转换逻辑:当前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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:47:11