定制你的PHP运行时:魔改发行版架构设计与源码剖析

发布时间:2026/8/17 15:36:09

定制你的PHP运行时:魔改发行版架构设计与源码剖析
定制你的 PHP 运行时魔改发行版——架构设计与源码剖析 这是把你前25个阶段做的事情工程化、产品化不再是一次性改一个函数而是造一个针对你自己项目的专属 PHP 发行版。就像 RedHat 之于内核、Tideways/Blackfire 之于 PHP——你现在要当的是自己运行时团队的维护者。 先立框架再逐层剖析。---第一部分什么算魔改发行版它长什么样 大白话定义 一个魔改 PHP 发行版托管一支 PHP 源码的私有 fork在上面持续叠加你的定制然后产出给你的团队用的 php8-bird 二进制。 它不是一次性编译参数而是长期维护的独立品。它和官方 PHP的关系 官方 php-src(upstream)│(git remote add upstream定期 merge 官方更新)▼ 你的 fork:bird-php ├─ ①编译/发布层:针对信创 CPU 的 build 脚本一键打包 ├─ ②内核定制层:你改的 opcode/JIT/扩展/函数 ├─ ③业务扩展层:birddb 专属 C 扩展(含 SQLite 适配/加速)└─ ④加固层:默认关闭危险配置、打安全补丁 │ ▼ 产物:php-bird(一个带全部定制的 PHP 二进制文档测试)为什么值得做值不值 ┌────────────────────────┬──────────────────────────────────┐ │ 收益 │ 代价 │ ├────────────────────────┼──────────────────────────────────┤ │ 团队用统一运行时可复现 │ 要维护一支 fork跟踪 upstream │ ├────────────────────────┼──────────────────────────────────┤ │ 定制可版本化、可回滚 │ 需要会 git merge 官方节奏 │ ├────────────────────────┼──────────────────────────────────┤ │ 安全补丁能集中打 │ 测试要从官方你的双层跑 │ ├────────────────────────┼──────────────────────────────────┤ │ 信创适配沉淀成资产 │ CI 要跑官方 test你的 test │ └────────────────────────┴──────────────────────────────────┘ 判断 只要你是长期跑在信创上、对性能/安全有要求就值得。一次性项目不值得。---第二部分fork 的目录与 git 架构地基 完整结构 bird-php/# 你的 fork 根 ├── php-src/# 官方上游,加了 remote ├── build/│ ├── build-bird.sh # 一键编译(信创 CPU 自适应)│ ├── package.sh # 打包成 rpm/deb/二进制 tar │ └── configs/│ ├── php.ini.bird # 你的默认 php.ini(加固版)│ └── php-fpm.bird.conf # 你的默认 FPM 池 ├── ext/│ ├── birdcore/# ★你的核心 C 扩展(业务加速)│ └── bird-sqlite-adapter/# SQLite 适配层(可选项)├── src-custom/# 如果你要改内核(opcode/opcache)│ └── patches/│ ├──001-*.patch # 每个定制一个可选的 patch │ └──002-*.patch ├── tests/│ ├── smoke/# 你的冒烟测试(.phpt)│ └── perf/# 你的基准对比 └── ci/├── ci-test.sh # CI:编官方test你的test └── ci-package.sh git 架构最关键决定你能不能长期跟上游 # ①clone 官方做 baseline git clone https://github.com/php/php-src.git bird-php/sourcecd bird-php/source # ②加upstream(方便拉官方更新)git remote add upstream https://github.com/php/php-src.git# ③你的定制全在独立分支(别污染 master)git checkout-b bird-customize #...改代码/home/ext 放进来...# ④发布打 tag git tag v1.0.0-bird git push origin bird-customize--tags # ⑤每次官方更新,在独立分支上合并(而不是硬覆盖):git fetch upstream git checkout-b bird-merge-$(date%F)bird-customize git merge upstream/master--no-commit # 有冲突逐处看,别--force # 解决冲突后提交 →再造发布 大白话 fork 的核心不是写代码是**维护节奏**——你的定制永远固定在bird 分支上官方更新用 merge 带进来。冲突不可避免但每处冲突都是你为什么偏离官方的机会。---第三部分编译/发布层的完整设计与代码 build-bird.sh ——信创自适应一键编译 #!/bin/bash#build-bird.sh ——产物:/opt/birdphp/bin/phpset-euo pipefail SRC$(cd $(dirname$0)/../source pwd)PREFIX/opt/birdphp #1.按 CPU 定CFLAGS(信创核心)ARCH$(uname-m)case$ARCHin aarch64)ifgrep-qiEaes|sha1|pmull/proc/cpuinfo;then CFLAGS-O2 -marcharmv8.2-arcpcsimdcrypto -mtuneneoverse-n1elseCFLAGS-O2 -marcharmv8-a;fi;;loongarch64)CFLAGS-O2 -marchloongarch64;;x86_64)CFLAGS-O2 -marchx86-64-v2;;esac export CFLAGS LDFLAGS$LDFLAGS#2.configure:只编你要的cd$SRC./buildconf--force./configure \--prefix$PREFIX \--enable-cli--enable-fpm \--enable-opcacheyes--enable-opcache-jityes \--with-openssl--with-curl--with-zlib \--with-sqlite3--with-pdo-sqlite \--enable-mbstring--enable-intl \--with-pcre-jit \--enable-bird-core$([-d$SRC/ext/birdcore]echo yes||echo no)\ CFLAGS$CFLAGS21|tee/tmp/bird-configure.log #3.编测试make-j$(( $(nproc)/2 ))make-j$(( $(nproc)/2 ))test/tmp/bird-make-test.log21||true #4.装放默认配置make install mkdir-p $PREFIX/etc cp build/configs/php.ini.bird $PREFIX/etc/php.ini cp build/configs/php-fpm.bird.conf $PREFIX/etc/php-fpm.conf #5.版本指纹(你的发行版打个标)$PREFIX/bin/php-r echobird-php ,PHP_VERSION, (arch,php_uname(m),)\n; echo✅ 完成: $PREFIX/bin/php怎么做到版本带你的品牌核心PHP 支持自定义版本串。改 main/php_version.h 或 configure 里// main/php_version.h ——或你的构建里 sed 替换:#definePHP_VERSION8.3.14-bird1# 编译后能区分这是你的发行版:php-v#PHP8.3.14-bird1(cli)(built:...)(NTS)# ★团队一眼知道跑的是你的定制版,方便运维定位---第四部分内核定制层——每项定制做成可开关的patch架构思想 你的每一项引擎级改动不要直接写死在 fork 里否则维护冲突爆炸而是做成一个 patch 文件构建时按需 git apply。 patch 管理脚本 #!/bin/bash#apply-patches.sh ——应用(或不应用)一组内核 patchPATCH_DIR$(dirname $0)/../src-custom/patchescd$(dirname $0)/../sourceACTION${1:-apply}# apply/revert/listforp in$PATCH_DIR/*.patch; do case $ACTION in apply) echo ▶应用 $p; git apply $p 21 || echo 跳过(已存在?) ;; revert) echo ◀撤销 $p; git apply -R $p 21 || echo 跳过(不存在?) ;; list) echo patch: $p ;; esac done 示例 patch给 SQLite 扩展加一个你的辅助函数 # src-custom/patches/001-sqlite-bird-helpers.patch --- a/ext/pdo_sqlite/sqlite_driver.c b/ext/pdo_sqlite/sqlite_driver.c ... (在函数表上加一行) ... ZEND_FE_END }; 真实 patch 是三段式统一 diff。这里演示意图每个引擎改动 一个文件、可单独开/关、构建时可回退。 为什么必须这么做 ①官方升级 merge 冲突时, 你能临时撤掉你的 patch →merge →再 apply ②每个 patch 可单独验证/回归 ③团队能看到你偏离官方多少、都改了什么 --- 第五部分业务扩展层——birdcore你的核心竞争力 这是你 fork 里最值钱的部分专门给 birddb 写的 C 扩展把热点逻辑下沉到 C慢的可能快 10 倍。 完整 birdcore 扩展 /* ext/birdcore/birdcore.c */#includephp.h#includestdio.h#includestring.h/* ——①一个给税务数据去重的快速哈希(比 PHP 循环快) ——*/PHP_FUNCTION(bird_key){char*sci;size_tlen;ZEND_PARSE_PARAMETERS_START(1,1)Z_PARAM_STRING(sci,len)ZEND_PARSE_PARAMETERS_END();/* 简单的 FNV-1a 64 位哈希, 已做小写化(去重友好) */uint64_th0xcbf29ce484222325ULL;for(size_ti0;ilen;i){charcsci[i];if(cAcZ)c32;/* 学名小写归一 */h^(uint8_t)c;h*0x100000001b3ULL;}charbuf[24];snprintf(buf,sizeof(buf),%llx,(unsignedlonglong)h);RETURN_STRING(buf);}/* ——②一个二进制快速比较(学名是否含异常字符) ——*/PHP_FUNCTION(bird_valid_latin){char*s;size_tlen;ZEND_PARSE_PARAMETERS_START(1,1)Z_PARAM_STRING(s,len)ZEND_PARSE_PARAMETERS_END();/* 学名字符白名单: 字母 空格 短横 点 括号 */for(size_ti0;ilen;i){unsignedcharcs[i];if((cAcZ)||(cacz)||c ||c-||c.||c(||c)||c\)continue;RETURN_FALSE;/* 发现异常字符 */}if(len0)RETURN_FALSE;RETURN_TRUE;}/* ——函数表 ——*/staticconstzend_function_entry birdcore_functions[]{PHP_FE(bird_key,arginfo_bird_key)PHP_FE(bird_valid_latin,arginfo_bird_valid_latin)PHP_FE_END};zend_module_entry birdcore_module_entry{STANDARD_MODULE_HEADER,birdcore,birdcore_functions,NULL,NULL,NULL,NULL,NULL,1.0.0,STANDARD_MODULE_PROPERTIES};#ifdefCOMPILE_DL_BIRDCOREZEND_GET_MODULE(birdcore)#endif在你业务里用?php// ①去重: 以前 PHP 循环处理 10 万行, 现在一把哈希:$seen[];foreach($rows as $row){$keybird_key($row[sci_name]);// 比 mb_strtolowermd5 快if(isset($seen[$key]))continue;// 撞 key 重复$seen[$key]1;import($row);}// ②校验学名格式(比正则快):if(!bird_valid_latin($sci)){manual_review($sci);}大白话 birdcore 是把你的分类学去重/校验从 PHP 循环沉到 C这是发行版真正加速业务的地方——不是把整个PHP 改快而是把最热的3个函数变成本地代码。---第六部分加固层——默认安全的php.ini版本指纹 build/configs/php.ini.bird你的默认配置,加固品牌;═══════════ bird-php 默认配置 ═══════════;行为:开箱即用就是加固版 ——团队不用自己记得改[PHP];——性能 —— zend_extensionopcache.so opcache.enableOn opcache.memory_consumption128opcache.interned_strings_buffer8opcache.max_accelerated_files20000opcache.validate_timestamps1opcache.revalidate_freq2opcache.fast_shutdown1;JIT 由 build 时决定,默认关(稳),团队按需单独开;opcache.jittracing;——安全(开箱即安全)—— expose_phpOff display_errorsOff log_errorsOn error_log/var/log/birdphp/php-errors.log error_reportingE_ALL date.timezoneAsia/Shanghai mbstring.internal_encodingUTF-8session.use_strict_mode1session.cookie_httponly1session.cookie_samesiteLax disable_functionsexec,passthru,shell_exec,system,proc_open,popen,proc_get_status,proc_terminate,posix_kill,posix_setuid,dl,putenv,symlink,link,pcntl_exec,pcntl_fork---第七部分测试层——你的发行版必须双轨测试关键原则 改内核/加扩展后,你要跑两层测试 ①官方回归:make test ——确认你没弄坏 PHP 本身 ②你的冒烟业务回归:smoke/*.phpt phpunit ——确认业务没坏 双轨缺一不可 ——一层证明PHP 没坏, 一层证明你的业务没坏 ci-test.sh #!/bin/bash set -e cd source # 层1: 官方回归(只看失败数量) make -j$(( $(nproc)/2 )) test /tmp/upstream-test.log 21 || true grep -E Number of (passed|failed) tests /tmp/upstream-test.log | tail -2 # 层2: 你的业务冒烟 for t in ../tests/smoke/*.phpt; do ./sapi/cli/php run-tests.php $t || echo ❌ 冒烟失败: $t done ./sapi/cli/php ../tests/smoke/smoke_golden.php # 层3: 压测基线(可选, 每次发布记录) #./sapi/cli/php ../tests/perf/bench.php 你的冒烟 .phpt 示例 --TEST-- bird_key normalizes latin case --FILE-- ?php var_dump(bird_key(Passer domesticus)); var_dump(bird_key(passer domesticus)); // 应相同(小写归一) --EXPECT-- string(16) 同一个小写哈希 string(16) 同一串 --- 第八部分持续交付——C把定制变成可发布的正式版本 完整 CIGitLab 示例 # .gitlab-ci.yml ——bird-php 发行 stages: [build, test, package, release] build: stage: build script: - bash build/build-bird.sh # 产出 /opt/birdphp test: stage: test script: - bash ci/ci-test.sh # 官方冒烟 双轨 package: stage: package script: - bash build/package.sh # 打成 tar/rpm artifacts: paths: [dist/] release: stage: release only: [tags] # 打 tag 才发布正式版 script: - ssh apptarget bash /opt/deploy-bird.sh environment: production package.sh打成 tar 带版本指纹 #!/bin/bash VERSION$(/opt/birdphp/bin/php -r echo PHP_VERSION;) # 含 your tag mkdir -p dist tar czf dist/birdphp-$VERSION-linux-$(uname -m).tar.gz \ -C /opt birdphp echo 产物: dist/birdphp-$VERSION-$(uname -m).tar.gz --- 第九部分源码剖析——读你自己fork 的那几行 上面都是工程。这一节回答魔改发行版的心脏——你敢改内核得先会读它。三处最该看的源码都围绕你的场景 ①编译如何变成可执行: Zend/zend_execute.c 的入口调度 →理解op_array 驱动执行 ②扩展如何注册: main/internal_functions.c(或 ext/XXX) →理解函数表 扩展与 PHP 的契约(呼应前面扩展篇) ③配置如何生效: main/main.c 的 php_ini 解析 →理解你改的 php.ini 怎么影响引擎 大白话框架不用全会会读即可 PHP 一切运转都围绕三张表: ①函数表 EG(function_table) ——每个函数名 →它的 handler ②类表 EG(class_table) ——每个类名 →zend_class_entry ③常量表 EG(zend_constants) ——常量名 →zend_constant 你的 fork 往这三张表塞你定制的东西(扩展/函数/常量/ini项) 你的内核 patch 改引擎怎么处理这些表(opcode/JIT/GC) --- 第十部分一张魔改发行版架构全景图收尾 bird-php fork (git: bird-customize 分支, 定期 merge upstream) │ ├─ build/ →一键编译(CFLAGS按CPU) 打包(rpm/tar) 默认配置 ├─ src-custom/ →内核patch(每项独立文件, 可开/关/回退) ├─ ext/birdcore/ →业务C扩展(去重/校验下沉到C, 快10倍) ├─ 加固/指纹 →开箱即安全 PHP 版本号带 -bird1 品牌 ├─ tests/ →双轨(官方make test 你的冒烟) └─ ci/ →CI test→package→release(打tag才发) │ ▼ 产物: birdphp带全部定制, 可复现, 可回滚, 版本带品牌 --- 三条压轴原则魔改发行版最值钱的心得 1. fork 的命脉是维护节奏不是写代码你的定制全锁在独立分支 patch 文件官方更新用 merge 带进来。每处 patch 独立、可单开单关冲突才不会失控。 2. 改快的正确姿势 把最热的 3 个函数沉到 Cbirdcore而不是把整个 JIT 魔改一顿。发行版加速业务 定位热点 →下沉 C发行版改内核 读理解 乱动。 3. 一切改动要能测、能回滚、能品牌化双轨测试官方 test 你的冒烟、打 tag 才发布、版本号带 -bird 指纹——这样团队才敢长期用你的定制版。

相关新闻

Mac上Java环境搭建:从JDK安装到多版本管理的完整指南

Mac上Java环境搭建:从JDK安装到多版本管理的完整指南

2026/8/17 15:36:09

1. 为什么Mac上的Java环境总让人“又爱又恨”?如果你刚拿到一台新的Mac,或者准备开始学习Java、Spring Boot,又或者需要运行某个依赖特定Java版本的老项目,安装和配置Java环境几乎是绕不开的第一步。这事儿听起来简单,…

小程序隐私协议实战指南:从合规到体验的完整开发方案

小程序隐私协议实战指南:从合规到体验的完整开发方案

2026/8/17 15:36:09

1. 从“合规”到“体验”:为什么隐私协议不再是摆设 最近和几个做小程序的朋友聊天,发现一个挺有意思的现象:一提到“隐私协议”,大家的第一反应往往是“哦,那个弹窗啊,找个模板抄一下,让法务看…

FreeRTOS之事件标志组

FreeRTOS之事件标志组

2026/8/17 15:36:09

事件标志组用于任务间通信或同步 事件标志组和全局变量 全局变量一般用在无RTOS的程序中,因此程序对全局变量的访问是顺序的,全局变量对于每一个访问它的程序来说都是最新值事件标志组一般用在多任务系统中,多任务使用事件标志组可以防止访问…

华为IPD流程各阶段370个活动详解-(一) 概念阶段流程与活动

华为IPD流程各阶段370个活动详解-(一) 概念阶段流程与活动

2026/8/17 16:36:11

华为IPD流程涵盖了产品从概念到上市的完整过程,各阶段活动明确且相互衔接。在概念启动阶段,产品经理和项目经理分析可行性,PAC评审后成立PDT。概念阶段则包括产品描述、市场定位、投资期望等内容的确定,同时组建PDT核心组并准备项目环境。团队培训涵盖团队建设、流程、业务…

AI智能体架构实战:记忆存储、上下文压缩与网关集成

AI智能体架构实战:记忆存储、上下文压缩与网关集成

2026/8/17 16:36:11

1. 先搞清楚 Hermes AI 智能体架构到底在解决什么问题 如果你正在研究或计划构建一个能长期运行、具备“记忆”和“思考”能力的 AI 智能体,那么 Hermes 这类架构设计就是你绕不开的核心。它不是一个具体的产品,而是一套工程化的设计模式,核心…

【电感三点式的振荡电路】2024-12-25

【电感三点式的振荡电路】2024-12-25

2026/8/17 16:36:11

缘由关于#硬件工程#的问题:想用ads搭建一个如上图所示的电感三点式的振荡电路_硬件开发-CSDN问答 从框图信号推导供电应该用双电源方案。 放光般若經卷第十九 西晉于闐國三藏無羅叉奉 詔譯 摩訶般若波羅蜜無形品第八十一 須菩提白佛言:「世尊&#xff…

M8HeadlessFirmware 版本演进史:从1.0到6.5,六年免费更新的完整历程

M8HeadlessFirmware 版本演进史:从1.0到6.5,六年免费更新的完整历程

2026/8/17 16:36:11

M8HeadlessFirmware 版本演进史:从1.0到6.5,六年免费更新的完整历程 【免费下载链接】M8HeadlessFirmware M8 Headless Precompiled Firmware 项目地址: https://gitcode.com/gh_mirrors/m8/M8HeadlessFirmware M8HeadlessFirmware 是一个专为 Te…

构建企业级AI智能体:持久记忆、上下文压缩与模型网关架构实战

构建企业级AI智能体:持久记忆、上下文压缩与模型网关架构实战

2026/8/17 16:36:11

在构建复杂AI应用时,如何让智能体拥有持久的记忆、高效处理超长对话,并灵活接入多种大模型,是每个开发者都会遇到的工程挑战。传统的简单调用API方式,在应对多轮交互、知识沉淀和系统集成时往往力不从心。本文将深入拆解一个名为H…

提示词调优指南:让SciPhi-Triplex-4bit输出高质量三元组的7个技巧

提示词调优指南:让SciPhi-Triplex-4bit输出高质量三元组的7个技巧

2026/8/17 16:26:11

提示词调优指南:让SciPhi-Triplex-4bit输出高质量三元组的7个技巧 【免费下载链接】SciPhi-Triplex-4bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/SciPhi-Triplex-4bit SciPhi-Triplex-4bit 是一款基于 MLX 框架的 4bit 量化语言模型&a…

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

【文章复现】非线性值迭代自适应动态规划(ADP):离散时间非线性系统的策略迭代自适应动态规划算法研究附Matlab代码

2026/8/17 1:28:42

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

【双层规划,节点出清价,绿证交易,CVaR方法】两级电力市场环境下计及风险的省间交易商最优购电模型附Matlab代码

2026/8/16 0:04:13

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

隐式mpc+自适应mpc+时变mpc,线性时变模型预测控制附Simulink仿真

2026/8/17 8:40:51

✅作者简介:热爱科研的Matlab仿真开发者,擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。🍎 往期回顾关注个人主页:Matlab科研工作室👇 关注我领取海量matlab电子书和…

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

LabVIEW异步调用实战:从原理到生产者消费者模式,解决界面卡顿与并行处理难题

2026/8/17 0:05:22

1. 项目概述:为什么异步调用是LabVIEW进阶的必修课? 如果你用LabVIEW做过稍微复杂点的项目,尤其是涉及界面响应、多任务并行或者硬件IO等待的场景,大概率遇到过这样的窘境:前面板点个按钮,整个程序就“卡死…

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

LabVIEW异步调用实战:解决界面卡顿与并行处理难题

2026/8/17 0:05:22

1. 项目概述:为什么异步调用是LabVIEW进阶的必经之路如果你在LabVIEW里写过稍微复杂点的程序,尤其是涉及到界面响应、多任务并行或者硬件IO等待,大概率会遇到一个头疼的问题:程序“卡”住了。前面板点不动,进度条不更新…

飞书局域网文件传输实战:3种方案实现高速点对点传输

飞书局域网文件传输实战:3种方案实现高速点对点传输

2026/8/17 0:05:22

1. 项目概述:为什么要在局域网内用飞书传文件? 飞书作为一款主流的协同办公套件,其核心功能是围绕云端协作设计的。无论是文档、表格还是文件,通常的分享逻辑都是“上传到云端 -> 生成链接 -> 分享给同事”。这个流程在互联…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/17 12:00:53

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/15 10:10:27

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/14 19:35:14

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…