Android 源码 <package> 了解 [4]

Android 11源码——预置无源码apk到Android系统(带so文件) 模块名,可不用定义,默认=$(LOCAL_PACKAGE_NAME),不能和既有模块相同,如果该变量未设置,则使用LOCAL_PACKAGE_NAME,如果再没有,就会编译失败。经过对系统中存在的文件夹的访问测试,这种方式编译出来的APK所在进程的UID为system,可以参见Settings。例如LOCAL_MODULE,LOCAL_SRC_FILES,LOCAL_STATIC_LIBRARIES等等,但不清理LOCAL_PATH。testkey普通APK,默认情况下使用。... 阅读详情

在这里插入图片描述

Read The Fucking Source Code. —— Linus

站在’巨人’的肩膀上开始自己的旅途。—— 佚名

愉快的周末,从打开💻开始,到骑行归来结束。—— 佚名

忙忙碌碌又一周,城市的快节奏似乎是时间的轮盘上了润滑剂比以往转得更快,早上进入地铁看天空还是那么明亮,晚上踏出地铁口已是昏暗。

工作日确实忙绿,然而周末呢?

上午还在养精蓄锐 (懒床)
中午便是一天的开始
下午又能干嘛 (摆烂一下午)
晚上呢 (继续摆烂)
你说这一周能过得不快吗 🤔

文章系列

注: 本系列文章源码基于 Android 11-r21 master 分支

Warm-up

源码阅读可是一项耗时、费力的‘大工程’,对于大多数人来说可能是多么的枯燥无味,为了消除枯燥感,尝试接触新鲜事物可是一个良好的治疗药方,前三篇都是在看 Android 启动,现在不妨在下一次开始之前看看别的东西 ——— package,看看这里面都是些什么?

package

对于系统应用就就不过多展开,这种更适合当前从事应用开发的同学,我们就挑拣几个感兴趣的模块稍微展开。

packages 
    —— apps           系统应用
        —— basicSmsReceiver
            1.1 注册一个广播接收器 sms reciever,接受回调中通过解析 intent -> bundle -> puts 获得短信数据
            1.2 收到的每一条短信都需要一个唯一的通知ID,notificationId(先猜测这是通知渠道ID),通知点击事件将通过 pendingIntent 跳转到短信内容页面
            1.3 这个通知ID使用 SP 存储,下一次接收到通知时候自增,最大值不能超过最大阈值 32765(超过将重置)

        —— bluetooth 
            1.1 蓝牙实现还是比较底层的,最终会接触到硬件设备,那么这里需要 jni 调用,此前需要初始化 native
            1.2 蓝牙数据使用 room 框架做数据的 CURD 操作,主要数据是蓝牙地址、上一次激活时间
            1.3 设备管理,负责监听设备和蓝牙之间的连接、断开事件
            1.4 蓝牙服务是由多个子服务、通讯规范整合形成的,比如我们知道的有:蓝牙音频传输协议服务(A2PD)、音量控制服务、音视频远程控制规范(AVRCP)等等
            1.5 蓝牙是如何通讯的?a2dp —— a2dpshink 简单理解是 C——S 通讯(物联网应该接触到比较多,我们就略过吧)
            1.6 关键代码还是在 jni,这里就不展开了

        —— browser2
            1.1 【略】一个用于测试的 webview,构建生产环境使用的浏览器请参考链接;浏览器可又是一个大型项目——Chromium

        —— calendar
            1.1 好家伙,此模块用 kotlin 写,差点看不懂了 kt 的语法了解的还是太少,不影响我们粗略阅读
            1.2 日历除了看日期基本功能,还有其他的附加功能,比如闹钟提醒需要 AlarmScheduler,事件通知需要 notification
            1.3 日历在此前是我们遇到的第一个 UI 界面比较多的应用,对于应用开发者来说看看官方如何实现‘日历’可有一定参考;如何巧用列表控件、数据适配器。
 
        —— camera2
            1.1 相机主要的是图片,图片到底就是像素——一个多维的字节数组,对图片的处理最终既是对每一个像素的处理、转变,实际处理还是在 native
            1.2 【略】主要涉及对图片和音频的处理,如果当前从事相关开发我觉得可以继续往下看看,目前先略过(主要是代码不少啊😭)

        —— car
        —— carrierConfig
        —— cellBroadcastReceiver
        —— certInstaller
        —— contacts
        —— deskClock
        —— DevCamera
        —— dialer
        —— documentUI
        —— emergencyInfo
        —— Gallery2
        —— Gallery
        —— HTMLViewer
        —— keyChain
        —— Launcher3 【重点!重点!重点!】
            1.1 桌面应用,不就是我们看到的手机桌面嘛!看名称是 Launcher3 这个是原声系统的,如果你在友商手机看,这个名字可能是 ******.Launcher;
                原生的桌面应用可能太丑了,厂商通常都会开发自己的桌面应用程序,美化桌面,吸引用户————爱美之心。
            1.2 看 Androidmanifest 只有一个activity,便是桌面程序的主界面 com.android.launcher3.Launcher,这是一个可以拖拽的、有状态的 activity
            1.3 UI 界面我们不关心如何,关注的是应用数据 AppInfo 来源,数据是如何获取到的?数据都包含了哪些内容(应用程序直接找 model 模块——MVC、MVVM、MVP)?
                ——【ItemInfo】 
                    ID:每一条数据在数据库的ID  
                    type:应用程序、文件夹、部件、自定义部件、快捷方式
                    screenID:桌面ID,比如应用在桌面快速启动可以通过这个ID找到对应的应用程序启动数据
                    cellX/Y:坐标(桌面可以看作是一个二维网格)
                    title:最明显的应用图标或者文件夹名称、文件名称(桌面程序不仅仅是我们理解的那个只有只用应用图标的桌面)
                    componentName:这个就比较重要了,通常携带目标界面的启动类和必要数据
                    userHandle:通过 framework/base/core/java/android/os/Process 的 myUserHandle 方法赋值;
                                userHandle —— 当前进程的用户句柄,系统缓存的实例,是在 zygote 进程中被创建。
                                user 即是用户,这里的用户划分是什么:系统用户、所有用户、当前活动用户(大概意思就是根据 uid 获取特定的当前进程合适的 handle 来发送消息)

                    ——【FloderInfo】
                        lableState:标签
                        workspaceItemInfo:工作目录下可启动的应用程序(父类是 ItemInfoWithIcon)

                    ——【LauncherAppWidgetInfo】
                        intent:
                        compotentName:能够启动的,基本都包含着两个

                    ——【ItemInfoWithIcon】 
                        bitmap:作为应用程序,应用图标必不可少
                        process:应用下载进度,最大 100
                        ——【AppInfo】
                            intent:启动程序的常规方式就是通过 intent
                        ——【PackageItemInfo】
                            packagename:应用层开发者也知道 Android 在应用层有提供通过包名启动程序的接口
              
            1.4 说到底,数据从那里来?【重点!这才是本次真正关注的点】
                packages/apps/Launcher3/src/com/android/launcher3/model/LoaderTask.java 就是线程需要执行的任务;直接看 run 方法,加载任务大概做了这些事:
                1.4.1 loadWorkspace:默认从当前应用收藏夹 favorites uri 通过 contentResolve 解析数据(数据解析部分有点复杂不展开了)
                1.4.2 loadAllApps:需要的数据是 LauncherActivityInfo,实际获取数据的转到了 frameworks/base/core/java/android/content/pm/LauncherApps.java;
                      这是一个 AIDL 接口,ILauncherApps.aidl 实现类是 LauncherAppsService;获取到的事 resolveInfo 再通过 convertToActivitList 获得最终数据
                     (流程比较长点到为止,其实就是查询应用信息在组装转换为最后需要的)
		1.4.3 loadDeepShortcuts: shortcut 快捷方式;通过 usermanager getUserProfiles 解析获得
                     (framework/base/core/java/android/os/UserManager.java),实际上就是当前进程的 UserHandle
		1.4.4 widgetsModel.update(mApp, null):从应用中更新或者解析创建桌面部件

/*到这里,桌面需要显示的应用信息已经获得,后面就是通过适配器把数据填充、显示,最后就是我们能看到的设备桌面*/

        —— legacyCamera
        —— managedProvisioning
        —— messaging
        —— music
        —— musicFX
        —— nfc
        —— onDeviceAppPrediction
        —— oneTimeInitializer
        —— phoneCommon
        —— protips
        —— provision
        —— quickAccessWallet
        —— quickSearchBox
        —— safetyRegulartoryInfo
        —— sampleLocationAttribution
        —— secureElement
        —— settings
        —— settingsIntelligence
        —— soundRecorder
        —— stk
        —— storageManager
        —— tag
        —— terminal
        —— themepicker
        —— timeZoneData
        —— TimeZoneUpdate
        —— traceur 
        —— tv
        —— tvSettings
        —— universalMediaPlayer
        —— wallpaperPicker
        —— wallpaperPicker2
    
    —— inputmethods   输入法

    —— modules

    —— providers      数据来源(其实就是对操作数据库,只是 CURD 操作系统封装为内容提供者——contentprovider,有一部分系统应用的数据源内容提供者,比如:联系人、日历)
        —— blocedNumberProvider   被屏蔽的电话提供者(数据库:blockednumbers.db)
        —— bookmarkProvider       书签提供者(一看代码无任何实现,留着估计是为了兼容考虑)
        —— calenderProvider       日历(数据库:calender.db;包含日历闹钟提醒、日历信息更新等)
        —— contactsProvider       联系人
        —— downloadProvider       接收器——通过系统广播接受,通知——notificationManager,扫描——mediaScannerConnectionClient,
                                  存储——fileSystemProvider,线程——发起下载请求、文件磁盘持久化
                                 (数据库:downloads.db;JobService——特定条件下执行的后台服务,比如:下载并安装完毕需删除安装包,删除的不仅是安装包文件还有数据库中的记录)
        —— mediaProvider          多媒体(媒体访问往往需要权限,提供音频播放、图片视频选择界面)
        —— partnerBookmarksProvider 合作伙伴书签?不太了解
        —— telephonyProvider      电话(运营商信息:CarrierInformation.db   运营商标识:carrierIdentification.d   短信内容:mmssms.db  电话内容:telephony.db)
        —— tvProvider             电视(机顶盒?  数据库:tv.db)
        —— userDictionaryProvider 用户字典

    —— screensavers   屏保
        —— basic          基础工具(只有一个颜色选择)
        —— phototable     界面 activity、数据源 source、适配器 adapter

    —— services
        —— alternativeNetworkAccess  网络相关
        —— builtinPrint              打印服务
        —— car                       车载服务
        —— mms                       多媒体消息(multimedia messaging service)
        —— mtp                       媒体传输协议(media transfer protocol)
        —— telecomm                  通讯工具
            —— bluetooth       蓝牙
            —— callfiltering   电话过滤
            —— callrederiction 电话重定向
        —— telephone                 电话服务

    —— wallpapers     壁纸
        —— live wallpapers           实时壁纸

附加

参考链接

  • A2PD:Advanced Audio Distribution Profile 蓝牙音频传输模型规范
  • AVRCP:Audio/Video Remote Control Profile 音视频远程控制规范
  • 浏览器:https://www.chromium.org/developers/how-tos/android-build-instructions
  • Chromium:https://github.com/chromium/chromium
Android 11源码——预置无源码apk到Android系统 Android 11源码——预置无源码apk到Android系统 在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预置一个名为 Test 的APK为例。 将 Test.apk 放到 packages/apps/Test 下面。 在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下:LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE_TAGS := optional 阅读详情

相关推荐

Android PMS(Package Manager Service)源码介绍

PackageManagerService(简称 PMS)是 Android 系统中的核心服务之一,负责应用的安装、卸载、查询和权限管理等。它是 Android 应用生命周期管理和安全机制的基石。1、应用安装与卸载2、静态权限解析与动态权限授予3、应用信息查询4、系统应用的预加载5、数据存储与一致性管理提示:以下是本篇文章正文内容,下面案例可供参考PMS 是 Android 系统中连接应用、用户和系统的桥梁,其源码体现了安装、卸载、权限管理的高效性和安全性。

weixin_44780781的博客 1780

Android 4.3 系统裁剪——删除不使用的app及增加自己app

Android 4.3 系统裁剪——删除不使用的app及增加自己app 删除不使用的apk 系统自带的app位置是在/android4.3/packages/apps 下面是一些APP作用分析: | |– BasicSmsReceiver | |– Bluetooth (蓝牙) | |– Browser (浏览器) | |– Calculator (计算器)

MENGHUANBEIKE的专栏 1229

Android更改源码后编译错误unknown package name of class file

最近往core_minimal.mk(build/target/product/)的PRODUCT_BOOT_JARS变量中加了一个自己的模块,编译报错: unknown package name of class file

u013686019的专栏 4587

Android系统相关备忘

短信Notification id是123;

AttackMars的专栏 630

把Android源码导入Android Studio进行调试

一.整编代码 1.source build/envsetup.sh 在你需要编辑的根目录下输入如下命令初始化环境 2.lunch 选择平台编译选项,如:32.lito-userdebug 3.make -j16 -jx # x指线程数,一般写8具体看电脑配置 二.生成idegen.jar文件 1.source build/envsetup.sh 2.lunch 3.mmm development/tools/idegen/ 这行命令的意思是编译idegen这个模块项目,然后生成id...

xxdw1992的博客 3871

彻底解决UE4安卓编译错误:No BuildPlatform found for Android

在游戏开发中,跨平台编译是连接开发环境与目标设备的关键环节。其核心原理在于构建系统(如Unreal Engine的Unreal Build Tool)需要正确识别并加载特定平台的工具链模块。当环境变量配置错误、依赖版本不匹配或模块注册失效时,构建系统便无法定位平台支持,导致编译流程中断。这一问题的技术价值在于,稳定的环境配置是保障持续集成与自动化部署的基石,直接影响开发效率与项目进度。在移动游戏开发,尤其是使用Unreal Engine进行Android平台打包的场景下,环境配置错误是常见的工程实践挑战。本

weixin_33682790的博客 422

Android package管理之包解析详解

Android 包解析,PMS 启动流程

u010927489的专栏 3784

Android应用源码之BasicSmsReceiver-IT计算机-毕业设计.zip

Android应用源码开发Demo,主要用于毕业设计学习。

Android中寻找 package 包名

属性用于定义应用程序的包名,这是应用的唯一标识符。它位于 文件的 标签内,格式如下: 在这个例子中, 就是应用程序的包名。包名应该遵循 Java 包命名规则,通常使用开发者拥有或控制的互联网域名的一部分来防止命名冲突。从 Android Gradle 插件 3.0 开始,引入了一种新的方式来管理应用程序的包名,即通过 文件中的 属性来指定。这种方式提供了更大的灵活性,因为可以在构建过程中动态地更改应用的包名。当你在 文件中找不到 属性时,可能是因为 已经在 文件中指定了。例如: 在这

2301_76541209的博客 1191

Cursor AI编程工具保姆级安装指南:从下载到中文界面设置(含免费额度说明)

本文提供Cursor AI编程工具的保姆级安装与设置教程。详细指导从官网下载、安装到中文界面切换的每一步,并重点说明其每月500次高级模型调用的免费额度策略。通过个性化设置与核心插件推荐,帮助开发者快速上手,提升AI辅助编程效率。

weixin_29191761的博客 671

2022-2028年中国美容仪行业发展战略规划及投资机会预测报告

报告类型:产业研究 报告格式:电子版、纸介版 出品单位:智研咨询-产业信息网 美容仪是一种根据人体生理机能进行调节改善身体和面部的机器,它按照功能来说有美白、嫩肤、祛斑、祛皱、脱毛、减肥等多种,按照名称来说有超声波导入、光子嫩肤、高周波电疗、RF 电波拉皮、电子祛斑点痣、E 光永久脱毛嫩肤、贾法尼营养导入导出等。 智研咨询发布的《2022-2028年中国美容仪行业发展战略规划及投资机会预测报告》共十七章。首先介绍了中国美容仪行业市场发展环境、美容仪整体运行态势等,接着分析了中...

kt346的博客 468

UE5.4.4源码编译与安卓APK打包全流程实战指南

源码编译是深入理解游戏引擎内部机制和进行深度定制的关键技术路径,它允许开发者从底层掌控引擎行为,集成特定功能并优化性能。其核心原理在于通过构建系统(如UnrealBuildTool)将源代码转换为可执行文件,这一过程对硬件配置和工具链版本有严格要求。掌握源码编译技术对于需要定制渲染管线、集成第三方SDK或进行平台特定优化的团队具有重要价值,尤其在移动平台开发中,它是确保项目稳定性和性能表现的基础。在安卓应用开发场景下,从编译好的引擎到生成可部署的APK,还需要正确配置Android SDK、NDK和构建环境

weixin_33762130的博客 476

STM32F103结合HAL库实现蓝牙遥控四麦小车的PID闭环控制

本文详细介绍了如何使用STM32F103结合HAL库实现蓝牙遥控四麦小车的PID闭环控制。从硬件选型、电路搭建到PID算法实现与调参,全面解析了四麦小车的运动控制方案,特别强调了蓝牙通信协议设计和麦轮运动学解算的关键技术。

weixin_29169899的博客 292

android packages/apps 加入工程,深入安卓Package Manager和Package Installer

我们每天都在安装和卸载APK(安卓应用程序包文件),或许一天会有好几次,但是你有想过下面问题吗?什么是Package Manager(包管理器)和Package Installer(程序安装包)?APK文件保存在Android的哪个地方?APK文件安装过程的细节是怎样的?Package Manager(包管理器)是怎样保存数据的?我应该去哪里找Package Manager和Package Ins...

weixin_36482670的博客 1150

远红外热传感器阵列 (32x24 RES) MLX90640ESF-BAA/BAB

Melexis MLX90640是一款小体积、低成本的完全校准的32x24像素红外阵列,采用行业标准,带数字接口。3.其工作温度范围为 -40°C 至 85°C,可测量的物体温度范围为 -40°C 至 300°C。该红外传感器在整个测量范围内保持高精度水平,可提供 ±1°C 的典型目标物体温度精度。2.这款 32x24 像素的器件适用于安全和便利应用,包括防火系统、智能楼宇、智能照明、IP/监控摄像机、HVAC 设备和车辆座椅占用检测。1.工作温度范围为 -40 至 85°C,可在严苛的工业环境中部署。

Summit__的博客 1999

【视频监控国标GB/T28181】无人机的视频图传技术

然而,随着无人机市场的不断发展和无人机视频图传技术的迅速进步,一些厂家正积极探索更多的传输方式。如今,一些大疆无人机已经具备了4G辅助图传功能,这意味着它们需要在无人机上安装相应的SIM卡,并在有移动互联网信号的情况下,通过互联网进行视频图传。这种技术的应用,不仅提高了无人机的操作灵活性,也使得无人机在各个领域的应用更加广泛。在使用时,用户需时刻注意无人机的飞行距离。在无人机图传系统中,OFDM技术的运用更是如虎添翼,显著增强了视频传输的品质与稳定性,尤其在错综复杂的电磁环境中,更能凸显其不可替代的优势。

开源物联网项目商业化作者 5661

Android 源码结构分析

源码版本:AOSP_7.1.1 硬件平台:Rockchip 由于工作要求,需要对rockchip平台的安卓系统进行剪裁。安卓源码比较庞大,会让人感到无从下手,对此,有必要了解一下源码的大致目录结构以及各个部分功能模块,做到知己知彼百战不殆,才能快速定位具体的位置。 ![img](file:///C:/Users/ADMINI~1/AppData/Local/Temp/enhtmlclip/Ima...

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 1万+

基于 Simulink 的三相四线制整流器在三相不平衡负载下的中点电位平衡控制实战教程

本文为三相四线制整流器在中点电位不平衡时的Simulink仿真教程。首先分析中点电位漂移的电荷不平衡机理,提出零序电压注入控制策略。详细演示建模步骤:搭建三相四线制主电路,构建中点平衡控制算法(含MATLAB函数代码),实现控制信号叠加与PWM生成。通过对比仿真验证控制效果,并给出零序电压限幅、中性线电感影响等工程建议。该方案能有效抑制三相不平衡负载下的中点电位波动,保证系统稳定运行。

xiaoheshang_123的博客 50

深入安卓Package Manager和Package Installer

本文由 伯乐在线 - hanson 翻译。未经许可,禁止转载! 英文出处:kpbird。欢迎加入翻译组。 我们每天都在安装和卸载APK(安卓应用程序包文件),或许一天会有好几次,但是你有想过下面问题吗? 什么是Package Manager(包管理器)和Package Installer(程序安装包)?APK文件保存在Android的哪个地方?APK文件安装过程的细节是怎样的?Pac

Omnictech的专栏 691

Midscene.js(2):代码集成 + 桥接模式(Bridge Mode)的使用「喂饭教程」

本文将手把手教你从零开始搭建一个 Node.js 项目,集成 Midscene.js,并利用其桥接模式实现对 Chrome 浏览器的自动化操作。我们将通过具体的实例,来展示 Midscene.js 的便捷性与 AI 能力的结合。

blues_C的博客 1844

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

eclipse导入android源码后报错,eclipse导入安卓源码与eclipse中的报错消除

在安卓源码环境下开发的时候,需要将安卓源码整个导入到eclipse中,下面给出导入方法和导入后源码报错的排除方法导入源码复制.classpath文件到源码根目录12$ cd AndroidSource$ cp development/ide/eclipse/.classpath ./使用统一的代码格式化风格在eclipse中点击Window - Preferences - Java - Code ...

weixin_32259697的博客 691

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

预制无源码apk到安卓系统

前提 apk已有签名;安卓源码 操作步骤 1.在 packages/apps 下面以需要预置的 APK 名字创建文件夹,以预制一个名为Test的APK为例 。 2.将 Test.apk 放到 packages/apps/Test 下面。 3.在 packages/apps/Test 下面创建文件 Android.mk,文件内容如下 : LOCAL_PATH := $(call my-dir) i...

qq_34330118的博客 658

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

安卓Android和Java语言的异同、关系和区别

安卓Android和Java语言的异同、关系和区别,安卓Android是一种以Linux为基础的开放源码操作系统,主要使用于便携设备。2011年第一季度,安卓在全球的市场份额首次超过塞班系统,跃居全球第一。 2012年2月数据,安卓占据全球智能手机操作系统市场52.5%的份额,中国市场占有率为68.4%。自google收购安卓之后,安卓开发者更是风生水起。安卓开发前景看好,安卓手机市场大卖,安卓应

编程小丫 3万+

android中的Package安装、卸载、更新替换流程

android系统在安装,删除,替换,清除数据等与应用相关的动作时,会发出对应的Broadcast,上层的应用通过注册相应的广播事件来做相应的处理。1,ACTION_PACKAGE_ADDED----------当有新的包安装成功的时候,系统会发出此广播。2,ACTION_PACKAGE_REMOVED-----当有包被卸载的时候,系统会发出此广播。3,ACTION_PACKAGE_REPLACED----当有包被更新的时候,系统会发出此广播。上面两种广播的用法,很多朋友也已经很熟悉,通过。

yzwfeng的专栏 2879
上一篇: Android 系统启动 <System server> 服务 [3]
下一篇: Android 源码 <Activity> 桌面启动一 [5]
Primer@.com
博客等级 码龄9年 524粉丝 292原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值