自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(625)
  • 资源 (3)
  • 收藏
  • 关注

原创 安卓开机性能优化:如何安全高效地裁剪 SystemService

经常有学员会对开机启动进行相关的性能优化,查看Perfetto的对应开机trace时,发现在SystemServer启动期间,会启动很多的Service,这些Service启动总计的耗时也有将近3s。但其实有一些Service对于一些特定设备是可以不需要的,比如Print这种服务,VR,HDMI等,这种对于某些特定设备是不需要的,要根据自己手机特性看看是否保留,比如很多设备硬件没有了nfc,指纹。找到原来的Feature的声明的xml,然后在里面直接移除,或者overlay原来的xml。

2026-08-26 15:32:54 258

原创 面对DP 11倍涨价,安卓FW工程师如何减少Token成本

不要以为有了AI工具你就可以啥也不管,其实AI只是你的辅助,你绝不可以过渡依赖AI,对于AI工具去需求实现和bug修复的每个过程,自己也要清楚核心思路等。有了AI不是让你可以啥都不需要懂,不需要学习了,有了AI只是让你的工作和学习效率更高了,每个人都会用AI,但是AI上限其实决定于你的个人知识能力,而不是AI本身。就像菜鸡用AI去实现fw实战需求和你高手用AI实现能一样效果么?

2026-08-18 15:22:51 380

原创 安卓开机时间优化,就认这2招

在很多同学做性能优化相关工作时候,都会避免不了有个开机时间优化的任务,但是如何优化整个开机时间,开机涉及的各个阶段太多了,具体哪里是开机时间瓶颈呢?优化后如何测试自己的开机时机呢?想要抓取开机启动整个过程的trace,放到perfetto上进分析,但是发现开机过程中无法连接上设备,没办法抓到完整的trace,所以perfetto无法分析出整个开机过程。准备好一个config文件,主要用于配置perfetto抓取时候的相关配置,比如要抓哪些tag等,是否也抓取日志等,这个配置官网给了一个最简单的版本。

2026-08-17 14:59:55 262

原创 Winscope如何让你的系统app在可以展示ViewCapture相关数据?

此方法通过避免为每个窗口使用单独的环形缓冲区来避免过度消耗内存,但无法解决针对每个帧在 Perfetto 中存储每个状态的整个视图层次结构的问题。屏幕录制可以直观呈现视图在特定时间的状态,并显示其变化情况,但它们需要大量的 CPU 资源,并且可能会影响性能。此外,ViewCapture 会在视图级别逐帧显示可视化图表,与屏幕录制相比,可更轻松地检查特定时刻的视图状态。ViewCapture 会捕获窗口内各种视图及其属性的相关信息,以便您了解特定时刻的用户体验状态,并跟踪随时间的变化。:(冒号):分隔符。

2026-08-15 22:31:47 207

原创 性能优化:统计安卓apk的安装时间的3种方法

上面已经分享了3-4种的统计apk安装时间的方法,这里作为开发,大家可以首选Perfetto的方式进行统计,然后再找到相关的apk安装的性能瓶颈点进行相关的优化,优化后,再使用同样方式进行查询apk的安装时间。

2026-08-13 16:09:10 302

原创 深挖SF和Skia源码剖析圆角独立设置setCornerRadius

基于 AOSP16-r4 源码分析,揭示 Transaction.setCornerRadius 在 SurfaceFlinger + Skia 渲染管线中的完整流程,以及单参数统一圆角与四角独立弧度两种 API 在源码层面的本质差异。当前实现中 x 和 y 始终相等(均为传入的 radius 值),但这为以后扩展留下了空间——理论上可以实现类似 CSS。使用四参数 API,每个角的裁剪区域可以不同,从而让子 Layer 更精确地判断是否需要继承圆角。到了最核心的部分——Skia 如何将。

2026-08-12 21:50:35 347

原创 安卓16王炸更新!四角圆角终于能“各玩各的”

那么请问在SurfaceFlinger中是如何实现对这四个圆角进行单独的弧度设置的?你这边如果自己去实现这个接口你是否有思路呢?然后再结合源码去对比看看哈。简单说我们原来设置的圆角,其实都是整个Task四个角都进行设置圆角,这里明显看到Task的左边没有任何圆角,但是右边都是圆角。如果让你去实现你会去如何设计呢?这样有了这个接口后,就可以轻易实现对四个圆角轻易控制。但是经过调查发现新版本aosp16上发现一个新的。测试结果坐标都是弧度为50,右边弧度为150。老版本aosp14上设置圆角接口只有一个。

2026-08-11 14:39:26 204

原创 【性能分析】如何让高通平台手机在 Perfetto 中完美显示 GPU 频率?

所以本质上就是高通gpu驱动这块缺乏标准接口定义:在一些较老的高通内核版本(如基于 Linux 4.9 的 SDM710 等)中,内核源码的标准电源头文件里,甚至压根没有定义 gpu_frequency 这个追踪点(Tracepoint)。既然抓到了病根就是kernel版本太老高通gpu驱动本身没有对这块trace支持,我们的解决思路就非常明确了:侵入高通的 GPU 驱动代码,在它切换频率时,强行顺带触发一次 Linux 标准的 gpu_frequency 事件。

2026-08-10 12:33:23 276

原创 竞品技术调研:小米自由窗口Freeform实现方案剖析

而且国内这些手机厂商在自由窗口这块额外加入的功能还比较多,所以今天针对小米手机做一个关于自由窗口的调研报告,方便各位vip课程群里的学员朋友进行自由窗口开发时候有个比较好的参考,更多关于手机大厂自由窗口功能讨论可以联系马哥交流或者获取额外vip资料(如果有的话会分享相关学员)。国内这些手机大厂在自由窗口这块的功能其实都做得比较好,也一直是一个相比aosp原生修改差异较大的功能,也属于一个非常大的亮点提升,代表厂商比如常见的小米,ov等。点击最右侧这个图标可以,既可以进入自由窗口尺寸最小的。

2026-07-29 14:34:49 258

原创 近期手机车机系统framework开发的20个经典面试(中上难度)

12、请问你解决过壁纸闪黑问题,那么详细讲述一些壁纸显示的窗口原理和显示流程,与普通的WindowState ViewRootImpl这种有啥差别。有没有性能更加优秀方案。13、你的壁纸闪黑问题的解决方法中,是否有啥没有考虑的问题?

2026-07-23 14:51:02 323

原创 重大更新:Perfetto中分析bitmap内存泄漏可以看到png图片

该行显示积累的内容:一个 128×128 资产的 12 个副本,都具有相同的内容哈希。平时的java内存泄露问题一般都是使用android studio + mat工具,在看Perfetto的内存泄露分析文档中看到一个bitmap泄漏内存分析的非常好的更新,这个更新就是分析bitmap内存泄露对象时候,可以可视化展示出具体哪张图片泄露,也就是会实时展示bitmap内容,而不是冷冰冰的bitmap对象。像素都哈希到相同的值,但它们是不同的 Bitmap 实例,具有不同的后备 byte[]。

2026-07-20 17:43:19 264

原创 Perfetto重大更新:一边分析trace一边看画面录屏结合功能

大家在使用Perfetto分析相关trace时候,经常会分析SurfaceFlinger主线程每个vsync的相关slice,虽然也可以通过hwc的合成图层知道当前显示每一帧画面是啥,但是没有具体的与每一帧的画面的功能,大家都很希望可以在分析trace时候顺便有当前手机的运行画面可以结合起来看,类似winscope分析闪黑问题一样,这样就可以更加直观清晰分析一些卡顿显示等性能问题。

2026-07-20 09:25:57 248

原创 google官方Perfetto 中使用 AI相关skill

在阅读Perfetto的官方文档时候发现有更新一个关于Perfetto使用ai分析的部分,这里把他进行转载分享一下。

2026-07-14 12:25:02 410

原创 Android Framework 新手学习踩坑建议指南

framework的学习终极目标不是源码分析,而是进行安卓系统的需求定制和疑难问题的实战解决,但是源码分析属于需求和bug解决实现的最重要的理论基础。所以源码分析也是一样很重要,源码分析提供了理论基础后,更重要是利用这个理论基础再结合各种调试和分析工具等来帮助我们解决实际需求和问题。更多framework实战开发入门学习干货资料,请关注下面“千里马学框架”

2026-07-13 12:49:37 257

原创 小鹏车机竞品调研:车机分屏功能的竞品调研和实现方案

可以看到上面的其实也是处于分屏模式,而且分割线在最右侧,左边分屏的区域也是相当于全屏展示着,这个其实和我们三分屏讲解的相关实现,可以把分割线拖动到最右侧,但是这个时候还不退出分屏。1、分屏模式下可以某个分屏task全屏显示,但是这个时候还是分屏模式,分割线显示在边界,可以拖动分割线,重新进入正常比例的分屏。整体难度不大,这里给大家布置小鹏车机分屏给你为学员作业,作业的目标就是实现类似小鹏车机的2个亮点功能既可以。整体调研小鹏车机的分屏功能后,其实整体难度不大,修改难度远比小米su7的三分屏难度要小一些。

2026-07-10 12:11:52 221

原创 性能优化比拼:app启动流程之冷热启动Activity的SnapshotWindow

││ ││ └─ taskSwitch + snapshot → SNAPSHOT ← 温启动命中││││═══════ Snapshot 显示中,App 首帧正在绘制 ═══════││添加路径→→→ Binder →移除路径→→ Binder →更多fw实战干货请关注下面“千里马学框架”

2026-07-09 15:33:25 298

原创 AI替代一切工作?AI辅助学习Framework开发经验技巧分享

AI本质让我们很多想法,懒着动手实现东西可以不需要花太多时间搞,让AI帮我们搞。变成不缺代码缺少想法时代。但是想法和思路又来自自己对于系统业务的熟悉精通程度,只有你精通熟悉你才可以有想法,本质ai变成干活工具,但是核心竞争力还是没有变化更多fw相关干货及实战开发资料获取,请关注下面:千里马学框架。

2026-07-07 14:34:51 262

原创 重重学app冷启动流程桌面点击到SplashWindow显示与移除流程剖析-aosp16

Splash 创建:startSpecificActivity() → showStartingWindow() → getStartingWindowType() 返回 SPLASH_SCREEN→ SplashScreenStartingData → scheduleAddStartingWindow() → IPC → Shell 双线程并行渲染→ Splash 首帧显示 ✓。

2026-07-06 14:45:40 421

原创 安卓fw系统必知必会进程线程与性能监控命令详解

proc 是 Android 系统中最重要的虚拟文件系统,它不占用实际磁盘空间,所有内容由内核在访问时动态生成。注意‌:在多核处理器上,多个进程的 CPU 使用率累加可能超过 100%,这是因为系统将各核心上的 CPU 使用率相加计算总使用率,属于正常现象。Android 系统调试时候,经常需要查看某个进程名字对应的可执行文件具体在哪个目录的需求,/proc 文件系统提供了完整的进程信息。每个运行中的进程在 /proc 下都有一个以 PID 命名的子目录,包含该进程的详细信息。

2026-07-03 14:46:37 305

原创 wms你会吗?一起来分析aosp原生窗口显示bug-vip学员作业

后,正常课程中的10几个实战项目案例学会后,一般都具备了较强的实战能力,有的学员们希望马哥搞一些非课程的案例问题进行实战,想检测自己的实战解决问题能力如何。其实重叠还不是问题本质哈,主要是重叠显示的停留时间有点长,具体看这个窗口显示问题的bug情况。录屏看的话大家可能会觉得看不出啥问题,只看到一闪,因为本身问题可能就持续100ms左右,但是确实是会给出很不好的重影体验。5、给出相关的问题修复方案,这里有的学员可能一开始就说直接关闭动画暴力解决,但是如果不能关闭动画呢如何解决?1、开启设置中的开发者选项。

2026-07-01 15:33:21 267

原创 新版负一屏变天了!分享pixel新桌面负一屏技术调研报告

Pixel Launcher 的负一屏不是在 Launcher 进程内嵌入一个 View 或 Fragment,而是利用 Android 12+ 的,在 Launcher 的 Task 内创建一个独立的,将 Google App (Velvet) 的以模式嵌入其中。两个 Activity 拥有各自独立的 Window 和 Surface偏移目标机制层级View 层负一屏 (MinusOneActivity)Surface 层。

2026-06-30 15:23:44 370

原创 Android 系统 APK 分区存放剖析-你的apk应该放在哪里?

在 Android 系统中,APK 的存放路径远不止 /system/app 这一个。从 Android 早期到现在,随着系统架构的演进(尤其是 Project Treble 之后),APK 的存放路径被划分成了多个不同的分区目录。不同分区的 APK 在等方面都有本质区别。本文基于 AOSP 15 源码设备的实际编译产物,对 Android 系统中所有 APK 存放路径做一个完整的梳理和对比。

2026-06-29 14:26:46 418

原创 深入剖析Perfetto性能优化之睡眠sleep的几个状态

一、D (IO) — 不可中断 I/O 等待内核路径:io_schedule() → in_iowait = 1触发条件是同步等待磁盘/存储完成读写。经典场景:二、D (non-IO) — 不可中断非 I/O 等待内核路径:mutex_lock() / wait_event() → schedule() → in_iowait = 0本质是等内核同步对象(mutex、waitqueue for non-IO condition)。

2026-06-25 12:50:51 219

原创 fw面试折叠屏不会?一起来调研荣耀手机折叠屏原理

硬件层面:两块独立的物理面板(port=147 和 port=148)逻辑层面:Display ID 0/1 是固定编号,窗口和应用挂在逻辑 Display 上不动切换本质:物理面板在两个逻辑 Display 之间"交换",每次只有一个被设为 enabled活跃的标志不活跃的标志控制源头中的enabled属性 →→ 设置 layerStack + 开关设备App 感知:通过收到新的屏幕尺寸/density/挖孔信息,触发重绘。

2026-06-24 14:59:09 3652

原创 性能优化实战:Perfetto/Systrace实战线程状态部分分析

从桌面应用的UI线程从Sleeping状态切换到Runnable状态的Tag信息中可以看到该线程是被一个tid为2796的线程所唤醒,然后我们在Systrace界面右上角的搜索框中输入 2796后,搜索发现该线程的详细信息是属于框架system_server进程中的名为InputDispatcher的工作线程。从Runnable 到Running状态的切换,Systrace上会显示出唤醒这个线程的线程号,从而可以进一步根据该线索分析理清楚线程间的相互等待唤醒关系,找到问题的根本原因。或者是等锁释放阻塞?

2026-06-23 12:18:30 312

原创 安卓实体机系统上kernel调试log,trace开发的技巧汇总

1、#include相关的头文件 <trace/events/input.h>实际上最后也是调用trace_tracing_mark_write。// 2. pr_xxx 宏 (不需要 dev,自动加模块名)// 3. dev_xxx (需要 dev)// 1. 直接用 printk。可以看看下面是power键案例。重启进入fastboot模式。刷入对应的boot.img。

2026-06-22 08:33:44 274

原创 安卓手机车机系统开发面试福利:一线手机车载系统开发相关面试题

14.多屏互动项目中,窗口移动到副屏后,有没有考虑音频焦点的管理,比如继续维持主屏扬声器发声还是副屏扬声器发声?一般你只要跟着马哥认真学了课程,这些题目其实都不是什么大问题哈,当然有一些题目也确实有一定难度哈。有没有性能更加优秀方案。

2026-06-19 12:24:34 234

原创 体验Perfetto高级知识之command自动化配置相关

如果你的查询使用 Perfetto 模块(例如,android.screen_state、android.memory.lmk),你必须首先执行带有模块 include 语句的 RunQuery 命令,然后才能创建 debug track。那么有没有Perfetto可以自动化根据我们配置的置顶的Track初始化就帮我们置顶好相关的Track呢?发现Perfetto的UI显示异常,完全看不见完整InputDispatcher的内容,只看到一个空白的InputDispatcher的trace。

2026-06-16 11:29:06 249

原创 手机大厂桌面负一屏 Overlay 触摸事件冲突修复笔记

可以看出触摸相关智能卡片的控件时候,只要是整体上有滑动情况下负一屏的Overlay窗口还是会整体进行滑动,而不会因为事件被控件吃掉后,导致整体卡片无法滑动情况。内容这些布局都比较简单,但是发现控件多了后,遇到滑动事件冲突的相关严重问题,导致页面丰富后负一屏和桌面的滑动基本上无法按照预想的方式进行滑动。但是负一屏的内容部分还没有做的丰富,只是一个简单的TextView展示,而且滑动事件也没有任何事件冲突等问题。:手指在这些控件上左滑时,触摸事件被控件消费,overlay 无法收到滑动事件,导致。

2026-06-14 13:10:01 395

原创 重学Perfetto浏览器在线抓取trace及高频sql分享

上面其实看出,本质上就是下载个tracebox文件,然后执行这个tracebox文件既可以,但是下载这个tracebox文件一般国内网络都不行哈,所以这里可能又会阻碍一批人,不过这里马哥给大家提供一个 ubuntu 64位可以直接执行的文件。但是在实际性能优化中,你看要分析问题可能是一个时间段内的,比如某个线程的调度延时等,这种你抓某个时间点的就没有意义,必须要进行统计量化才可以减少方差波动等。因为抓的trace完全有可能要保存下来,或者等待下次再来分析,发送其他同学分析等,那么到底在哪里进行保存呢?

2026-06-10 15:18:53 309

原创 干货技巧:单模块编译再见adb push迎接sync命令

我们平时如果是在公司做安卓设备类开发的话,一般我们都是修改某一个模块,比如framework.jar,services.jar,Launcher,SystemUI等,修改这些模块后我们不太可能像模拟器一样方便直接使用一个make方式,因为make方式在实体手机等设备上太慢了,一般采用是单编某个模块如make services等,然后再adb push services xxxx。这种方式有一个比较大的痛点,就是你得非常清楚你make模块是啥,而且make模块后在ubuntu电脑上的out目录具体哪个目录下,

2026-06-06 09:54:30 289

原创 安卓车载手机原生多屏闪黑问题分析及修复成果展示

注意这里可能会有视频黑屏后图层没有黑屏情况,这个原因前面wms课程blog等中应该讲解过,因为视频的帧率和图层的帧率本事是不一样的,所以二者不能代表每一帧都同步。在多屏启动过程中,主屏幕的task会直接reparent到新的display,但是主屏幕的底部task显示是需要一段时间的,这段时间就会一直黑屏。比如手机刷新率是90帧每秒,但是视频录制的帧率是30帧每秒,所以这块肯定是会有比较大的差异哈。因为底部Task的显示是需要时间的,所以自然在Task还没有显示的这段时间就是黑屏的状态。

2026-06-03 12:23:28 492

原创 深入剖析安卓布局uiautomator抓取工具原理

"伪无障碍服务"的意思是:系统知道它是一个测试工具而非真正的无障碍服务(如 TalkBack),所以不会触发无障碍服务的标准生命周期(如。经常android studio一些布局抓取工具其实本质上都是使用sdk下的uiautomator命令进行的抓取View数据。是全局的"信息中转站"——它维护着所有窗口的 Accessibility 树,并响应无障碍服务的查询请求。在深入代码之前,必须先理解 Android 无障碍框架的核心机制。每个节点都是一个"View 的自我描述"——包含类名、坐标、文本、状态等。

2026-06-02 15:34:10 529

原创 系统app开发之桌面调试Launcher3 Dumpsys信息解析

这个其实Activity,Service等类本身自带了相关的dump方法:我们只需在自己Activity方法中进行重写dump,然后加入自己的一些自定义想要dump东西。

2026-06-01 12:27:41 257

原创 aosp新增窗口层级 Type 完整实现方案(有源码)-wms需求和面试题

/ --- 插入到 TYPE_STATUS_BAR_ADDITIONAL 之后 ---/*** @hide*/// 2042/*** @hide*/// 2043注册到})注册到。

2026-05-30 16:47:16 295

原创 aosp16 r4版本的Launcher原生自带2个crash问题分析汇总

最近在调试 AOSP 16 r4 Launcher3 的 Quickstep 模块时遇到两个导致启动即崩溃的1、bug资源类型不匹配导致 Resources$NotFoundException2、Bug 2:TaskView InflateException 如何高效分析呢?特别是bug2属于比较难分析和解决的,各位vip学员欢迎挑战分享你的解决经验,记得留言哈。

2026-05-27 11:46:26 390

原创 如何解决国内镜像aosp进行repo sync太慢问题?

有同学反应建议可以使用其他学校镜像进行下载,比如南京大学,但是尝试后发现repo sync都有比较多的错误,最后没有成功。有学员反应花了几天才repo成功,这个情况也确实可能有的,但是最后时间虽然长,也是可以repo sync下来的。参考:https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/注意这个时间也可能较长,我这也花了5个小时,大家不要着急,可以晚上repo第二天早上看。经常repo init半天不动,大家以为repo卡死了,要等待好几个小时才可以完成。

2026-05-23 17:43:48 628

原创 带你深入体验Android Performance Analyzer (APA)性能优化工具优缺点

使用Android 生态系统推出的全新性能分析工具,优化您的应用或游戏。简单说就是google专门为了性能优化专门做了一个界面类似android studio的软件,大家可能第一反应是不是有网页版本的Perfetto网站么为啥还要这个APA,整体体验目前来看确实是有一些跟踪视图还提供了自定义选项,以便您在工作流程中最大限度地发挥作用。您可以点击 跟踪视图左上角的 SQL图标来打开SQL选项卡。图 3 : SQL选项卡的屏幕截图。

2026-05-21 10:09:26 967 1

原创 Windows上如何使用Winscope抓取查看数据?解决Windows无法使用Winscope问题

文章中也说明在aosp15如果直接使用编译好的离线html是有问题的,无法正常显示抓取的Winscope文件。那么这个python文件本身和java文件一样,本身就是跨平台的,可以在ubuntu系统系统上正常运行,那也可以windows上运行。这里会显示无法抓取到相关的数据,所以在windows上直接使用ubuntu上的winscope_proxy.py是行不通的。py文件中可能存在ubuntu上面的一些linux特有的方法,和一些特有的特性,这些方法无法在windows进行运行。

2026-05-18 12:00:52 583

原创 fw新学员分享的官方Android 平台架构说明文章

非常感谢新学员朋友在学习马哥安卓的framework入门课程时候,发现了一个官方的安卓架构图的网页,这个官方网页解释安卓架构图也很全面,比我们自己总结的可能还是权威和全面一下,这里分享给大家,虽然对于很多老学员来说内容简单都完全理解了,但是也可以看看google官方的文档是如何描述的,是不是和我们理解都完全一直呢?Android is an open source, Linux-based software stack created for a wide array of devices and form

2026-05-14 15:04:00 430 1

千里马android framework学习课程资料下载

千里马android framework学习资料下载 车载车机系统开发,android 系统源码 aosp 11/12/13/ wms学习,android系统闪黑问题解决 车载多屏互动实战项目经验 surfaceflinger图层实战应用 input全局触摸实战 冻屏触摸问题分析实战 深入理解framework重点模块wms 胜任wms相关的需求开发 掌握系统闪黑,冻屏疑难问题解决 成为业界wms/ams模块专家打下基础

2023-06-28

Android Framework学习资料,系统开发,Framework开发

千里马android framework学习资料下载 车载车机系统开发,android 系统源码 aosp 11/12/13/ wms学习,android系统闪黑问题解决 车载多屏互动实战项目经验 surfaceflinger图层实战应用 input全局触摸实战 冻屏触摸问题分析实战 深入理解framework重点模块wms 胜任wms相关的需求开发 掌握系统闪黑,冻屏疑难问题解决 成为业界wms/ams模块专家打下基础

2021-05-21

新加一个app源码到packages/apps编译Android.mk

Android Framework开发之新加一个app源码到packages/apps编译Android.mk配置 hi,粉丝朋友们大家好! 近来有朋友反馈在看我的android framework实战开发合集课程时候 (https://download.csdn.net/combo/detail/2202) 需要购买可以参考直接找千里马最优惠:https://blog.csdn.net/learnframework/article/details/124086882

2022-04-16

haxm-windows_v7_5_1新版本github.zip

Enable VT-x in your BIOS security settings, ensure that HAXM is installed properly. Try disabling 3rd party security software if the problem still occurs.问的解决方法 原文链接:https://blog.csdn.net/learnframework/article/details/117537868

2021-06-04

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除