Chromium 定制版 PGO 实战:Chrome 与 V8 Builtins 两套体系以及打包踩坑

chromium ARM版本编译记录 刚开始想着一步到位直接在阿里云香港主机上买高配置的竞价虚拟机,结果居然编译不过,老是报有个东西没安装,试了好几次都不行,本来都计划放弃了的。我机器编译大概一两个小时,看机器配置,编译完成后,网上很多文章说直接运行chrome就行,但我拷贝到飞腾机器上直接运行报错。这个过程报了个错,看了下是拉谷歌字体的时候用的个Py调用的curl,Py里面没法把环境变量的代理传进去,手工编辑下。原因是部分通用的H264 解码codec没编译进去,解决办法就是在生成配置的时候添加2个参数重新编译就好了。接下来开始配置并编译。 阅读详情

本文基于一次真实升核(M148 / V8 14.8.x)打包与 PGO 训练整理


前言:为什么 PGO 会「编着编着就缺文件」

切到 Official Release + PGO Phase 2 后,常见报错:

../../v8/tools/builtins-pgo/profiles/x64-rl.profile

needed by snapshot_blob.bin -> gen/v8/embedded.S

missing and no known rule to make it

这往往不是 snapshot 坏了,而是 Chrome 主程序 PGO 与 V8 Builtins PGO 是两套机制:只提交了 Chrome 的 *.profdata,却默认打开了 V8 builtins 优化,构建在 schedule 阶段就失败。


一、两套 PGO:别混成一个「PGO 包」

Chrome PGOV8 Builtins PGO

优化对象

chrome.dll 等 C++

V8 builtins(mksnapshot / snapshot)

训练产物

*.profdata

x64-rl.profile 等

训练工具

tools/pgo/generate_profile.py

官方下载或 v8/tools/builtins-pgo/generate.py

Phase 2 开关

chrome_pgo_phase=2

v8_enable_builtins_optimization=true(Phase 2 默认常开)

is_official_build=true

→ chrome_pgo_phase=2

→ v8_enable_builtins_optimization 默认为 true(若未显式关闭)

→ Windows x64 需要 x64-rl.profile

Chrome profdata 有了 ≠ V8 profile 有了。


二、Chrome PGO:Phase 1 与 Phase 2

Phase 1:插桩采集

  • GN:chrome_pgo_phase=1
  • 编译带 -fprofile-generate
  • 插桩版浏览器跑 benchmark → .profraw → llvm-profdata merge → profile.profdata

python3 tools/pgo/generate_profile.py -C out/PGOPhase1

需要 完整源码树 + Phase 1 输出目录,不能只有二进制。

Phase 2:用 profile 优化

  • -fprofile-use=...profdata + ThinLTO
  • 链接 chrome.dll 通常最慢
  • CI 若每次 clean 全量,每次都像第一次全编

三、Phase 1 链接坑:升核后 fork 与上游 API 类型不一致

Phase 1 除了「能编过、能跑 benchmark」,还可能遇到 链接阶段 才暴露的问题。下面是一次 M148 升核 + chrome_pgo_phase=1 时的案例(扩展工具栏 ViewModel),与 V8 profile 无关,但 不做修复就过不了 Phase 1,也就训不出 Chrome profdata。

3.1 现象

在 args.gn 中设置:

chrome_pgo_phase = 1

# fork 定制宏已开启(如扩展工具栏仍走 vector 顺序语义)

执行:

autoninja -C out/Release chrome

chrome.dll 链接失败,lld-link 报 undefined symbol,符号栈与 base::flat_tree / flat_set 析构相关——表面看像 STL 或 libc++ 链接问题,实际是 接口返回类型与底层实现不一致 在 PGO 插桩 下被放大。

3.2 根因(148 上游 vs fork 历史行为)

148 上游把 ExtensionsToolbarViewModel::GetAllActionIds() 改成了返回 const base::flat_set<ActionId>&,与 ToolbarActionsModel::action_ids() 对齐。

定制 fork 在 产品宏分支 下仍保留 ToolbarActionsModel::action_ids() 返回 std::vector<ActionId>&(扩展工具栏顺序语义依赖 vector,而非 sorted flat_set)。

若 ViewModel 仍声明返回 flat_set&,实现里却 return actions_model_->action_ids():

  1. 编译器对 vector → flat_set 做隐式转换,构造 临时 flat_set
  2. 函数返回的是 临时对象的引用(本身已是危险写法)
  3. PGO Phase 1 插桩 下,flat_tree 析构路径 无法如 Release 那样内联
  4. 链接器找不到对应符号 → chrome.dll 链接失败

非 PGO 或 Phase 0 构建有时能「侥幸过」或表现不同;Phase 1 是更严格的照妖镜。

3.3 修复思路(与上游分叉的最小对齐)

在 fork 宏分支 让声明、实现与底层 同一类型——返回 const std::vector<ActionId>&,直接转发 action_ids(),避免任何 vector→flat_set 临时对象:

#ifdef FORK_EXTENSIONS_TOOLBAR /* 示意:你们实际的 fork 宏名 */

const std::vector<ToolbarActionsModel::ActionId>&

ExtensionsToolbarViewModel::GetAllActionIds() const {

return actions_model_->action_ids();

}

#else

const base::flat_set<ToolbarActionsModel::ActionId>&

ExtensionsToolbarViewModel::GetAllActionIds() const {

return actions_model_->action_ids();

}

#endif

HasAnyExtensions() 在 fork 分支改为 直接读 action_ids().empty(),不要再经可能触发转换的 GetAllActionIds():

bool ExtensionsToolbarViewModel::HasAnyExtensions() const {

#ifdef FORK_EXTENSIONS_TOOLBAR

return !actions_model_->action_ids().empty();

#else

return !GetAllActionIds().empty();

#endif

}

头文件同步改返回类型,并加注释说明:禁止在 fork 路径返回 flat_set&,否则 PGO 链接可能再炸。

3.4 测试建议

项做法

链接

chrome_pgo_phase=1,autoninja -C out/Release chrome,确认 chrome.dll 链接通过

功能

启动浏览器:扩展工具栏图标显示、拖拽、溢出菜单

回归

Phase 0 / Phase 2 各编一次,确认无新增链接错误

3.5 对 PGO 流程的启示

升核 → 先过 Phase 1 链接 + 能启动

→ 再 generate_profile.py 训 profdata

→ 再 Phase 2 + V8 profile

Phase 1 链接问题 和 Phase 2 缺 x64-rl.profile 是 不同阶段、不同层 的故障:

阶段典型错误性质

Phase 1

lld-link undefined symbol(flat_set/flat_tree)

fork 与 148 API 类型不一致 + 插桩

Phase 2

missing x64-rl.profile

V8 builtins PGO 文件缺失

升核合并时,建议对 flat_set / span / 容器类型变更 做专项 grep:凡 fork 仍用 vector 的模型,上层 ViewModel 不要声明成 upstream 的 flat_set&。


四、V8 Builtins PGO:官方包 vs 自训

4.1 官方 profile

https://storage.googleapis.com/chromium-v8-builtins-pgo/by-version/{V8四段版本}/meta.json

https://storage.googleapis.com/chromium-v8-builtins-pgo/by-version/{V8四段版本}/x64-rl.profile

版本来自 v8/include/v8-version.h(如 14.8.178.4),不是 Chrome 产品号。
meta.json 里 revision 需与 DEPS 的 v8_revision 一致 再用。

4.2 x64.profile vs x64-rl.profile

  • Windows 正式构建:x64-rl.profile
  • Linux/macOS + Clang:x64.profile

4.3 内网镜像 404、Google 有

多为 镜像未同步 chromium-v8-builtins-pgo 桶。

4.4 自训难点(摘要)

Windows 要 -rl、GN 须与正式 Release 一致、benchmark 环境、每次 bump V8 重做、profile 默认 gitignore。revision 对齐时 优先官方。


五、推荐策略(决策树)

升核 / 出包

├─ Phase 1

│ ├─ chrome.dll 链接过? → 修 fork/上游 API 不一致(如 GetAllActionIds)

│ └─ generate_profile.py → profdata

├─ Phase 2

│ ├─ Chrome:pgo_data_path / 已提交 profdata

│ └─ V8:x64-rl.profile(官方 revision 对齐)或 v8_enable_builtins_optimization=false

└─ CI:确认 gn gen 真正传入 extra_args

务实组合:Chrome profdata 自训;V8 x64-rl.profile 用官方(revision 一致时)。


六、换机器训练 Chrome PGO 要带什么

  1. 同 commit 完整 src
  2. Phase 1 的 out/(去掉 obj/、*.pdb 可瘦身)
  3. llvm-profdata
  4. 定制主程序若不叫 chrome.exe,需与 generate_profile.py 期望名对齐(复制/改名)

七、Phase 2 编译慢

场景体验

首次全量

很慢

同目录无改动

增量几乎为 0

CI 每次 clean

每次都慢


八、官方 V8 下载(示例 14.8.178.4)

https://storage.googleapis.com/chromium-v8-builtins-pgo/by-version/14.8.178.4/meta.json

https://storage.googleapis.com/chromium-v8-builtins-pgo/by-version/14.8.178.4/x64-rl.profile

放置:

v8/tools/builtins-pgo/profiles/meta.json

v8/tools/builtins-pgo/profiles/x64-rl.profile


九、总结

  1. Chrome PGO 与 V8 Builtins PGO 两套文件、两套流程。
  2. Phase 1 要先过 链接 + benchmark;fork 与 148 返回类型 不一致会在 PGO 插桩下触发 lld-link。
  3. Phase 2 常见缺 x64-rl.profile;Windows 勿用 x64.profile 顶替。
  4. 官方 V8 profile 在 revision 对齐时可直接用。
  5. CI 检查 gn gen 是否传入 v8_enable_builtins_optimization 等参数。

代码示例中的 FORK_EXTENSIONS_TOOLBAR 为脱敏占位符,请替换为你们仓库实际的 fork 宏名。

Chrome性能黑魔法:深入浅出PGO优化与实战指南 本文详解了PGO(配置文件引导优化)技术在Chrome浏览器编译中的关键作用。PGO通过插桩收集程序运行数据,指导编译器进行精准优化,使Chrome启动速度提升10%-14%,渲染性能提升18%-22%。文章提供了在Windows平台为Chromium源码开启PGO的详细教程,包括插桩构建、数据收集和最终优化三个步骤,并对比了手动与自动两种实现方式。同时指出PGO构建耗时较长但对性能提升显著,建议在配置较高的机器上进行。这项技术让编译器从"盲目猜测"转变为"数据驱动优化&quo 阅读详情

相关推荐

【MUJOCO控制篇-2】控制一个简单的机械臂

本篇博客将逐步分析和解释如何通过Python代码使用MuJoCo库来控制一个机械臂模型。我们将从加载模型开始,逐步深入到PID控制器的实现,最后讨论如何实现轨迹跟踪功能。上期内容为如何建模一个简单的机械臂模型,本篇文章将基于上篇内容进行深入探讨如何实现一个简单的控制。

echo_Fangyb的博客 6745

Linux 编译CEF源码详细记录

Linux CEF源码编译,支持音视频,H264功能

L-Super的博客 5733

BGE-M3 文本情感分类实战:预训练模型微调,导出ONNX并测试

本文介绍了如何基于BGE-M3开源模型实现一个简单的二分类情感分析任务,展示了NLP中经典的“预训练 + 微调”范式。首先,加载预训练模型和分词器,并构建分类头整合到模型中。接着,进行数据预处理并构建DataLoader。然后,定义优化器、损失函数和训练循环,进行模型微调。微调过程中,可以选择基于[CLS] token的单特征提取或基于池化策略的多特征融合。最后,通过验证与推理评估模型性能,并导出ONNX模型以适应生产环境。BGE-M3在语义表征任务中表现优异,适合作为文本分类、语义搜索等下游任务的基础模型

大鹏的专栏 1403

webrtc windows 参数说明

action_pool_depth Current value (from the default) = -1 From //build/toolchain/BUILD.gn:10 Pool for non goma tasks. aec_untrusted_delay_for_testing Current value (from the...

IS2120 2417

5G中的RedCap

5G中的redcap

大家好,我是码农老gou,一名专注于编程技术的程序员。在这个博客中,我将与大家分享我在工作和学习中的经验、见解以及一些实用的技术干货。 2527

VS Code + Codex 在 WSL 中使用的正确姿势

Codex 登录只能在本地完成。文件仍可通过 UNC 路径访问 WSL → 本地 Codex 就能照常工作。避免在 WSL 内重复安装/登录 Codex 扩展。

yangguangwuyue的博客 9816

源码编译CEF(branch=6045)+mp4+mp3笔记

接触Chromium已经过去多年了,一直都依赖别人编译的库,最近想自己整一个,所以有了这篇笔记。 环境要求:WIN10,内存16G,固态硬盘空间200G+,VS2022...

随风动,心飞翔 2582

卫星载荷应用方案

本文将从技术和应用层面探讨卫星载荷的应用方案,分析各个领域的特点和挑战,以期为卫星载荷的应用提供一定的指导和参考。卫星载荷应用方案涵盖了通信、地球观测、气象预报、导航定位等诸多领域在每一个领域中,都存在着不同的技术挑战和应用需求。随着技术的进步和需求的变化,卫星载荷应用方案将不断发展和完善,为人类社会的进步和发展做出更大的贡献。用户可以通过接收多颗卫星的信号,计算自身的位置和速度信息。在覆盖扩展方面,可以采用多星座、MEO、GEO 等不同轨道高度的卫星布局,结合卫星的特点和应用需求,实现覆盖范围的扩展。

muyangjun的专栏 904

Electron 专属 PGO Profile 生成体系深度解析:为发布构建定制 Profile-Guided Optimization 数据

PGO(Profile-Guided Optimization,profile 引导优化)是 Electron 发布构建获得额外性能的关键手段。本篇基于 Electron 仓库 [script/pgo](https://link.gitcode.com/i/4ede41dac556b4e6c78dba88c5801636) 的完整基础设施,系统讲解 Electron 为何不能直接复用 Chromi

gitblog_01006的博客 508

Halcon 色彩标定:RGB空间下实现白平衡与CCM矩阵合成静态HDR图像

摘要 本文介绍了一种基于Halcon的色彩校正方法,结合白平衡与灰轴约束最小二乘法实现精准颜色还原。方法分为三步:1)自动定位色卡区域并提取灰阶块计算白平衡增益;2)通过前三列色块建立测量值与标准值的映射关系;3)引入灰轴约束条件求解色彩校正矩阵(CCM),确保中性灰区域不偏色。算法采用中位数计算白平衡增益以提高鲁棒性,并通过旋转校正处理色卡倾斜问题。实验表明,该方法能有效消除相机采集的系统色偏,适用于颜色测量、表面检测等机器视觉场景。文末提供了完整代码实现。

LIN943168247的博客 403

PyTorch实战(20)——生成对抗网络(Generative Adversarial Network,GAN)

自生成对抗网络 (Generative Adversarial Network, GAN) 提出以来,一直是一个活跃的研究和开发领域。本节探索了 GAN 的基本概念,重点解析了其两大核心组件——生成器与判别器的架构设计,深入阐述了 GAN 模型的整体工作机制,并使用 PyTorch 从零开始实现了深度卷积生成对抗网络 (Deep Convolutional GAN, DCGAN)。

盼小辉丶的博客 3498

Thorium浏览器技术架构:基于Chromium的高性能优化解决方案

现代浏览器面临的核心技术挑战在于性能优化与资源消耗之间的平衡。传统Chromium浏览器虽然功能丰富,但在编译优化、内存管理和执行效率方面仍有改进空间。Thorium浏览器作为Chromium的深度优化分支,通过系统级的编译优化和架构调整,在保持完整Chrome生态兼容性的同时,显著提升了执行效率和资源利用率。 ## 技术架构与核心原理 Thorium的技术架构建立在Chromium基础之上,

gitblog_00671的博客 767

人工智能训练师(三级)操作技能考核·自测卷

为您定制了一份。这份试卷严格拆分了“业务分析”、“智能训练”、“智能系统设计”、“培训与指导”四大模块,所有填空题均来源于上一轮整理的。您可以先用它进行“第二步(抛开答案自己填)”,填完后对照末尾的答案速查进行“第一步(补全并运行)”的校验,最后标记错题进行“第三步(针对性重复练习)”。

suny8088的博客 102

Thorium 浏览器实测:一份按 CPU 指令集出包的 Chromium 分支,值得换掉 Chrome 吗?

如果你最近发现 Chrome 变得又重又啰嗦,而 Firefox 又跑不动你依赖 Widevine 的视频站点,那 Linux 桌面上还有一个不太起眼的选择:**Thorium 浏览器**。它是以第 90 号元素钍命名的 Chromium 分支,始终跟随最新的 Chromium LTS,主打三件事——编译期的性能优化(ThinLTO + PGO + 按 CPU SIMD 指令集分级出包)、开箱即用

gitblog_00660的博客 844

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Thorium:为速度而生的Chromium分支浏览器,值得你花时间了解

Thorium浏览器是一个基于最新 Chromium LTS 版本的开源浏览器分支,核心卖点是在编译阶段做足功夫:LTO 链接时优化、PGO 性能配置、V8 专项开关全部打开,再按 CPU 指令集拆分成 SSE3、SSE4.1、AVX、AVX2 多个版本,让你装完就有"开箱即快"的效果。隐私也是默认项,DoH、Do Not Track、GPC、禁用 FLOC 都直接内置。适合对 Chrome 的速

gitblog_00867的博客 391

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Thorium 浏览器:按 CPU 指令集分发的优化版 Chromium,AVX2 变体怎么选

Thorium 浏览器是一个基于 Chromium LTS 分支深度定制的开源浏览器 fork:它不改写浏览器功能,而是通过编译器优化和面向不同 CPU 指令集(SIMD,单指令多数据,即让 CPU 一次并行处理一批数据)的编译变体来加速渲染、JavaScript 执行与媒体解码这类计算密集任务,同时默认内置 HEVC 硬解、Widevine 和一组隐私防护。这篇文章带你从下载选版本、看懂构建参数

gitblog_00933的博客 344

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Thorium 浏览器 Linux 构建实战:从零跑通高性能 Chromium 分支的完整指南

Thorium 浏览器是 Chromium LTS 的高性能分支:默认拉满 LTO、PGO 与按 CPU 指令集的专项编译,重计算页面的启动与渲染因此更快——选对 AVX2 或 SSE 构建,优势从第一次启动就兑现。 ## Thorium 定位:与通用 Chromium 构建的差别 Thorium 面向想拿满 Chromium 全部能力、同时追求编译层极限优化的 Linux 用户。它不改动浏览

gitblog_00909的博客 473

Thorium 浏览器完整指南:如何选对 SIMD 版本,让 Chromium 在任何 CPU 上跑更快

如果你的电脑不是旗舰配置,或者受够了 Chrome 里被砍掉的功能,可以看看 Thorium——一个以元素周期表第 90 号元素"钍"命名的 Chromium 深度优化分支,与 Chrome 保持核心兼容,同时叠加编译器优化、按硬件区分的 SIMD 构建和默认开启的隐私补丁。 **核心卖点:** - **它是什么**:基于 Chromium 最新 LTS 版(当前为 M130)的开源分支,界面

gitblog_00047的博客 321

Thorium浏览器:基于Chromium的极致性能优化与隐私增强解决方案

Thorium浏览器是一款以放射性元素"钍"命名的Chromium深度优化分支,专为追求极致性能、隐私保护和媒体兼容性的技术用户设计。与标准Chromium相比,Thorium通过先进的编译器优化技术、SIMD指令集定制构建以及全面的隐私增强功能,重新定义了现代浏览器的性能边界和用户体验。 ## 项目定位与价值主张 Thorium的核心价值在于为技术爱好者和高级用户提供一个既保持Chromiu

gitblog_01144的博客 676

Thorium SSE3 构建配置详解:用 GN 参数把 Chromium 的 SIMD 基线锁定在 SSE3

本文基于 [other/SSE3/README.md](https://link.gitcode.com/i/43e057d39dcfb5ab513c8cf910271091) 展开,讲清该目录下三套 GN 构建配置(Linux x64、Windows 32 位、Windows 64 位)如何通过 `use_sse3 = true` 并关闭所有更高级指令集,把 Thorium(一个 Chromiu

gitblog_01093的博客 829

5大核心优化技术深度解析:Thorium浏览器如何实现极致性能与隐私保护

Thorium浏览器是一款基于Chromium深度优化的高性能浏览器,通过先进的编译优化技术和隐私增强功能,为技术爱好者和高级用户提供超越标准Chrome的浏览体验。这款以放射性元素"钍"命名的浏览器不仅继承了Chromium的所有功能,更在性能、隐私和媒体支持方面进行了革命性改进,成为追求极致浏览体验用户的理想选择。 ## 技术架构解析:编译优化的科学原理 ### SIMD指令集优化:CPU

gitblog_00400的博客 670

V8 源码检出与开发工作流完全指南:从 fetch 到提交、审查与落地

> 本篇指南以 V8 官方文档 [docs/source-code.md](https://link.gitcode.com/i/9b696773e714dfdfcb766605e8af76ac) 为主体,系统讲解如何在本地完整检出 V8 源码(含全部分支与依赖)、如何保持仓库与依赖同步、如何通过 Gerrit/Commit Queue 提交代码审查并最终落地(land)修改。读完本文,你将掌握一

gitblog_00038的博客 686

Thorium 浏览器:快 3 倍的 Chromium 编译优化深度拆解

打开 20 个标签页后,内存条被吃到 6GB、滚动开始掉帧——这是大多数 Chromium 内核浏览器的日常。Thorium 走的路径不同:它不改引擎架构,而是在编译期把参数调到极限,官方构建在同类硬件下冷启动压到 0.8~1.2 秒,10 标签页内存约 820~880MB,比标准 Chromium 的 1400MB 以上降了 40% 左右。这份拆解带你看完它到底改了哪些编译开关、怎么分档落地,以

gitblog_00804的博客 191

突破性性能优化:Thorium浏览器为何比Chrome快30%

Thorium是一款基于Chromium开发的开源浏览器,以元素周期表中第90号元素钍(Thorium)命名。这款浏览器专为追求极致性能、隐私保护和个性化体验的技术用户设计,通过深度编译优化和隐私增强功能,为用户提供比Chrome更安全、更高效的浏览体验。🚀 ## 问题:为什么你需要超越Chrome的浏览器? 在日常使用中,你是否遇到过以下痛点? - **隐私担忧**:Chrome的数据收

gitblog_00240的博客 384

Thorium浏览器深度优化:基于SIMD指令集的极致性能架构解析

Thorium浏览器作为Chromium的深度优化分支,通过多版本SIMD指令集优化、编译参数调优和隐私保护增强,为技术开发者和高级用户提供了性能提升40%以上的企业级浏览器解决方案。该项目专注于编译优化技术栈,针对不同CPU架构提供从SSE2到AVX2的完整指令集支持,同时恢复了HEVC、JPEG XL等被移除的媒体格式,打造了兼顾性能与隐私的生产环境浏览器。 ## 技术背景与项目定位 Th

gitblog_01081的博客 651

Thorium浏览器如何通过深度优化实现3倍启动速度?性能与隐私的双重革命

当你每天打开浏览器时,是否曾因缓慢的启动速度而感到烦躁?是否担心浏览器在后台悄悄收集你的数据?Thorium浏览器正是为解决这些痛点而生。这款基于Chromium深度优化的开源项目,通过底层架构重构、指令集优化和隐私保护增强,不仅实现了3倍启动速度提升和40%内存节省的技术突破,还重新定义了现代浏览器的性能标准。 ## 问题根源:为什么传统浏览器越来越慢? 现代浏览器面临的核心问题可以归结为三

gitblog_00841的博客 335
上一篇: 从 NPAPI、PPAPI 到 Extension,再到 IE 兼容模式:浏览器内核架构是如何演进的(结合 Chromium 理解)
下一篇: 当AI越来越能干,我们该如何重新摆位?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ปรัชญา แค้วคำมูล

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值