- 博客(103)
- 资源 (4)
- 收藏
- 关注
原创 Android安全防护:Runtime 调试检测与反制手段
Android应用调试检测与反制技术研究 摘要:本文探讨了Android应用开发中的安全防护技术,重点分析了调试检测与反制手段。在Android Runtime环境下,应用面临被调试获取敏感信息的风险。文章介绍了多种调试检测方法:TracerPid检测通过读取/proc/self/status判断调试状态;调试端口检测检查23946等常用调试端口;进程名称检测识别android_server等调试器进程;时间差异检测利用代码执行延时判断调试行为;以及内置函数检测如android.os.Debug.isDeb
2025-08-05 10:19:22
946
原创 Android 性能优化:提升应用启动速度(GC抑制)
摘要:本文探讨了如何通过GC抑制技术优化Android应用的启动性能。GC机制在应用启动期间频繁触发会显著拖慢启动速度,导致UI卡顿和资源加载延迟。核心优化策略包括:使用对象池技术减少对象创建、延迟初始化非关键组件、优化集合类使用以及采用SparseArray替代HashMap。高级技术则涉及GC监控、内存分析工具和调整堆内存参数。这些方法能有效减少启动阶段的GC次数和耗时,提升用户体验。
2025-07-28 09:14:44
523
原创 Dart 异步编程之 Future 详解
Dart 异步编程的核心 Future 机制详解 Dart 采用单线程模型,通过 Future 实现异步操作以避免阻塞主线程。Future 表示一个异步操作的结果,包含未完成、成功完成(带值)、失败完成(带错误)三种核心状态。开发者可通过 Future.value、Future.delayed 和 Future.error 创建不同状态的 Future 对象。 处理 Future 结果主要使用 then() 处理成功值、catchError() 捕获错误、whenComplete() 执行完成回调。通过链式
2025-07-25 17:03:18
1084
原创 Android深入解析 dex 文件体积优化
摘要:本文针对Android应用中dex文件体积过大的问题展开分析。首先介绍了dex文件的结构与生成加载过程,然后详细阐述了导致体积过大的四大原因:代码冗余与重复、依赖管理不当、资源未优化和编译配置问题。针对这些问题,提出了具体的优化方案,包括代码审查精简、依赖库优化、资源压缩和合理配置编译选项等。通过系统性地分析问题根源和提供可行的解决方案,为Android开发者提供了优化dex文件体积的有效方法,有助于提升应用性能和用户体验。
2025-07-21 13:09:31
1301
原创 Android深入解析 so 文件体积优化
Android so文件体积优化指南 本文全面探讨了Android应用中so文件体积优化的关键策略。首先介绍了so文件的ELF格式基础原理,包括链接视图和执行视图的结构差异。然后分析了导致so文件体积过大的常见原因:冗余代码、过多依赖库、未优化资源和不当编译选项。针对这些问题,文章提出了四类优化方法:通过代码重构和设计模式消除冗余代码;精简不必要的依赖库并选择合适版本;压缩图片音频等资源并避免冗余;以及调整编译选项如使用strip工具移除调试信息。这些优化措施可以有效减小so文件体积,提升应用性能。
2025-07-15 13:31:13
1511
原创 Android 性能优化:启动优化全解析
Android应用启动优化技术解析 摘要:本文深入探讨了Android应用启动优化技术,从启动流程分析到具体优化方案。首先详细解析了冷启动流程的7个关键阶段,包括Zygote进程创建、应用对象初始化等。其次介绍了3种启动时间测量方法:adb命令、代码埋点和Systrace工具。核心优化策略包括:1)减少Application初始化时间,采用延迟/异步/按需初始化;2)优化布局加载,使用ConstraintLayout、ViewStub等技术;3)优化首屏数据加载,采用预加载、缓存等机制。文章通过具体代码示例
2025-07-14 09:06:59
1363
原创 ViewModel 销毁时机详解
ViewModel是Android架构组件中管理UI数据的核心类,其生命周期比Activity/Fragment更长,能在配置变更(如屏幕旋转)时保持数据存活。ViewModel会在所属Activity完全销毁时被清除,而Fragment的ViewModel则随Activity销毁而清除。开发者可通过重写onCleared()释放资源,但需避免在ViewModel中持有Activity/Fragment引用以防内存泄漏。最佳实践包括使用LiveData/StateFlow管理状态、在onCleared()中
2025-07-07 09:00:49
1086
原创 Android ClassLoader加载机制详解
Android ClassLoader机制解析:本文详细介绍了Android中的类加载机制,包括ClassLoader的核心概念、继承体系和工作原理。重点分析了双亲委派模型的实现过程,以及DexPathList和DexElement在类加载中的作用。文章还探讨了Android特有的类加载器(DexClassLoader、PathClassLoader等)与Java的区别,并提供了自定义ClassLoader的示例。通过解析ClassLoader的底层实现,有助于理解插件化、热修复等高级功能的实现原理,为相关
2025-07-04 09:05:44
1162
原创 Android SystemUI启动流程深度解析
Android SystemUI是系统的重要组成部分,负责状态栏、导航栏等用户界面的显示。其启动流程包括:Zygote进程孵化SystemServer进程,启动ActivityManagerService等核心服务;AMS通过启动SystemUIService来加载SystemUI组件;SystemUIApplication通过反射初始化StatusBar、NotificationPanel等核心模块。SystemUI与WindowManager紧密交互,以窗口形式展示界面元素。整个启动过程涉及多个系统服务
2025-07-03 09:26:07
1881
原创 Flutter Widget 生命周期详解
Flutter Widget生命周期详解:本文深入解析Flutter中Widget的生命周期机制,重点对比了StatelessWidget和StatefulWidget的不同生命周期阶段。StatefulWidget的生命周期包括创建阶段(createState、initState)、构建阶段(build)、更新阶段(didUpdateWidget、setState)和销毁阶段(deactivate、dispose),并通过代码示例展示了各阶段的触发时机和使用场景。理解这些生命周期有助于开发者编写更高效的F
2025-06-30 17:22:14
1417
原创 Android View绘制机制:从原理到实践的深度解析
本文介绍了Android View绘制体系的三大核心流程:测量(Measure)、布局(Layout)和绘制(Draw)。测量阶段通过measure()和onMeasure()方法确定View尺寸;布局阶段通过layout()和onLayout()方法确定View位置;绘制阶段通过draw()方法将View渲染到屏幕。文章详细解析了每个阶段的关键方法、MeasureSpec机制、递归测量过程、LayoutParams参数以及坐标系统等核心概念,并提供了自定义View和LinearLayout布局的代码示例,
2025-06-30 08:51:43
1339
原创 Compose UI 中 Modifier 的深度解析
Jetpack Compose中的Modifier是构建UI的核心工具,它通过链式调用实现组件外观和行为的定制。Modifier提供尺寸、布局、外观和交互四大类方法,如width/padding/background/clickable等,支持自由组合创建复杂效果。开发者可以基于Modifier.composed创建自定义Modifier,实现复用UI逻辑。其不可变性和函数式设计使Compose UI构建更灵活高效,是声明式UI开发的关键机制。
2025-06-27 11:04:41
1390
原创 Kotlin 协程:全面解析与深度探索
Kotlin协程技术解析摘要 本文系统介绍了Kotlin协程的核心概念与技术实现。首先对比了协程与传统线程的差异,协程凭借轻量级(仅KB级资源)和状态机机制实现高效并发。其次详解了协程四大组件:构建器(launch/async)、作用域(生命周期管理)、调度器(线程控制)和挂起函数(非阻塞特性)。文章还深入解析了协程上下文管理、异常处理机制等关键技术点,并通过代码示例展示了通道通信等高级应用场景。协程通过Continuation接口实现异步逻辑转换,配合Dispatchers实现线程切换,使异步编程更简洁高
2025-06-25 17:34:42
1868
原创 DeepSeek 提示词工程完全指南:从基础到高级应用
《DeepSeek提示词工程指南》摘要:本文系统介绍了DeepSeek大型语言模型的提示词设计方法。基础部分涵盖提示词结构(指令、上下文、输入、输出格式)和类型(指令式、示例式、思维链)。高级技巧包括零样本学习、少样本学习、思维链推理和自一致性验证等技术,通过代码示例展示如何优化提示词以提升模型性能。文章强调清晰性、具体性、相关性和简洁性在提示词设计中的重要性,为充分发挥DeepSeek潜力提供了实用指导。
2025-06-24 15:48:27
1689
原创 Android WebView内存释放全解析:从泄漏检测到彻底释放的实战指南
本文深入探讨了Android WebView的内存管理问题及解决方案。首先分析了WebView的内存占用特性,将其分为Java层、Native层和GPU内存三部分,并列举了常见的内存泄漏场景。随后介绍了多种检测工具和方法,包括通过/proc/pid/maps文件分析内存映射、使用dumpsys meminfo命令监控系统变量以及Android Profiler的实时监控功能。最后针对性地提出了WebView内存释放的核心步骤,包括生命周期绑定管理、缓存清理、终止渲染进程以及通过反射清理Chromium内部引
2025-06-23 09:08:56
1842
原创 DeepSeek 技术原理详解
DeepSeek是基于Transformer架构的大型语言模型,核心组件包括多头注意力机制和位置前馈网络。多头注意力通过分割输入为多个头并行处理信息,包含线性变换、注意力计算和残差连接等步骤。位置前馈网络由两个线性层和GELU激活函数组成。模型采用编码器-解码器结构,编码器层处理自注意力,解码器层额外处理编码器输出。完整Transformer由多层编码器和解码器堆叠而成,通过注意力机制有效捕捉长距离依赖关系,在自然语言处理任务中展现卓越性能。代码实现展示了关键组件的具体架构和工作流程。
2025-06-17 17:21:19
1558
原创 Android线程栈优化全解析:从创建流程到内存管控的深度实践
Android线程优化:栈空间管理与线程数量控制 本文深入探讨Android线程的栈空间内存模型和优化策略。线程默认占用1MB栈内存,过量线程易导致OOM和性能问题。 核心优化方案 线程池管理:通过ThreadPoolExecutor复用线程,避免频繁创建 栈空间定制:为轻量级任务配置512KB等更小的栈空间 协程替代:使用Kotlin协程减少线程数量 关键技术 分析线程创建流程(Java→Native→Linux) 比较不同CPU架构的默认栈大小差异 提供线程池参数配置和协程转换的代码示例 优化后能显著降
2025-06-16 08:58:12
1405
原创 Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
Bitmap优化:Android内存治理关键技术 本文系统介绍了Android应用中Bitmap内存治理的核心技术。首先阐述了Bitmap内存计算公式(宽度×高度×像素格式字节数)及不同像素格式(ARGB_8888、RGB_565等)的内存差异。其次重点讲解了通过字节码插桩技术监控Bitmap创建与回收的方法,包括使用ASM在编译期插入监控代码,记录创建堆栈、内存大小和生命周期。最后针对超大Bitmap提出了采样率加载、压缩等优化方案,以降低内存占用。文章从原理到实践,提供了完整的Bitmap内存治理方案。
2025-06-09 09:22:39
1248
原创 Android Native 内存泄漏检测全解析:从原理到工具的深度实践
Android Native内存泄漏检测技术 摘要: 本文深入分析了Android Native层内存泄漏的检测技术。Native内存泄漏由于不受JVM管理,长期积累会导致严重性能问题,约30%的OOM崩溃由此引发。检测面临三大挑战:内存分配函数拦截、堆栈信息获取和符号还原。核心解决方案包括: 使用钩子函数(__malloc_hook)或LD_PRELOAD拦截malloc/free调用 通过backtrace或libunwind库捕获调用堆栈 依赖符号表还原函数名和行号 文章详细讲解了自定义内存分配器的实
2025-06-03 08:49:15
1729
原创 Android磁盘占用优化全解析:从监控到治理的存储效率革命
摘要:本文系统介绍了Android应用磁盘占用的优化方法。首先通过开发工具(Storage Profiler、Device File Explorer)和系统API(StatFs)实现精准监控,包括存储容量统计和目录大小分析。其次解析Android存储架构,区分内部存储(私有目录)和外部存储(应用专属目录)的特性差异。最后提出优化策略,如定期清理缓存、合并SP文件、限制临时文件大小等,并建议通过埋点上报线上存储数据。通过全流程监控与优化,可有效降低应用磁盘占用,提升用户体验。
2025-05-26 08:58:50
1759
原创 Android内存泄漏检测全解析:从手动分析到自动化治理的实战指南
内存泄漏是Android应用中的常见问题,可能导致应用崩溃或界面卡顿。本文详细介绍了内存泄漏的原理、常见场景及其危害,并提供了手动分析与自动化检测的核心方法。手动分析依赖Android Studio的Memory Profiler和MAT工具,通过捕获内存快照并分析引用链来定位泄漏源。自动化检测则推荐使用LeakCanary,它能够自动监听生命周期并生成泄漏报告,提升开发效率。此外,文章还介绍了如何自定义检测其他对象以及使用其他自动化工具如Android Vitals和StrictMode。通过这些方法,开
2025-05-19 11:38:45
1558
原创 Android流量优化全解析:从监控到治理的实战指南
本文系统性地介绍了移动应用流量优化的全流程,涵盖流量监控、分类模型和优化策略三个维度。首先,通过Android Studio的Network Profiler和系统API(如TrafficStats和NetworkStatsManager)实现精准的流量监控,并结合OkHttp拦截器进行线上数据上报。其次,根据业务类型、网络类型和场景对流量进行分类,构建多维分析模型,为优化提供依据。最后,针对不同业务类型(如图片加载、API请求、视频播放等)提出具体的优化策略,如压缩、缓存、码率适配等,以降低流量消耗,提升
2025-05-12 09:07:13
1689
原创 Android耗电优化全解析:从原理到实践的深度治理指南
开发期工具适合调试,线上环境需通过日志上报和第三方平台(如Bugly、GT)收集用户真实场景的耗电数据。耗电优化是一个系统性工程,需结合统计原理、监控手段、场景治理三个维度。减少无效唤醒(优化WakeLock、使用WorkManager);降低定位/网络功耗(按需请求、批量操作);替代后台Service(使用JobService、ForegroundService);结合工具链(Battery Profiler、Battery Historian)持续监控。
2025-05-09 09:17:09
2220
原创 Android 虚拟内存:原理、应用与优化进阶
虚拟内存是一种将主存扩展到磁盘空间的技术。在 Android 系统中,每个应用都拥有独立的虚拟地址空间。这个空间看似连续,实则通过地址映射机制,映射到物理内存和磁盘交换空间。例如,一个 32 位的 Android 应用,其虚拟地址空间为 4GB,从 0x00000000 到 0xFFFFFFFF。应用在这个虚拟空间中分配和访问内存,无需关心实际物理内存的位置和使用情况。Android 虚拟内存技术为应用程序提供了强大的内存管理支持,通过合理利用虚拟内存,开发者可以优化应用性能,提升用户体验。
2025-05-06 13:17:03
2005
原创 Android Native 卡顿优化全攻略
Android Native 卡顿优化涵盖线程管理、内存管理以及代码优化等多个关键领域。通过合理设置线程优先级、减少锁竞争,优化内存分配与回收机制,以及采用高效算法并充分利用编译器优化选项,能够显著提升 Native 代码的执行效率。实际案例表明,针对不同应用场景下的卡顿问题,精准分析并实施相应优化策略,可有效解决卡顿现象,极大地提升应用的性能和用户体验。开发者在日常开发中应时刻关注 Native 代码的性能表现,将这些优化方法融入到项目中,打造出更加流畅、高效的 Android 应用。
2025-04-30 08:59:03
2142
原创 Android 应用层卡顿优化全解析
Android 卡顿优化是一个系统工程,涉及到应用开发的多个层面。从卡顿的表现形式与检测方法,到深入理解其产生的原理,包括主线程的运作机制、帧率与绘制流程以及内存管理的影响,再到对相关源码的解析,我们明确了问题的根源所在。通过一系列优化解决方案,如优化主线程任务、绘制流程和内存管理,以及实际案例的分析,我们看到了这些优化措施在提升应用性能方面的显著效果。在实际开发中,开发者应持续关注应用的性能表现,灵活运用各种优化手段,不断提升应用的流畅度和用户体验,以在激烈的市场竞争中脱颖而出。
2025-04-28 09:12:00
2230
原创 深入探究 Android Native 代码的崩溃捕获机制
C 和 C++ 语言中有许多未定义行为,例如整数溢出、除以零等。这些未定义行为在不同的编译器和运行环境下可能会产生不同的结果,往往会导致程序崩溃。// 最大的32位有符号整数// 整数溢出,结果未定义// 除以零,未定义行为通过本文对Android Native代码崩溃捕获机制的全面探索,我们清晰地认识到了Native代码崩溃的常见原因,深入理解了崩溃捕获机制的使用方法、原理以及源码实现。
2025-04-25 11:03:11
1928
原创 深入解析 Android Native Hook
通过本文的深入探讨,我们全面了解了 Android Native Hook 技术。从其丰富的使用场景,到详细的实现步骤,再到深入的原理剖析、源码解读,以及常见问题的解决方案和实际代码示例,Android Native Hook 展现出了强大的功能和广泛的应用潜力。开发者们可以基于本文所介绍的知识,进一步探索和创新,将 Android Native Hook 技术应用到更多实际项目中,为用户带来更优质、更安全的应用体验。
2025-04-24 14:18:37
2399
原创 Android OkHttp 框架的使用与源码、原理解析
为了提升应用的健壮性,开发者可以自定义异常处理机制。通过在拦截器中捕获异常,并进行统一的处理和封装,可以将复杂的异常信息转化为更友好、易于理解的错误提示。例如,可以创建一个自定义的异常类NetworkException,在拦截器中捕获各种 OkHttp 异常,并根据异常类型创建NetworkException实例,同时添加详细的错误描述信息。
2025-04-23 09:10:28
2427
原创 Android Retrofit原理解析
Retrofit 通过注解的方式将 HTTP 请求抽象成 Java 接口。在这个示例中,@GET注解指定了请求方法为 GET,"users"是请求的相对 URL。@Query注解用于添加查询参数,getUsers方法返回一个对象,Call表示一个可执行的网络请求,List<User>是响应数据的类型。类用于封装请求的各种信息,包括请求方法、URL、参数、请求头、响应类型等。它是 Retrofit 中非常重要的一个类,负责将 API 接口的注解信息和方法参数转换为具体的 HTTP 请求信息。自定义。
2025-04-22 08:59:00
2381
原创 深度解析CopyWriteArrayList工作原理
是 Java 中实现了List接口的线程安全列表。“CopyOnWrite” 即写时复制,这意味着在进行写操作(如添加、删除、修改元素)时,它会创建一个原数组的副本,在副本上进行修改,修改完成后再将引用指向新的数组。这种机制使得读操作无需加锁,从而提高了读操作的性能,尤其适用于读操作远远多于写操作的场景。通过写时复制的机制,在保证线程安全的同时,提高了读操作的并发性能。它适用于读多写少、对数据实时性要求不高的场景。然而,由于每次写操作都会创建新数组,会带来较高的空间开销和写操作性能开销。
2025-04-21 10:08:07
1496
原创 深度解析ConcurrentHashMap工作原理
是包下的一个类,实现了接口。它主要用于在多线程环境下存储和操作键值对,能够保证线程安全,并且在并发场景下具有较高的性能。常见的应用场景包括缓存系统、多线程数据统计等。是 Java 并发编程中一个非常重要的数据结构,它通过 CAS 和机制保证了多线程环境下的线程安全,同时采用数组 + 链表 + 红黑树的数据结构提高了性能。在使用时,需要注意键和值不能为null,以及迭代器的弱一致性。深入理解的原理和性能特点,有助于我们在实际开发中更好地利用它来处理并发场景下的键值对存储和操作。
2025-04-18 09:04:27
2076
原创 深度解析Hashtable工作原理
Hashtable位于java.util包下,是一个实现了Map接口的类。它主要用于存储键值对,其中键和值都不能为null。Hashtable的主要用途是在多线程环境下,提供线程安全的键值对存储和查找功能。Hashtable是 Java 中一个经典的键值对存储数据结构,它通过哈希表(数组 + 链表)实现了高效的键值对存储和查找。通过关键字保证了线程安全,但也带来了一定的性能开销。在使用Hashtable时,需要注意键和值不能为null,以及根据实际场景选择合适的并发方案。深入理解Hashtable。
2025-04-17 09:07:46
2101
原创 深度解析LinkedHashMap工作原理
是java.util包下的一个类,它实现了Map接口。与HashMap不同的是,能够记住元素的插入顺序或者访问顺序。这一特性使得它在很多场景下非常有用,例如实现缓存(如 LRU 缓存)、记录操作历史等。是 Java 集合框架中一个非常实用的类,它结合了HashMap的快速查找和插入功能,以及双向链表的有序性。通过参数,可以控制元素是按照插入顺序还是访问顺序排列。在实现 LRU 缓存等场景中,表现出了强大的优势。但在使用时,需要注意线程安全问题和性能考虑。深入理解。
2025-04-16 09:06:56
2192
原创 Flutter 图标和按钮组件
除了使用内置图标,还可以使用自定义图标字体。首先,需要将图标字体文件(通常是.ttf格式)添加到项目的assets目录下,并在flutter:fonts:fonts:然后,通过IconData@overridetitle: Text('自定义图标示例'),),size: 48,),),),这里的0xe800是自定义图标在字体文件中的 Unicode 码点。Flutter 提供的图标和按钮组件为开发者构建丰富多样的用户界面提供了强大的支持。
2025-04-15 09:12:41
2306
原创 深度解析TreeMap工作原理
TreeMap是java.util包下的一个类,实现了接口,而又继承自SortedMap接口。这意味着TreeMap中的键是有序的。它主要用于存储键值对,并且可以根据键的顺序对这些键值对进行高效的查找、插入和删除操作。常见的应用场景包括按时间顺序存储事件记录、按字母顺序存储字典条目等。TreeMap是 Java 集合框架中一个非常实用的Map实现,它基于红黑树实现了键的有序存储和高效的查找、插入、删除操作。通过自然排序或定制排序,我们可以灵活地对键进行排序。在使用TreeMap。
2025-04-15 09:02:56
2354
原创 Flutter 文本组件深度剖析:从基础到高级应用
Flutter 提供了丰富且强大的文本组件和相关属性,使开发者能够轻松实现多样化的文本展示效果。无论是简单的静态文本显示,还是复杂的富文本渲染,Flutter 都能满足需求。Flutter 提供的文本组件和相关功能为开发者提供了丰富的选择,能够满足各种复杂的文本展示和交互需求。组件是 Flutter 中最常用的文本显示组件,用于在界面上展示简单的文本内容。组件,以及文本样式、文本布局、文本交互等方面,并结合代码示例进行深入讲解。对于多语言支持的应用,需要实现文本的国际化。组件,实现文本的点击交互效果。
2025-04-14 15:58:45
1846
原创 深度解析HashMap工作原理
HashMap是java.util包下的一个类,实现了Map接口。它允许存储null键和null值,并且不保证元素的顺序。HashMap的主要用途是存储键值对,通过键可以快速查找对应的值,适用于需要快速查找和存储数据的场景,例如缓存、数据映射等。HashMap是 Java 中一个非常重要且强大的数据结构,它通过哈希表(数组 + 链表 + 红黑树)实现了高效的键值对存储和查找。在插入、查找和删除操作上,平均时间复杂度为 O(1)。通过合理设计哈希函数和处理哈希冲突,HashMap。
2025-04-14 09:23:57
2249
原创 Flutter 图片组件全面解析:从基础加载到高级应用
Flutter 提供了丰富的图片组件和功能,满足了开发者在不同场景下对图片处理的需求。从基础的本地和网络图片加载,到高级的图片缓存、裁剪、缩放、滤镜和动画处理,开发者可以利用这些功能构建出更加美观、流畅的用户界面。在实际开发中,根据具体需求灵活运用这些技巧,能够提升应用的质量和用户体验。希望本文对你在 Flutter 中使用图片组件有所帮助。
2025-04-11 09:48:15
2366
原创 深度解析LinkedHashSet工作原理
是 Java 集合框架中Set接口的一个具体实现类,位于java.util包下。它继承自HashSet,并额外维护了一个双向链表,用于记录元素的插入顺序或者访问顺序。这使得非常适合那些需要保持元素插入顺序,同时又要保证元素唯一性的场景,例如缓存、历史记录管理等。是 Java 集合框架中一个非常实用的类,它结合了HashSet的元素唯一性和链表的有序性。通过哈希表和双向链表的组合,能够高效地进行元素的插入、查找和删除操作,同时保持元素的插入顺序或访问顺序。在使用。
2025-04-11 09:45:34
2269
Java的一些案例开发,适合边学边做的,建议初学者看看
2013-10-29
android开发,适合多媒体编程的开发者
2013-10-29
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人