自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 收藏
  • 关注

原创 MAD,现代安卓开发技术:Android 领域开发方式的重大变革~

Android 诞生已久,其开发方式保持着高频更迭,相较于早期的开发方式已大不相同,尤其是近几年 Google 热切推崇的 MAD 开发技术。其实很多开发者已经有意或无意地正在使用这门技术,借着 2022 开年探讨技术趋势的契机,想要完整地总结 MAD 的愿景、构成、优势以及一些学习建议。MAD,全称 Modern Android Development:是 Google 针对 Android 平台提出的全新开发技术。旨在指导我们利用官方推出的各项技术来进行高效的 App 开发。有的时候 Google.

2022-01-24 16:35:17 3628

原创 来自 Twitter 的 17 条 Compose 开发规范和检查工具:帮你避坑~

对于大型团队来说,刚开始采用Compose开发的时候,会面临很多的挑战。尤其每个开发者对 Compose 的认知不同:接触的时间或长或短、开发的水平也参差不齐。Twitter 计划通过创建一套 Compose rules 来解决这些痛点。经过一段时间的探索之后,Twitter 推出了一套自定义的 Compose 静态检查 rules,可以确保开发者编写的函数避免一些常见的错误。的确,Compose 技术有很多超能力,但也存在很多容易犯的错(坑),这时候上面的静态检测 rules 便可以派上用场了。

2024-03-24 20:34:41 915

原创 Compose 1.6 发布:性能大升级、拖放新功能、文本新变化...

基于 1 月 24 号的 Compose 发行计划,我们正式推出了版本。作为 Android 平台备受推崇的原生 UI 工具包,一众知名 App 都在使用 Compose 进行开发,比如 Threads、Reddit 和 Dropbox 等。如今,性能表现已成为 Compose 技术的重中之重,也是本次发布的 1.6 版本的核心焦点,包括:持续改进的Modifier系统、重要 API 的效率提升等等。如果开发者想要尝试该版本,需要将 Compose BOM 升级到2024.01.00。

2024-02-19 21:10:23 698 1

原创 毕业 10 年,也成了 Android 10 年老开发|紧张充实的 2023

在这毕业 10 年、从事 Android 开发 10 年的双十之际,我庆幸自己能一直在热爱的 Android 平台上做我喜欢的事情,在固化了 Android App、FW 经验之后能拓展到架构改造、优化等领域,并在新的方向上不断探索。技术以外持续充当了面试官的角色,参与或主导了各式各样的 DEMO 展示,也参加了多个创新、改善的 topic…每一个活动都让我体验到了新的东西,累积了新的经验。在此之中,我也愈发认识到:在职场当中,保持开放的心态、沟通的态度、共赢的策略是多么的重要和难能可贵。

2024-01-20 13:52:12 1052

原创 万字盘点 Android 领域在 2023 年的重要技术:AI, 14, Compose, 鸿蒙...

在LLMAIGC大浪潮下作为 AI 先驱的 Google 想在存量最大的 Android 生态里做点延伸即AICore,方便开发者的同时更快地推广自己的 AI 技术为应对 AIGC 的应用态势以及 Android 本身的开发需要,在里引入Studio Bot和更多好用、应景的 Compose 等工具必须要做的、长足的Android 14升级,往更加成熟、安全、稳定的方向去发展逐步优化和迈向更多平台的ComposeUI 工具包和Kotlin语言国内势头正盛的鸿蒙。

2023-12-31 23:00:00 1395

原创 AICore 带来了 Android 专属的 AI 能力,它要解决什么?采用什么架构思路?

Google 最近发布的Gemini模型在全球引起了巨大反响,其在多模态领域的 Video demo 无比震撼。对于 Android 开发者而言,其中最振奋人心的消息莫过于模型将内置到 Android 系统当中,并开放给开发者使用。事实上,能够自研LLM大模型的企业屈指可数,大多数的企业或个人都是在搞基于 LLM 的应用创新。而各大模型们各自为政,提供的能力、对接方式都参差不齐,即便在应用这个维度,开发者也很难整体、高效地去开发、拓展。

2023-12-11 18:39:34 1938 2

原创 参加了南京 GDG 活动:这些精彩的技术讨论,值得与你分享~

一直以来发的文章大都是技术的,这次和大家聊点简单点的。密集输出这几年,因为疫情没能在线下和大家碰面,去年又因为时间原因浪费了 Google IO China 门票。所以,今年的南京本地的 GDG DevFest 2023 活动一经上线,就报了名。这次如愿见到了不少朋友,进行了面对面交流,非常赞!

2023-11-20 16:45:00 154

原创 手把手教你用 COMPOSE 开发地图 APP~

很难想象1.0早在2021 年 7 月就发布了。如今两年过去了,Google Play 上排名前 1000 的 App 中已有24%采用了 Compose 这个新技术, 其影响力可见一斑。Jetpack Compose 作为MAD(现代 Android 开发)理念中的一员,确实取得了不少成绩。但我留意到有个技术角落被大家忽视了,那就是 Map 地图。其实,我有阵子没接触 Compose SDK 了,但最近突然发现Google Map。

2023-11-13 09:00:00 284

原创 如何优雅地单元测试 Kotlin/Java 中的 private 方法?

翻译自首先,开发者应该测试代码里的 private 私有方法吗?直接信任这些私有方法,测试到调用它们的公开方法感觉就够了吧。对于这个争论,每个开发者都会有自己的观点。但回到开头的问题本身,到底有没有一种合适的途径来?截止到目前,在面对单元测试私有方法的问题时,一般有如下几种选择:不去测试私有方法 😜*(选择信任,直接躺平)*将目标方法临时改成 public 公开访问权限 😒(可我不愿意这样做,这不符合代码规范。作为一名开发者,我要遵循最佳实践。

2023-10-30 13:28:06 1542

原创 从车窗升降一探 Android 车机的重要 API:车辆属性 CarProperty

一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车机的自定义事件机制深度入门 Android 车机核心 CarService 的构成和链路本篇文章我们聚焦 Android 车机上最重要、最常用的接口:即车辆属性。并结合车窗升降这种典型的场景来探究它的完整链路。App 先通过 Car lib 拿到CarService的Car实例,CarService 会初始化所有 Car 相关的实现,比如其中车辆属性的化,会初始化和等。

2023-10-22 17:25:08 1268

原创 不用休眠的 Kotlin 并发:深入对比 delay() 和 sleep()

毫无疑问,Kotlin 语言中的协程 Coroutine 极大地帮助了开发者更加容易地处理异步编程。该特性中封装的诸多高效 API,可以确保开发者花费更小的精力去完成并发任务。一般来说,开发者了解一下如何使用这些 API 就足够了!可就 JVM 的角度而言,协程一定程度上减少了*“回调地狱”*的问题,切实地改进了异步处理的编码方式。相信包括笔者在内的很多开发者常常会好奇。所以,本文将以delay()为切入点,带开发者剖析下协程的背后原理。

2023-10-09 12:00:00 1316

原创 面试题:手指从按钮 A 平移到 B,会发生什么?为什么?

Touch 相关问题是 Android 面试中常问的点,不一定要求大家都从 InputFlinger 底层开始回答,但起码需要了解 Touch 抵达 App 之后的完整处理。而即便是这段偏上层的链路,也不要局限在老生常谈的过程复述,需要深刻理解、灵活运用其中的细节和原则。本文结合一个简单的 Touch 场景的问答,带大家加深一下 Touch 分发的理解。Button A 和 B 相邻,手指不抬起、从 A 平移到 B,A 会发生什么?为什么?此刻,B 又会发生什么?为什么?

2023-09-18 07:45:00 116

原创 万字解读 Android 车机核心 :CarService 的构成和链路~

关于 Android 车机,之前分析过方控上自定义按键的输入机制和中控上旋钮输入的原理,但都局限于 Car Service 内 Input 相关模块。一文了解 Android 车机如何处理中控的旋钮输入从实体按键看 Android 车载的自定义事件机制本文将结合 Android 系统整体,对 CarService 的构成和链路对其做一个全面的分析和理解。我们通过一张表格来总结 CarService 相关组件的构成。Car 相关组件所属进程作用管理 Car Serivce 的系统服务。

2023-09-04 08:27:43 1485

原创 Android 标准语音识别框架:SpeechRecognizer 的封装和调用

此前,笔者梳理了语音如何打造车载语音交互:Google Voice Interaction 给你答案:介绍的是 3rd Party App 如何通过API 快速调用系统的语音交互服务快速完成确认、选择的基础语音对话直面原理:5 张图彻底了解 Android TextToSpeech 机制:侧重于阐述 TTS Engine App 如何提供文字转语音服务,以及 3rd Party App 又如何便捷地调用这些服务。还缺最后一块即如何向系统提供语音识别的。

2023-08-21 10:00:00 1679 9

原创 一文了解 Android 车机如何处理中控的旋钮输入?

上篇文章《从实体按键看 Android 车载的自定义事件机制》带大家了解了 Android 车机支持自定义输入的机制。事实上,除了支持自定义事件,对于中控上常见的音量控制、焦点控制的旋钮事件,Android 车机也是支持的。定义监听和订阅接收处理模拟和自定义输入所支持的事件一致,支持旋钮输入的事件类型也在如下文件types.hal中定义。/*** ...*/0x0A20代表该事件在底层的Property定义,供VehicleHal对其发起监听。

2023-07-30 16:39:06 1492

原创 从实体按键看 Android 车载的自定义事件机制

AAOS默认支持的自定义事件 Code 位于文件中,App 可以利用这些预设的事件 Code 进行监听和自定义处理逻辑。当然,Car OEM 厂商可以使用任意有符号的 32 位数值来扩展支持自定义输入的枚举范围,以支持更多的按键 Code,确保处理的范围符合实际的车辆按键需求。/***/我们利用上述 Code 来自定义一个打开高频 app 的专用控件,比如:接电话、挂电话、音量、语音、微信按钮、地图按钮、音乐控制等等。hl=zh-cn。

2023-07-17 20:47:28 1097

原创 深度解读 Android 14 重要的 8 个新特性~

添加专用来规范监听截屏的开发方式添加全新 API 来简化Hightlight的实现方式重新设计Back Arrow和支持目标界面的预览来统一、加强 Android 平台上 Back 导航的体验支持的标准分享,来满足丰富、灵活的分享需求引入全新的区域设置来改善用户习惯的体验引入全新的、独立的语法性别来提高文本表述的准确度引入特定 API来方便开发者对 Path 历史进行回溯通过改善来全方位提升 App 安装、更新方面的细节体验。

2023-06-29 20:39:51 1044

原创 Android 14 新功能:区域偏好 Regional Preferences

Android 14 开始,Settings 会展示区域偏好的设置界面,供用户在系统语言以外独立设置区域偏好,开发者还可以使用相应 API 来获取该偏好。我们可以使用如下两个函数来获取温度单位偏好和一周首日此外,我们还可以从当前区域获得小时周期和日历类型偏好。但其实,我不太相信API 很快能得到广泛使用,原因在于很多 App 早已自行实现了区域之类的偏好配置,而且也不依赖 OS 版本。

2023-06-25 10:34:36 249

原创 Android 14 新特性:语法性别 Grammatical Gender

还有个细节要注意,调用完 setRequestedApplicationGrammaticalGender 更新 Gender 后,通过 getApplicationGrammaticalGender() 的处理要稍微延迟一下,才能看到新的偏好,也可以理解,因为这个设置是 GrammaticalInflectionManager 系统服务通知的 App Context,这个过程是异步的。而这部分语言所涉及到的人群多达 30 亿之众,如果文本只使用通用的、中性的表述,则显得不够准确。

2023-06-18 11:46:56 710

原创 Android 14 之返回界面升级:预览目标界面 + 全新返回箭头

在支持预览返回的目标界面功能之前,确实非常有必要借助返回箭头来提示返回手势的进度。但一旦这个预览功能开发完毕,这个箭头则显得不那么必须,因为判断目标界面出现的多少即可,就像 iOS 那样。但话说回来,这个箭头并不需要 App 适配样式,全部由系统的 SystemUI 完成,不会增加开发者的负担。所以,提供依据系统 Theme 改变的返回箭头算是 Android 返回导航的一大特色。期待包括预览目标画面功能在内的完整 Back 导航功能早日发布!

2023-06-05 22:11:04 2811 1

原创 探究 Android 14 新功能之 TextView 搜索高亮和焦点移动~

之前写的文章《Android 14 新功能之 HighLights》里,讲到 Android 14 里推出的HighLights新功能可以快速实现 TextView 文字的高亮效果,并支持动态更新。使用等针对 TextView 的搜索结果进行高亮展示使用针对 TextView搜索焦点高亮和移动上个版本 13 时 Android 针对 TextView 提供了换行策略的新功能,到这次 14 一次性推出了文本高亮HighLights、搜索高亮以及搜索焦点移动3个新功能。

2023-05-24 22:17:42 897

原创 深入学习 Kotlin 枚举的进阶用法:简洁又高效~

可以看到 Kotlin Enum 可以帮助开发者定义好一组类型的常量:大大简化代码、具备更好的可读性以及提供额外的功能函数。通过上述的进阶用法,相信大家可以使用 Enum 创造出更加健壮和高效的代码,同时也更容易理解和维护。

2023-05-08 22:07:37 619

原创 使用 ChatGPT 改善 Android 开发效率的 7 个案例~

确实,ChatGPT 有助于提高开发者的生产力,但必须认识到它存在一些局限性,这很重要。综上可以看到,ChatGPT 极有可能彻底改变开发者们的工作方式。尽管存在可靠性、响应速度、最新数据等局限性,ChatGPT 仍旧可以大大提高我们的生产力、改善我们的开发时间。倒也不必担心 ChatGPT 会窃取咱们的工作,因为从别的角度来说,这个工具确实可以给开发者提供非常有价值的支持、促使日常工作更加高效、帮助大家摆脱重复繁琐的任务。。。

2023-04-18 22:40:36 3310

原创 Android 14 新 API:直接监听截屏操作,不用再观察媒体文件了~

监听截屏 API 的使用简单、清晰,以后不需要再通过监听媒体文件的变化等逻辑来迂回实现,采用官方的方式去探测用户的截屏操作并按照文件读写的规范去提取文件。但需要留意 adb、代码、AS 等方式发起的截屏无法通过该 API 监听得到,笔者以为这些不属于用户操作,没有必要纳入到监听范围中。另外,这个监听 API 并不是级别的,每个目标Activity都得注册,所以可以考虑在中完成 API 的注册和注销。相信这个 API 后续亦会扩展到Jetpack当中,届时无论是否升级到了Android 14。

2023-04-08 15:59:45 3476 2

原创 Android 14 新功能之 HighLights:快速实现文本高亮~

可以看到新功能HighLights可以使得高亮的处理变得简单、易用,大家可以在 14 上采用该 API,当高版本普及后,低版本上的自定义高亮逻辑就可以舍弃了。至于其原理,因为Android 14尚处于预览版阶段、源码没有公开,无法获悉实现。但估计是TextView在draw阶段会获取设置的 HighLights 包含的size以及对应的Paint和Ranges,得以清晰地掌握各高亮的颜色和对应的范围,然后直接调用Canvas的去完成绘制。

2023-03-25 13:25:15 868

原创 全方位探究似懂非懂的 CAS 机制~

求学、面试的时候会无法回避CAS话题,但对于其原理,总有种似懂非懂的感觉。CAS 机制全称:,即比较并替换,。也有叫做的,即比较并设置。比较:读取到了一个值 A,在将其更新为 B 之前,检查原值是否仍为 A替换 / 设置:YES 则将 A 更新为 B,结束;反之,重复上述操作直到成功为止这种机制在确保原子化操作、实现乐观锁的同时也无法避免一些缺陷,咱们从源码入手分析一下其原理、乐观锁和缺陷等各个细节。通过静态方法获得Unsafe实例接着通过 Unsafe 实例的 native 方法传入使用。

2023-03-12 12:13:55 232

原创 面试题:Android 中 Intent 采用了什么设计模式?

答案是采用了原型模式。原型模式的好处在于方便地拷贝某个实例的属性进行使用、又不会对原实例造成影响,其逻辑在于对。逻辑是直接调用了 new 并传入了自身实例,而非调用 super.clone() 进行拷贝。原型模式也不一定非得实现 Cloneable,提供了类似的实现即可。,顾名思义,将完整拷贝源实例的所有属性进行构造。,Android 源码中还有很多地方采用了原型模式。相关的属性,即用来判断启动目标组件的。没有实现该接口但提供了。

2023-02-25 19:53:56 824

原创 直面原理:5 张图彻底了解 Android TextToSpeech 机制

关于语音方面的交互,Android SDK 提供了用于语音交互的机制、语音识别的接口、语音播报的 TTS 接口。前者已经介绍过,本次主要聊聊第 3 块即 TTS,后续会分析下第 2 块即 Android 标准的 Recognition 机制。通过机制,任意 App 都可以方便地采用系统内置或第三方提供的 TTS Engine 进行播放铃声提示、语音提示的请求,Engine 可以由系统选择默认的 provider 来执行操作,也可由 App 具体指定偏好的目标 Engine 来完成。

2023-02-12 21:10:20 1103

原创 一文了解 Java 中 so 文件的加载原理

无论是 Android 开发者还是 Java 工程师应该都有使用过 JNI 开发,但对于 JVM 如何加载 so、Android 系统如何加载 so,可能鲜有时间了解。本文通过代码、流程解释,带大家快速了解其加载原理,扫清困惑。总体流程可以归纳如下:System类提供的load()加载 so 的完整的路径名且带文件后缀,等同于直接调用Runtime类提供的 load();用于加载指定 so 的名称,等同于调用Runtime类提供的 loadLibrary()。两者都将通过。

2023-01-30 21:41:05 1966

原创 Flow 转 LiveData 后数据丢了,肿么回事?

最近我在负责一段代码库,需要在使用Flow的 Data 层和仍然依赖LiveData暴露 State 数据的 UI 层之间实现桥接。好在框架已经提供了一个叫做的方法,可以让你毫不费力地将Flow转为LiveData。在拥有一个及以上活跃的观察者的条件下,它才会发射数据。假使上游的 flow 产生了更新,但对应的 LiveData 并非活跃的状态,那么它将无法获得最新的数值。让我通过如下的实例,向你展示我们可能会遇到的这种潜在问题。请时刻记住采用方法转换Flow得到的LiveData。

2023-01-08 20:01:08 434

原创 跳槽、换房、不忘输出,与你分享我匆忙的 2022~

跳槽和换房可以说是今年最重要的两件大事,对我和家庭,未来的几年乃至十年的走向,都会产生不小的影响。说成是两个转折也不为过,但这个转折是向上,还是向下,我不得而知。有很多事情的走向,很多人是不知所以的、即便知了所以也无法干预、即便干预了无法左右,它大大超出了你的认知和掌控范围。至少在房子这件事情上,我难逃韭菜的范畴。但说实在的,有人可以在有限的认知下做出完美的选择吗?况且后面的故事剧本还一直发生着变化、魔幻化,这造成当初的假设已经很难成立甚至完全相悖,那怎么还能笃定结果能够如期而至呢?

2022-12-25 11:02:29 934 5

原创 别搞错了,nonTransitiveRClass 不能解决资源冲突!

非传递性 R 类的属性,在文件里使用。不少开发者可能听过它,但了解可能仅限于是对 R 文件做了优化,甚至以为它可以解决资源冲突!但它到底做了什么优化、能否解决资源冲突,则鲜少有机会去了解。本文通过该属性使用前后对比、在资源冲突场景下的表现等角度去充分解读它。上面的示例可以看到,没有开启的话,仅仅定义10多个资源的 Module 的 R 文件会激增到4000+个 ID。这对编译速度、AAR / APK 体积的影响是可以预见的。

2022-12-12 11:42:10 1818

原创 深入理解 Android 模块化里的资源冲突

作为 Android 开发者,我们常常需要去管理非常多不同的资源文件,编译时这些资源文件会被统一地收集和整合到同一个包下面。根据官方的编译器会将源码文件转换成包含了二进制字节码、能运行在 Android 设备上的 DEX 文件,而其他文件则被转换成编译后资源。APK 打包工具则会将 DEX 文件和编译后资源组合成独立的 APK 文件。但如果资源的命名发生了碰撞、冲突,会对编译产生什么影响?事实证明这个影响是不确定的,尤其是涉及到构建外部 Library。

2022-11-27 13:17:50 1084

原创 从 internal 修饰符一探 kotlin 的可见性控制

之前探讨过的和存在module的限制,但其主要用于密封 class 的扩展和 interface 的实现。如果没有这个需求只需要限制 module 的话,使用 Kotlin 中独特的internal修饰符即可。本文将详细阐述 internal 修饰符的特点、原理以及 Java 调用的失效问题,并以此为切入点网罗 Kotlin 中所有修饰符,同时与 Java 修饰符进行对比以加深理解。internal 修饰符open 修饰符default、private 等修饰符针对扩展函数的访问控制。

2022-11-13 18:20:56 1777

原创 深入学习 Kotlin 特色之 Sealed Class 和 Interface

sealed class 以及 1.5 里新增的 sealed interface 可谓是 Kotlin 语言的一大特色,其在类型判断、扩展和实现的限制场景里非常好用。本文将从特点、场景和原理等角度综合分析 sealed 语法。每个 enum 常量只能以单例的形式存在sealed class 子类可以拥有多个实例,不受限制,每个均可以拥有自己的状态enum class 不能扩展自 sealed class 以及其他任何 Class,但他们可以实现 sealed 等 interface。

2022-10-30 09:27:56 638

原创 一文吃透 Kotlin 中眼花缭乱的函数家族...

函数在 Kotlin 语法中极为重要,了解其特点和原理对于灵活编程非常必要,再次回顾下各函数的异同及原理。函数特点原理lambda 表达式花括号内的函数体,更加简洁、便捷通过 Kotlin 中预设的Function1接口实现匿名函数定义没有名称的函数引用,供高阶函数使用同上高阶函数接收函数参数或返回函数引用接收或返回Function1接口实例扩展函数给目标类添加函数或属性生成XXXKt类添加静态函数,参数包括目标实例和其他参数内联函数。

2022-10-07 12:54:26 618

原创 开发这么久,gradle 和 gradlew 啥区别、怎么选?

翻译自《gradle-vs-gradlew-difference》使用Gradle的开发者最常问的问题之一便是: gradlegradlew。这两个都是应用在特定场景的 Gradle 命令。通过本篇文章你将了解到每个命令干了什么,以及如何在两个命令中做选择。快速摘要如果你正在开发的项目当中已经包含gradlew脚本,安啦,可以一直使用它。没有包含的话,请使用gradle命令生成这个脚本。想知道为什么吗,请继续阅读。

2022-09-18 11:34:07 4130 2

原创 软件定义汽车之 Android Automotive OS 发展历程

该系统于2017年推出,除了Google主导,还有IntelVolvo和Audi。这个项目目的是提供一个操作系统代码库,以便于汽车制造商开发他们自己的系统版本。(和各手机厂商开发独特的 Android OS 的思路完全一致)除了发短信、导航、音乐播放等信息娱乐类任务,AAOS 还想要能够处理车辆专用的功能,比如控制空调等等。与 Android Auto 不同,AAOS 并不依赖于智能手机的操作,是运行在车辆设备里的完整操作系统。...

2022-08-25 22:00:33 2265 2

原创 能说一说 Kotlin 中 lateinit 和 lazy 的区别吗?

使用Kotlin进行开发,对于latelinit和lazy肯定不陌生。但其原理上的区别,可能鲜少了解过,借着本篇文章普及下这方面的知识。

2022-07-24 09:50:24 1184

原创 M1 Pro 折腾一年的心得:一堆很“哇塞”的技巧和 App

随着 的横空出世,越来越多的企业和个人转入 生态。而由于和 平台的不同,Mac 始终有些使用上的痛点。笔者使用 近一年,倾情分享折腾出来的一堆使用技巧和珍藏 App,希望能够能够将 Mac 玩得更溜、效率更高。目录前瞻:Menu Bar, 菜单栏Finder, 访达Short Key, 快捷键Track Pad Gesture, 触控板手势Hot corners, 屏幕角分屏/多窗口珍藏 AppMenu Bar 默认置于顶部,其通过一系列 Menu Icon 展示系统或特定 App 的信息和状态,可

2022-07-10 15:39:46 3671

空空如也

空空如也

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

TA关注的人

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