OpenHarmony 3.1 Beta版本关键特性解析——HAP包安装实现剖析

OpenHarmony—Hap包签名工具 为了保证OpenHarmony应用的完整性和来源可靠,在应用构建时需要对应用进行签名。经过签名的应用才能在真机设备上安装、运行、和调试。developtools_hapsigner仓 提供了签名工具的源码,包含密钥对生成、CSR文件生成、证书生成、Profile文件签名、Hap包签名等功能。针对无需通过ACL跨级别申请权限的应用,DevEco Studio为开发者提供了自动化签名方案,可以一键完成应用/服务签名。具体可参考自动化签名方案。 阅读详情

(以下内容来自开发者分享,不代表 OpenHarmony 项目群工作委员会观点)

石磊

随着社会的不断发展,人们逐渐注重更加高效、舒适、便捷、有趣的生活和工作体验。

OpenAtom OpenHarmony(以下简称“OpenHarmony”)作为面向下一代的分布式操作系统,具有全场景、多设备、自然交互、便捷精准的技术特点,为行业数字化转型的高速发展提供领先的技术基础,为用户体验的创新满足提供了新思路。

为了让大家深入了解 OpenHarmony 的技术特点,本期对 OpenHarmony HAP 包安装实现进行剖析。

一、HAP包介绍


HAP 包是由代码、资源、第三方库以及应用配置文件打包生成的模块包,主要分为两种类型:entry 和 feature。

  • entry:应用的主模块,作为 OpenHarmony 应用的入口,提供了应用的基础功能。
  • feature:应用的动态特性模块,作为应用能力的扩展,可以根据用户的需求和设备的类型进行选择性安装。


OpenHarmony 用户应用程序包可以只包含一个基础的 entry 包,也可以包含一个基础的 entry 包和一个或多个功能型的 feature 包。

HAP 包的类型你 get 了吗?接下来咱们对 HAP 包的安装实现进行深度剖析。

二、HAP包的安装流程简介


首先我们来看看在正常场景下,HAP 包的安装流程。如图 1:

图1 HAP包安装流程

1. 端侧设备(如平板、大屏、车机、PC、手表和手机等)从 CDN( Content Delivery Network)云端服务器下载需要安装的 HAP 包。

2. 由设备上的包管理服务来对 HAP 包进行校验,包括 HAP 包文件合法性校验、HAP 包签名信息校验和 HAP 包配置信息校验。

3. 安装 HAP 包,包括创建 HAP 包的安装目录、将 HAP 包解压并拷贝到安装目录和将应用信息数据存入数据库和缓存。

以上是 HAP 包从下载到安装的整个流程,接下来对 HAP 包安装实现进行详解!

三、HAP包安装实现详解


1)HAP包文件合法性校验

当端侧设备完成从各种渠道下载 HAP 包文件之后,launcher (桌面应用)会获得该HAP文件的存储路径,随后 launcher 将该路径传递给包管理服务。

包管理服务获取了所有要安装的 HAP 包文件路径之后,开始对 HAP 包文件合法性进行校验。

校验的内容主要包括以下几项:

  • HAP 包文件是否存在
  • HAP 包文件名的合法性,要求文件名的长度不能超过 256 个字节
  • HAP 包文件类型的合法性,要求文件必须以 .hap 作为后缀
  • HAP 包文件路径的类型
  • HAP 包文件的大小,要求单个 HAP 文件的大小不能超过 4GB
  • 磁盘是否有足够的空间来安装 HAP 包文件


2)HAP包签名信息校验

为了确保应用的发布者来自于同一个组织或个人,防止应用的信息被他人恶意篡改,因此需要在 HAP 包的安装或升级过程中对 HAP 包签名信息进行校验。安装过程中需要保证同一应用不同 HAP 包签名信息一致,升级过程中需要保证同一应用中待安装的 HAP 包和已安装的 HAP 包签名信息一致。

签名信息校验时,包管理服务调用安全子系统的接口,获取 HAP 包的签名信息,校验签名信息中的 appId 字符串(该字符串经过哈希算法的处理,可以保证一个应用对应唯一的一个 appId 字符串)。通过判断同一应用不同 HAP 包签名信息中 appId 字符串是否一致来判断 HAP 包的签名信息的一致性。

3)HAP包配置信息校验

在安装过程中需要校验所有的 HAP 包中 config.json 文件中 APP 对象内部的配置信息是否一致。

config.json 文件中 APP 对象内部配置信息示例如下:

"app": {
        "bundleName": "com.example.13jsdemo",
        "vendor": "huawei",
        "version": {
            "code": 1000000, 
            "name": "1.0.0"
        },
        "apiVersion": {
            "compatible": 4, 
            "releaseType": "Release", 
            "target": 5            
        }
    },

通过 config.json 文件配置信息实例可以看出 HAP 包配置信息具体包括如下几项:

  • 应用的包名
  • 供应商
  • 版本号
  • 发布方式
  • 适用的设备类型
  • 兼容的 API 的版本信息


若同一应用的多个 HAP 包的 config.json 文件中的配置信息一致,则继续接下来的安装。若不一致,则终止安装。

4)安装HAP包

包管理服务通过创建 HAP 包的安装目录、解压 HAP 包文件及应用信息数据存入数据库和缓存三个步骤完成 HAP 包的安装。

由于系统文件的管控导致包管理服务并没有权限来创建目录,也不能将从 HAP 包中解压出来的文件拷贝到指定的目录,因此借助系统的常驻进程——installd 进程来创建文件目录,及完成目录下文件的 IO 操作(input/output 缩写,指代读写操作)。

具体操作如图 2 所示:

图2 安装HAP包


1. 包管理服务通过 IPC(Inter-Process Communication)跨进程通信,通知 installd 进程。

2. Installd 进程先通过调用内核的接口 mkdir 来创建目录,再通过文件操作(将文件转换成字节流的操作)将文件写到目录下。

3. Installd 进程将创建成功与否的结果以错误码的形式返回给包管理服务。返回的错误码包括:

  • ERR_APPEXECFWK_INSTALLD_CREATE_DIR_FAILED,代表创建目录失败
  • ERR_APPEXECFWK_INSTALLD_REMOVE_DIR_FAILED,代表移除目录失败
  • ERR_OK,代表目录创建或者删除操作成功

4. 包管理服务将 HAP 包信息保存在服务缓存中,同时为了防止包信息的丢失,将这部分的内容写入到数据库。

说明:

虽然 installd 进程拥有创建和删除目录的权限,但是 installd 的权限也是有限的,它只有在应用目录的上级目录下创建和删除的权限。

经过对 HAP 包文件合法性校验、HAP 包签名信息校验、HAP 包配置信息校验和安装 HAP 包的层层剖析之后,是不是对 HAP 包整个安装过程了然于胸了,接下来咱们一起来探究下 HAP 包的升级安装策略吧。

四、升级安装策略


升级安装时需要考虑已经安装的 HAP 包和待安装的 HAP 包的版本兼容性。如果开发者在新版本的 HAP 包中迭代了某些新功能和特性,这些变化对于低版本的 HAP 包可能是不能兼容的。如果一个应用的部分 HAP 包升级到更高的版本之后还依然保留着部分低版本的 HAP 包,将造成低版本的 HAP 包无法正常使用。因此,制定合理的升级策略是保证应用正常运行的基础。

HAP 包的升级策略总结为以下几点:

  • 不允许安装比已安装应用版本号更低的 HAP 包。
  • 在安装了 entry 类型的 HAP 包的前提下,安装的 feature 类型 HAP 包必须和 entry 类型 HAP 包的版本号一致。当升级安装更高版本的 entry 类型 HAP 包,需要将已安装的低版本 feature 类型 HAP 包在升级结束之后卸载,再重新安装高版本 feature 类型 HAP 包。
  • 在未安装 entry 类型 HAP 包的前提下,可以升级安装更高版本的 feature 类型 HAP 包,但是需要保证在升级结束之后,低版本的 HAP 包被卸载。

五、安装异常处理


按部就班完成以上操作之后仍然安装失败怎么办?当前提供了如下常见问题供开发者进行查询。

问题现象1:当已经完成部分HAP包的安装时,其中某个HAP包创建目录失败导致该HAP包安装失败。

解决措施:在安装流程结束之前,系统卸载安装好的HAP包,删除已创建的安装目录和数据目录,同时删除包管理服务和数据库中的包信息,再重新安装。

问题现象2:在HAP包安装的过程中,设备突然重启,导致HAP包安装中断。

解决措施:在设备重启后,首先包管理服务检查应用的安装状态,若状态正常则系统将数据库中信息恢复到包管理服务的缓存中。若状态异常则系统将删除包信息、残留的包文件、安装目录和数据目录,再重新安装。

问题现象3:在HAP包升级安装过程中,设备重启。

解决措施:在设备重启后,包管理服务删除已创建的临时安装目录。

问题现象4:在安装过程中,包管理服务突然重启。

解决措施:包管理服务突然重启,且不会返回任何结果。此时IPC提供的死亡监听机制将会告知安装设备,包管理服务已经死亡。等待数秒,包管理服务会自动重启,用户只需要重新安装。

【HarmonyOS开发】HAP包与APP包 我们在DevEco编辑器中完成项目之后经常会在构建窗口中编译项目的时候,看到有两个选项,分别是Hap与APP:那么就让我们来深入探究一下这两个包的区别与联系吧。 阅读详情

相关推荐

【HarmonyOS】hap包在多台设备中安装和HarmonyOS应用含多个module安装问题

若您的应用已在AGC上申请应用,需要使用手动签名方式,将应用appid与签名信息关联,在发布HarmonyOS应用前,建议您在本地进行调试,您需要提前申请相应的调试证书与调试Profile给HAP进行签名后,才可安装到设备上运行。注意:一个帐号最多可申请两个调试证书,您需要至少预留一个调试证书位置才可自动签名成功,若您自动签名失败,请检查您的帐号中“证书管理”是否已申请了两个调试证书。若您的应用创建多个module,需要同事安装多个模块的hap包到设备中,您可参考下方步骤配置后,再重新运行项目。

华为开发者联盟 5002

鸿蒙应用开发:一键安装HAP包

结合前面的两个帖子,今天详细讲讲如何一键只装hap。首先要明白-什么是hap包!

weixin_51416826的博客 1万+

智能家居开发避坑指南:基于OpenHarmony 3.1 Beta的BES2600WM固件烧录全流程

本文详细介绍了基于OpenHarmony 3.1 Beta为BES2600WM开发板烧录固件的完整流程与实战避坑指南。内容涵盖开发环境搭建、硬件特性分析、JS与C高效通信机制设计,以及固件烧录与调试的关键步骤,旨在帮助智能家居开发者提升效率,规避常见陷阱。

metaverse5vr的博客 250

鸿蒙第三方应用.hap打包、安装流程。

最近在华为手表上安装第三方应用(源码打包构建应用,需要签名)。网上看了教程,在此记录下。准备工作:先安装DevEco Studio开发工具。进入华为 appgallery connect网站(注册、开发者实名认证)添加设备,UUID需要用华为 应用调测助手软件获取。

体验新模板 2万+

Unity团结引擎开发OpenHarmony Next应用:从零搭建环境到真机调试全攻略

在跨平台应用开发领域,游戏引擎与操作系统生态的深度集成是提升开发效率、拓展应用场景的关键。Unity作为领先的实时3D内容创作平台,其推出的团结引擎插件,标志着对OpenHarmony生态的正式支持。这一技术整合的核心原理在于,通过团结引擎作为桥梁,将Unity的C#脚本、Shader和资源,高效转换并链接到OpenHarmony的原生层(C/C++)与应用框架层(ArkTS/JS),从而实现一次开发、多端部署。其技术价值在于,它极大降低了开发者进入鸿蒙生态的门槛,使得庞大的Unity开发者社群能够利用熟悉

weixin_30838873的博客 318

Windows下OpenHarmony开发环境配置全攻略:DevEco Studio与工具链避坑

开发环境的搭建是进入OpenHarmony应用开发的第一道门槛。相比普通Android或小程序开发,OpenHarmony的Windows工具链由IDE、SDK、包管理器和构建引擎等多个组件协同构成,任何一个组件的版本或路径配置不当,都会导致编译失败。理解DevEco Studio与底层工具链的职责边界,掌握Node.js、ohpm、hvigor等组件的安装与联动方式,是高效完成环境配置的关键。本文从环境组成的原理出发,结合Windows实际部署过程,覆盖SDK下载、依赖安装、签名配置、常见报错排查等工程实

weixin_30843605的博客 218

Unity项目迁移OpenHarmony实战:团结引擎转化流程与性能优化指南

跨平台应用开发是当前移动与物联网领域的关键技术,其核心在于实现一套代码在多种操作系统和设备上的高效运行。其原理通常通过中间件或运行时适配层,将应用逻辑与底层系统接口进行映射和转换,从而解决不同平台间图形渲染、输入系统、文件访问等基础服务的差异。这一技术价值在于极大提升了开发效率,降低了多端维护成本,使开发者能快速覆盖手机、平板、车机及各类IoT设备等新兴市场。应用场景广泛涵盖游戏、行业应用、数字孪生及交互式内容。本文聚焦于利用团结引擎这一关键工具,将成熟的Unity项目高效转化为符合OpenHarmony应

weixin_33798152的博客 479

HarmonyOS 5.0.1 Beta 尝鲜指南:手把手教你配置DevEco Studio与SDK,避开API升级的那些坑

本文详细介绍了如何配置HarmonyOS 5.0.1 Beta开发环境,包括DevEco Studio与SDK的安装与优化,以及如何避开API升级中的常见问题。通过实战经验分享,帮助开发者高效搭建开发环境并解决API Level变更带来的兼容性问题。

443

Flutter SDK 鸿蒙化适配仓库 CPF-Flutter/flutter_flutter 使用指南:仓库结构、支持指令与 FAQ 全解

本文以 CPF-Flutter/flutter_flutter 仓库的官方 README([README.en.md](https://link.gitcode.com/i/c72c74e606fd0048c8b6871b90982c95))为主体,系统讲解这套面向 OpenHarmony 的 Flutter SDK 与 Engine 适配方案的仓库结构、已适配的开发指令,以及日常开发中高频遇到的

gitblog_01027的博客 498

阿里千问办公套件跨平台部署指南:Windows/macOS/鸿蒙PC全解析

AI辅助办公工具通过智能算法提升文档处理、代码开发等场景的效率,其核心原理是基于自然语言处理和机器学习技术。这类工具的技术价值在于能够自动化重复性工作,减少人工错误,提高生产力。在实际应用中,智能文档处理可以自动生成摘要和校对内容,代码辅助开发则提供实时补全和错误检测功能。跨平台支持使得用户可以在Windows、macOS以及新兴的鸿蒙系统间无缝切换,特别适合需要多设备协作的开发团队。阿里千问办公套件作为典型的AI办公助手,集成了文档智能处理、代码开发辅助和会议语音转写等核心功能,其多平台版本覆盖了不同操作

weixin_34221773的博客 427

随机变量序列 收敛 检验 matlab,利用MATLAB验证样条插值的收敛性

问题提出多项式插值是不收敛的,即插值的节点多,效果不一定就好。对样条函数插值又如何呢?理论上证明样条插值的收敛性是比较困难的,但通过本实验可以验证这一理论结果。.实验内容请按一定的规则分别选择等距或者非等距的插值节点,并不断增加插值节点的个数。考虑实验2.1中的函数或选择其他你有兴趣的函数。(中函数)。实验要求(1)随节点个数增加,比较被逼近函数和样条插值函数误差的变化情况。分析所得结果并与拉格朗...

weixin_30895121的博客 4735

OpenHarmony与Flutter跨平台开发实战指南

跨平台开发框架Flutter通过自建渲染引擎实现高性能UI绘制,其热重载特性显著提升开发效率。当与开源操作系统OpenHarmony结合时,开发者既能复用现有Flutter代码库,又能快速接入鸿蒙生态。这种组合方案特别适合需要同时覆盖多平台的企业应用,通过Platform Channel实现原生功能调用,利用BLoC模式管理跨平台状态。实践中需注意线程模型差异和渲染机制适配,本文详解从环境搭建到性能优化的全流程实践方案。

weixin_30764883的博客 370

STM32接入CH340芯片的升级电路及初始化进入升级模式(死机)问题处理

MCU-REST 在 MCU-BOOT0 处于低电平状态下,进行下拉操作,在MCU-REST 与 MCU-BOOT0 恢复正常电平时,将导致MCU死机,MCU-REST 先于 MCU-BOOT0 下拉可解决该问题;MCU-REST 在 上升沿结束时将判断 MCU-BOOT0 的状态,MCU-BOOT0 处于高电平,MCU死机,MCU-BOOT0 处于低电平 MCU 正常;

LuDvei的博客 2491

Windows搭建OpenHarmony开发环境全攻略:DevEco Studio安装与避坑指南

OpenHarmony作为开源操作系统,其应用开发依赖一套完整的工具链。理解IDE、SDK、Node.js运行时与命令行工具的分工,是构建环境的核心原理。DevEco Studio深度集成工程管理、编译构建与调试能力,而SDK与hvigor、ohpm等工具共同支撑开发流程。在实际工程实践中,环境配置常遇到SDK下载失败、hvigor版本不兼容、模拟器无法启动等问题,掌握组件关系与排查方法能显著提升效率。本文面向Windows平台,系统讲解从系统准备、Node.js安装、DevEco Studio配置到首个A

weixin_34391445的博客 305

深度学习实战12(进阶版)-利用Dewarp实现文本扭曲矫正

大家好,我是微学A1, 我们在生活中会看到一些拍摄扭曲的图片,我们在通过OCR识别的时候,因为扭曲的厉害,而无法识别,我们需要对图片进行处理。

微学AI的博客 3157

大模型技术全景与核心概念解析:从基础原理到AI智能体架构(实时更新中)

本文系统解析了大模型技术的核心概念与架构。首先介绍了LLM(大语言模型)、LLMOps(模型运维)、AIGC(生成内容)、AGI(通用AI)等基础概念,重点阐述了大模型的工作原理,包括预处理、推理和后处理三个阶段。深入讲解了Token分词、FLOPs计算、Embedding向量表示等关键技术,并分析了LoRA微调、MoE架构等前沿方法。文章还探讨了AI智能体的发展前景,为理解大模型技术提供了全景视角。

算法工程师 1233

仓颉 OpenHarmony 应用开发指南:从首个应用到 Stage 模型、ArkUI 声明式 UI 与仓颉-ArkTS 混合开发

本文以仓库知识库文档 [docs/cangjie_ohos_dev_guide_doc.md](https://link.gitcode.com/i/1f5abac9f729799b7c67a1c548c2ddd2) 为主体骨架,系统梳理基于 OpenHarmony SDK 的仓颉应用开发全流程:从用 DevEco Studio 创建并运行第一个仓颉应用,到理解 Stage 应用模型与 UIAbi

gitblog_00541的博客 1114

内网渗透(二)之基础知识-工作组介绍

在一个大型单位里,可能有成百上千台计算机互相连接组成局域网,它们都会列在"网络"(网上邻居)内。如果不对这些计算机进行分组,网络的混乱程度是可想而知的 为了解决这一问题,产生了工作组( Work Group)这个概念。将不同的计算机按功能(或部 门)分别列入不同的工作组,例如技术部的计算机都列入"技术部"工作组、行政部的计算机都 列入"行政部"工作组。要想访问某个部门的资源,只要在"网络"里双击该部门的工作组名 就可以看到该部门的所有计算机了。相比不分组的情况,这样的情况有序得多(尤其对大型局域网来说)。

把自己活成一道光,因为你不知道,谁会借着你的光,走出了黑暗。请保持心中的善良,因为你不知道,谁会借着你的善良,走出了绝望。请保持你心中的信仰,因为你不知道,谁会借着你的信仰,走出了迷茫。请相信自己的力量,因为你不知道,谁会因为相信你,开始相信了自己.... 1219

Flutter在OpenHarmony上实现动态柱状图的开发实践

跨平台开发框架Flutter与开源操作系统OpenHarmony的结合为移动应用开发带来了新的可能性。通过CustomPaint组件实现自定义绘制是Flutter的核心能力之一,它允许开发者直接在画布上进行图形绘制,结合动画系统可以实现丰富的动态效果。这种技术组合特别适合数据可视化场景,如动态柱状图的实现。在OpenHarmony平台上,Flutter的绘制逻辑需要针对ArkUI渲染引擎进行适配,同时要注意线程模型和事件系统的差异。通过合理使用AnimationController和优化shouldRepa

weixin_34302561的博客 183

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.6 在kernel 中实现系统复位和系统关机驱动

上一章节`Qemu`篇我们已经实现了我们`SOC`的`power reset`和 `power down` 寄存器,本章节我们就在`Linux driver`中去实现它

DSMGUOGUO的博客 542

用 CL_ABAP_ZIP 在 ABAP 里打包任意文件:从前端多选到 ZIP 交付的一条龙实践

本文介绍了在SAP ABAP中实现文件打包交付的完整解决方案。文章首先区分了ZIP和GZIP的不同用途:ZIP用于多文件归档,GZIP用于单数据流压缩。核心流程包括四个步骤:文件选择、二进制上传、内存打包和ZIP输出,并提供了关键对象与函数的速查表。针对实际项目中常见的乱码、大文件处理等问题给出了解决方案,最后展示了一个完整的可运行示例代码,涵盖了从文件选择到下载的全流程实现。该方案适用于财务、质量、运维等多种业务场景,能够有效解决多文件交付的最后一公里问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 215

仓颉应用 ohos.raw_file_descriptor 模块详解:RawFileDescriptor 文件描述符的获取、属性与典型应用

RawFileDescriptor 是 OpenHarmony 本地化开发服务(Localization Kit)中用于描述 rawfile 原始资源文件所在 HAP 文件描述符的关键数据结构。本文基于 `ohos/zh-cn/application-dev/reference/LocalizationKit/cj-apis-raw_file_descriptor.md`,结合同目录下的资源管理

gitblog_00506的博客 248

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Flutter项目迁移鸿蒙实战:手把手教你处理三方库依赖与签名(避坑版)

本文详细介绍了将Flutter项目迁移到鸿蒙平台的实战经验,重点解决三方库依赖与签名配置中的常见问题。通过真实案例解析,提供从环境准备、库适配策略到构建签名的全流程避坑指南,帮助开发者高效完成Flutter到鸿蒙(Ohos)的迁移工作。

weixin_29008805的博客 297

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

面向全场景的 OpenHarmony 应用模块化分层架构研究

万物互联时代智能终端设备呈现碎片化特征,传统移动端单模块应用开发模式存在代码耦合严重、复用性差、包体臃肿、内存泄漏等缺陷。OpenHarmony 作为开源分布式操作系统,提供 HAR 静态共享包、HSP 动态共享包两套模块化核心能力,为工程化分层开发提供底层支撑。本文基于 API23 纯血鸿蒙开发标准,提出一套entry 入口层 - har_base 公共底层 - 业务 HAR 静态层 - HSP 动态分包。

Helen_cai的博客 430

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

LLM-Universe Chroma向量库连接拒绝:三问定位,一次修通

跟着 C3 手册搭知识库,不少人在向量库这一步被 Chroma 向量库 连接拒绝卡住。这篇文章带你按"三问"定位成因,十分钟修通跑起来。 [![Chroma向量库连接拒绝排查:RAG检索增强生成流程](https://raw.gitcode.com/datawhalechina/llm-universe/raw/77beb748047e8a0d8ff708716606a8e0b132dc45/d

gitblog_00242的博客 634
上一篇: 【直播回顾】OpenHarmony知识赋能第四期第三课——I2C驱动开发
下一篇: OpenHarmony 3.1 Beta版本关键特性解析——HiStreamer轻量级可定制的媒体管线框架
OpenHarmony开发者
博客等级 码龄5年 626粉丝 221原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值