Android端稳定性背后的那些事

Android性能优化——稳定性优化 APP 稳定性的维度 app 稳定一般指的是 app 能正常运行, app 不能正常运行的情况分为两大类,分别是 Crash 和 ANR。 Crash:运行过程中发生的错误,是无法避免的。 ANR:应用再运行时,由于无法在规定的时间段内响应完,系统做出的一个操作。 如何治理Crash 应用发生 Crash 是由于应用在运行时,应用产生了一个未处理的异常(就是没有被 try catch 捕获的异常)。这会导致 app 无法正常运行。 如果需要解决的话,就需要知道这个未处理的异... 阅读详情

下面我们以时间为主线,来介绍下SoulAPP Android端在持续有效控制APP稳定性方面,都做了哪些事情。

开发阶段

对于稳定性来说,如果APP已经到了线上才发现异常,那其实已经造成了损失,所以,对于稳定性的控制,预防大于优化。在APP上线前,充分暴露问题是重点,然而由于上线前没有大量实际用户使用,怎么及时暴露问题也是我们的一个痛点。

在开发阶段,我们做了如下一些工作,尽可能的在交给用户前保证APP的稳定性

研发方面
  • 技术方案Review:技术方案评审可以有效防止在方案层面出现一些耗 CPU、耗内存等的问题。是一个早期预防措施,可以避免后期开发和测试中出现一些不必要的问题。

  • SDK稳定性:在接入或升级三方 SDK 时,为了保证应用的稳定性,我们需多方面对 SDK 进行评估,同时要求三方提供稳定性报告。

  • 容灾过滤:在开发过程中,我们设置的一些稳定性兜底策略,经常会让一些问题在开发期间被兜住,得不到暴露。所以我们几乎任何的容灾手段,都会过滤掉开发包和测试包。

  • Lint编码规范:对于已经踩过的坑,我们总结了一些编码规范;但是规范经常只会停留在文档里,编码过程中很难注意到所有规范;因此,我们做了一些 Lint 编码检查,在代码编写期间发现问题并给出提示和报错。

  • 架构优化:架构层面我们主要通过能力收敛、统一容错来提升应用的可靠性。在架构优化过程中,我们沉淀了较多的基础库,对基础功能进行封装,在基础库里做好统一容错等稳定性防护。

  • Method Not Found检测:当公共库删除 public 方法后,如果调用的业务库没有同步修改,在以 aar 集成的方式中,编译期间不会报错;但是运行期会报 ClassNotFoundException 或 MethodNotFoundException 导致 Crash;我们做了个工具在测试回归期间和发布前进行检测。

测试方面
  • UI自动化:在每个版本发布前,我们都会进行 UI自动化测试。提高效率的同时,也保证了应用程序基本业务的稳定性和可用性。

  • Monkey:每天我们都会运行即将发布的版本的 Monkey 自动化测试,充分暴露性能问题。

  • 性能准出回归:在应用发布前,每个业务领域都会生成性能报告,包括各种业务场景下的 CPU 占用、内存、Crash、ANR 等多个方面。

  • 线下Crash 统计:对于即将上线的 APP 版本,稳定性方面做了特有的监控和报警,保证上线前及时发现潜在的稳定性问题。

灰度阶段

在开发阶段经过测试全量回归,在灰度发布阶段基本能保证没有重大问题。

但是有一些灰度期间发现的稳定性问题,线上紧急问题等经常会在灰度期间合入代码;由于灰度阶段后不会有测试全面回归所有功能,改动很容易出现不可预知的问题,直接影响到线上用户;所以灰度阶段我们会通过严格的流程保证APP稳定性。

同时,灰度因为有较多用户使用,能充分暴露开发阶段没有发现的问题,这一点是稳定性保障的中流砥柱。

新版本上线采用多轮灰度 → 全量 的发布模式,在新版本全量发布前,充分灰度暴露问题,将影响范围降至最低。

灰度发布流程

改动严格审核

灰度期间由于合入的代码只有针对改动的测试,缺少全量测试回归,所以尤其需要谨慎;合入代码的审核我们进行了更严格的流程管控,需要通过功能测试,Leader 代码 Review,测试 Review,都通过才能合入正式包。

正常合代码流程:

灰度合代码流程:

Crash&ANR及时监控和修复

由于在开发测试期间,只有少量的手机在测试新版本,很多偶现的问题,兼容性问题很难暴露,而往往一些偶现的概率性问题,手机兼容性问题在全量后会被放大,导致整体的稳定性变差。而灰度有一定的用户量,机型覆盖也比较全面,正好能有效的暴露这些问题。经过灰度期间的暴露和修复,稳定性方面能得到有效的保障。

用户反馈

借助于用户反馈平台,灰度期间我们通过机器人监控新版本用户反馈,经过筛选和分类后,在工作群里通知;能及时的发现新版本业务可用性问题。

运维阶段

经过开发阶段和灰度阶段的种种手段,到正式全量进入运维阶段后,新版本的稳定性一般都能达到一个较好的水平。

但还是会出现一些意料之外的状况,举个例子,比如有些开关或者abtest在灰度期间没有打开;一些偶现问题在灰度期间没有发现,全量之后打开开关或者abtest,会发现可能出现突增的偶现Crash&ANR。

所以进入运维阶段后,并不代表结束,反而更需要关注。在进入运维阶段后,我们注重两点,一是监控报警,二是容灾。除此之外对于线上稳定性问题,我们也会组织学习,尽量避免再次踩坑。

Crash&ANR 监控&报警

当前稳定性监控主要是通过Bugly,虽然Bugly平台的信息较为丰富,能较为有效的帮助我们监控线上稳定性问题,但是使用过程中也有一些痛点问题,比如报警的维度不够丰富。

Bugly上可以配置报警,但是只能针对大盘数据波动的情况;然而我们需要更细的粒度,期望能及时的知道哪一个Crash有大幅波动,这样才能更精准,更快速的发现问题。

于是我们基于Bugly做了监控工具,在全量上线后,通过Bugly监控脚本,及时监控报警,第一时间发现线上稳定性问题。

报警信息如图,我们能及时的监控到具体哪条Crash波动。

Crash&ANR 波动分析

在对于数据分析这块,Bugly 平台提供的能力较弱,我们经常会碰到这样一些情况

  • 某一天来观察 Bugly 大盘的情况,发现昨天要比前天 Crash 率高 10%;然而去看数量排名 Top 的 Crash,发现并没有变化;此时要分析是由于哪些 Crash 引起的总体大盘上涨就很难了。

  • Bugly 上的 Crash&ANR 聚合上不能完全满足需求,经常发现存在相同的 Crash&ANR,但是 Bugly 上对应的是多条数据。

而在日常维护中,通过数据分析快速定位问题,能大幅提高我们的效率;基于以上问题,数据分析这块我们做了较多的工具。

  • 快速归因 Crash 上涨工具:可以看到,工具输出了按影响用户数增加数量排名的相关 Crash;简单明了的就能看出是哪些 Crash 增加导致的大盘波动。

  • Crash 很多,不可能都解决完,那么找出解决哪些 Crash 收益大就变的很重要了;然而 Bugly 聚合不符预期,会导致找影响用户多的 Crash 变的很难;基于此,我们做了工具去通过堆栈关键字,聚合关联的 Crash,方便分析出 Bugly 平台聚合不够好的但是特征统一的 Crash;指导我们评定 Crash Case 的优先级。

整体 Bugly 数据分析思路:先从 Bugly 获取数据,然后 sql 来分析数据。

容灾

开关&AB 控制功能

在稳定性控制中,配置中心是非常重要的一部分,在我们实战过程中,比如我们新上线功能,我们可以在上线之前对其加上功能开关,通过服务端下发配置的方式,下发开关来决定是否显示新功能的入口,保证新功能处于可控状态,如出现紧急问题能及时关闭功能入口。

对于代码改动,比如重构代码,一般都要求保留之前的老方案,通过配置中心控制是否使用新方案,在新方案上线之后如果有问题,可以切回之前的老方案,保证应用的稳定性和可靠性。

Crash安全垫方案

当Android应用发生异常并且没有捕获时,程序会闪退,直接退出应用,对用户来说影响极大;我们的安全垫是一种兜底 Android 程序稳定性的机制。当应用程序发生未捕获的异常时,安全垫可以捕获异常,触发兜底逻辑,避免程序崩溃,让用户无感继续使用APP。

Java 层安全垫实现方案

我们知道,在 Android 程序运行中,APP 主线程是由 Handler 消息驱动,Handler 不停往 MessageQueue 中发送消息,Looper 则是一个死循环,不断从 MessageQueue 中取出消息,并交给 Handler 处理;整个 APP 由消息驱动运行。

当异常发生时,Looper 循环被异常退出,消息便不会被消费了,所以就算 APP 没有直接闪退,但是用户感知是页面卡死,APP 无法继续使用;所以,当崩溃发生在主线程时,我们主动恢复 Looper 循环,程序即可继续运行。整体方案如下:

关键代码

// 获取系统默认的UncaughtException处理器
mDefaultHandler = Thread.getDefaultUncaughtExceptionHandler();
//注册自定义UncaughtExceptionHandler
Thread.setDefaultUncaughtExceptionHandler((Thread t, Throwable e) -> {
     handleUnCatchException(t, e);
});


//匹配堆栈
if (isExceptionCrash(e)) {
    //堆栈不匹配则交由默认UncaughtExceptionHandler处理,正常crash
     mDefaultHandler.uncaughtException(t,e);
     return;
}
//堆栈匹配则进行拦截
//如果是主线程,则重启Looper
if (t == Looper.getMainLooper().getThread()) {
     while (true) {
         try {
           Looper.loop();
         } catch (Throwable e) {
             if (isExceptionCrash(e)) {
               mDefaultHandler.uncaughtException(Looper.getMainLooper().getThread(),e);
               return;
             }
         }
     }
}

当然,在目前 Native Crash 占比较多的情况下,我们在 Native 层也做了安全垫方案。

基于 Router 的客户端容灾方案

在项目组件化之后,页面跳转,以及很多功能调用,通常是通过路由来实现的。如果在线上出现了异常,我们可以在路由跳转这一步拦截有问题的跳转,友好的对用户进行提示,或者重定向到统一的异常处理界面,这样能尽可能减少对用户的影响。

单点追查

针对单个用户反馈的问题,不管是性能问题,还是业务可用性问题,我们排查都依赖详细的日志。我们目前建立了多维度的用户日志和数据平台,比如用户行为埋点,系统或者业务 Log,手机性能数据如内存,CPU,流量等;有了多维度的用户数据,在排查和定位问题时,效率和成功率有了极大的提升。

另外对于系统或者业务 Log 这类大量的日志,我们也做了上传策略优化,保证排查问题时能及时拿到;平时只存储在用户手机,这样一方面尽可能的减少对用户手机性能和流量的消耗,同时也减轻了服务器的数据解析和存储压力。

问题复盘&Case学习

在长期的稳定性建设和问题解决中,我们积累了丰富的经验和知识。为了更好地利用这些宝贵的资源,我们注重沉淀和记录,定期对疑难 Case 进行复盘和学习。这样我们可以避免重复踩坑,提高团队的效率和生产力;同时,也可以不断地提升团队成员的技能和能力,持续提高软件的稳定性和可靠性。

结语

当前我们也存在一些稳定性建设方面的不足,比如对三方SDK的把控没有做的很到位,一些功能对开关的考虑不够周全,反馈用户的Log丢失,容灾覆盖面不够广等等问题。端稳定性治理是一件逆水行舟的事情,要达到高水平的稳定性并不容易,更难的是一直保持高水平。因为代码会在一次次迭代中劣化,所以中间的过程尤其磨人,需要持续不断的耐心和投入。

最后: 下方这份完整的软件测试视频教程已经整理上传完成,需要的朋友们可以自行领取【保证100%免费】

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

在这里插入图片描述

在这里插入图片描述

RenderDoc安卓端Vulkan抓帧实战:从安装到成功捕获 本文详细介绍了使用RenderDoc在安卓设备上抓取Vulkan应用渲染帧的完整实战流程。从电脑与手机的软硬件环境准备、建立ADB连接、配置并启动目标应用,到最终成功捕获帧数据并进行验证,提供了步步为营的操作指南和常见问题排查方法,是移动图形开发者进行Vulkan渲染调试的必备技能。 阅读详情

相关推荐

端侧物理AI落地:Android端侧模型部署与量化实践

端侧AI作为将智能模型部署到手机、机器人等边缘硬件的技术路径,正成为物理AI商业化落地的关键。其核心原理在于通过模型量化、剪枝与端侧推理引擎的协同优化,在NPU等受限算力上实现毫秒级响应。相比云端推理,端侧AI在低延迟、数据隐私和长期成本上具有显著优势,尤其适用于工业质检、自动驾驶、服务机器人等实时交互场景。以Android平台为例,完整梳理从模型选型、格式转换、INT8量化到真机推理验证的部署流程,并解析实际工程中的常见问题与优化策略,为开发者提供一套可落地的端侧AI实践指南。

weixin_34007020的博客 623

Android稳定性优化总结

App Crash对于用户来讲是一种最糟糕的体验,它会导致流程中断、app口碑变差、app卸载、用户流失、订单流失等。常见Crash的处理方式:• 根据Crash统计平台的堆栈,用户日志,操作路径定位和解决。• 寻找共性,机型、品牌、系统版本、所在页面、用户操作等辅助解决问题。• 复现场景,能够复现通常就很容易解决,可以线下复现或者云真机复现。• 对crash率较高的模块进行业务梳理,排查,重构等。• 与第三方sdk沟通升级解决问题,修改SDK的使用方式。1.预防Crash 对于稳定性来说,如果App已经到

datian1234的博客 864

NRF52832蓝牙低功耗安卓端开发原码项目

简介:NRF52832是Nordic Semiconductor推出的高性能、低功耗BLE系统级芯片,广泛应用于物联网与可穿戴设备。本“Android-nRF-Blinky-master”项目提供完整的Android平台源代码,基于Java或Kotlin语言,利用Android BluetoothGatt API实现与NRF52832的BLE通信,支持设备扫描、连接、数据读写及通知订阅。

weixin_31459297的博客 930

Soul Android端稳定性背后的那些事

由于在开发测试期间,只有少量的手机在测试新版本,很多偶现的问题,兼容性问题很难暴露,而往往一些偶现的概率性问题,手机兼容性问题在全量后会被放大,导致整体的稳定性变差。针对单个用户反馈的问题,不管是性能问题,还是业务可用性问题,我们排查都依赖详细的日志。在稳定性控制中,配置中心是非常重要的一部分,在我们实战过程中,比如我们新上线功能,我们可以在上线之前对其加上功能开关,通过服务端下发配置的方式,下发开关来决定是否显示新功能的入口,保证新功能处于可控状态,如出现紧急问题能及时关闭功能入口。

人生不怕起点低,就怕没追求 429

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

“傻瓜”学计量——双重差分DID3(多期双重差分原理+解决方案CSDID原理)

nnpersistent的博客 5044

Unity游戏开发实战:手把手教你用C#实现一个简单的反向运动学(IK)控制器

本文详细介绍了在Unity游戏开发中如何使用C#实现一个简单的反向运动学(IK)控制器。通过建立骨骼层级结构、实现CCD算法和角度限制,开发者可以轻松创建自然的角色动画效果。文章还提供了可视化调试工具和性能优化方案,帮助提升开发效率。

weixin_42523711的博客 238

深入探索Android稳定性优化

优点:比较灵活,预先分配好资源,成功率也比较高。缺点:实现非常复杂这里我们还需要了解下binder 死亡通知的原理,其流程图如下所示:由于Crash进程中拥有一个Binder服务端ApplicationThread,而应用进程在创建过程调用attachApplicationLocked(),从而attach到system_server进程,在system_server进程内有一个ApplicationThreadProxy,这是相对应的Binder客户端。

2401_84121485的博客 2382

FreeRTOS --(15)信号量之概述

FreeRTOS 中使用信号量来做同步,信号量可以在任务中使用作为任务与任务间的同步,也可以在中断中使用(带 FromISR 的版本)中断与任务间的同步; 针对不同的应用场景,信号量分为两种: 1、二值信号量; 2、计数信号量; 1、二值信号量 1.1、Usage 顾名思义,二值信号量只有两个值:0 和 1;它用于简单场景下的任务与任务、中断与任务之间的同步,比如:一个任务,在等待某个资源到位后,才能够继续执行,在得到这个资源之前,它处于阻塞状态,假如一个中断来了,给出了这个资源,那么.

StephenZhou 6511

【软件测试】稳定性和可靠性测试在软件开发中的重要性

软件测试的某些方面经常会在那些刚接触流程的人中造成混淆——例如在稳定性和可靠性测试之间划清界限。 两者通常可以互换使用,并且有一个共同的目标,即确保系统可以在选定的时间范围内稳定运行。

hlsxjh的博客 2260

Unity类银河战士恶魔城学习总结(P103之前 Enemy相关 , 骷髅战士,状态机,敌人状态,)

udemy的Alex银河战士恶魔城,记录我自己的学习,代码会逐渐每一p更新,仅供参考学习。

suzh1qian的博客 1627

Fluent基于低氧舱气体交换仿真(氮气与空气混合)

一、背景概述 模拟低氧舱充氮气和排除混合气体的过程,假设注入95%的氮气,舱内原有气体为空气,压力为标准大气压,温度为300K。观察气体注入过程中,舱内平均氮气和氧气浓度的变化。 二、Fluent设置 Setup 1、General type选择压力基 绝对速度 瞬态 重力勾选 2、Model 能量方程开启 组分运输开启,设置方法如下: 选择后OK,view就会变成Edit,点击Edit。然后再次点击Edit。 将组分中的非氮气氧气和空气的气体移除,右边选项需要将空气放在最后一位。 3、Materi

qq_35535616的博客 1万+

Soul Android 端稳定性背后的事

以下内容来自公众号code小生,关注每日干货及时送达前言移动应用的稳定性对于用户体验和产品商业价值都有着至关重要的作用。应用崩溃会导致关键业务中断、用户留存率下降、品牌口碑变差、生命周期价值下降等影响,甚至会导致用户流失。因此,稳定性是 APP 质量构建体系中最基本和最关键的一环。当然,稳定性优化的面很广,不仅仅是指崩溃,像卡顿、耗电,业务可用性等也属于稳定性优化的范畴。下面我们以时间为主线,来介...

weixin_38754349的博客 256

MarkDown简介(深度解析MarkDown用法)

欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 UML序列图和流程图 离线写博客 导入导出Markdown文件 丰富的快捷键 快捷键 加粗 Ctrl + B 斜体 Ctrl + I...

酷酷的旭 7338

端侧AI与物理AI崛起:Android端目标检测模型部署实战

人工智能正在从云端走向终端,边缘计算与本地推理成为技术演进的重要方向。端侧AI将推理计算下沉至设备本地,有效解决网络延迟、带宽成本与数据隐私问题;而物理AI则要求机器人在毫秒级响应真实世界,进一步推动了端侧部署的刚性需求。无论是手机、嵌入式设备还是边缘盒子,模型压缩与硬件适配都是落地的关键。本文从核心概念出发,解析端侧AI与云端AI的差异,梳理主流推理框架与硬件加速方案,并通过Android平台上的目标检测实战,演示从模型转换到TFLite部署的完整流程。结合NNAPI、GPU等加速手段,帮助开发者掌握端侧

weixin_30788619的博客 380

达梦数据库连接报错6001网络通信异常

本文主要记录客户端连接达梦数据库报错6001网络通信异常问题分析过程、问题原因以及问题解决方法。

chen_zizi2025的博客 2756

注意力机制模块:二次创新:CBAM 与 ECA 融合形成 CECA 模块,参数量减少 40%

文章摘要: 本文提出一种轻量化注意力模块CECA,通过融合CBAM和ECA的优势解决模型部署中的精度与速度矛盾。CBAM虽具备通道和空间双重注意力,但参数量大;ECA轻量但缺乏空间注意力。CECA采用ECA的一维卷积替换CBAM的通道注意力部分,保留其空间注意力模块,在保持双注意力能力的同时减少40%参数量。实验表明该方案在边缘设备部署中能维持精度并提升推理速度,特别适用于YOLO等目标检测模型的轻量化改进。文章详细拆解了架构设计、代码实现及参数量优化原理,为算法工程师和嵌入式开发者提供了实用解决方案。

ZXSXJ的博客 228

2026年7月安卓模拟器选哪款?MuMu vs 雷电 vs 逍遥横评,从帧率/多开/稳定性/兼容性聊聊

又到月底,后台被问最多的还是那句老话:"现在到底用哪个模拟器好啊?" 2026年7月,市面上大家真正在用的主流款就三家——。本文不堆参数、不搞极限测试,就老老实实从这四个玩家最关心的维度,把三家官网最新版本摆在一起对比一下,顺便告诉你我最后为什么推荐 MuMu。

Pocker_Spades_A的博客 3万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

安卓搜不到airpods_安卓可以使用AirPods Pro吗?告诉你真实体验

[PConline评测]安卓系统可以使用AirPods Pro吗?从AirPods Pro发布起,这问题一直备受关注,毕竟苹果官方宣称AirPods Pro兼容多种苹果设备,可没说兼容安卓机。我们知道其他AirPods产品是可以用在安卓机上的,那么AirPods Pro增加了降噪等多种功能,连接安卓机是否依然兼容?安卓系统连接、设置AirPods Pro需要怎么做?苹果官方的兼容列表,可没说兼容安...

weixin_31473773的博客 6328

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

稳定性性能系列之一——Android稳定性基础:系统架构与关键机制

深入理解Android系统架构与稳定性的关系,掌握系统稳定性的核心机制和关键组件,建立系统稳定性分析的基础思维框架

Cheson的专栏 1417

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Android系统优化的那些年那些事

目录写在前面的话什么最影响用户体验为安卓注入新的生命力走向生态协同的“深水区”“吓人”的GPU Turbo背后持续迭代,快速升级,持续解耦经验积累结语 文章摘录自腾讯公众号:原文链接 写在前面的话 笔者于2011年7月因机缘巧合进入到智能手机app的研发行列,经历了android操作系统从1.6版本到9.0的整个系统的过度,随着一个年轻的操作系统的成长,深刻的经历了各种的问题以及同行业的一些优秀团...

zhujohnle的专栏 2万+

Wan2.2-T2V-A5B安卓端集成原型:Android Studio开发初步体验

本文介绍了在星图GPU平台上自动化部署🐎 乙巳马年 · 皇城大门春联生成终端W镜像的实践。该平台简化了AI应用的部署流程,用户可快速搭建服务。该镜像的核心应用场景是基于文本提示(prompt)自动生成创意视频内容,为移动端应用提供强大的云端AI视频生成能力。

weixin_36064575的博客 216

车机安卓+linux成本,你的车机为什么比千元安卓机还难用?

在试过小鹏G3之后,我对所谓“智能汽车”的定义陷入了深思。难道扣一块廉价安卓平板上去当车机,就能够叫作“智能汽车”了吗? 实际体验下来,小鹏G3(参数|图片)的车机存在着以下问题:应用打开卡顿、应用操作卡顿、地图拖动流畅度一般……可圈可点的仅仅是语音识别的流畅度以及与地图的适配性非常不错。 当然,在各大品牌的车机上,这绝对不是个例。同样的例子还有比亚迪,那块炫酷的可旋转大屏的使用体验只能说连千元...

weixin_34463209的博客 9610
上一篇: 游戏自动化测试指南(上)
下一篇: python super真的是调用父类吗?
字节自动化测试
博客等级 码龄6年 7034粉丝 1810原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值