- 博客(30)
- 收藏
- 关注
原创 【内存优化】使用 Android Studio Profiler 分析 .hprof 文件
本文详细介绍了使用Android Studio Profiler分析.hprof堆转储文件的完整流程。主要内容包括:准备工作确认文件来源,通过菜单栏或Profiler导入文件,重点分析泄漏类的实例详情和引用链,理解GC Roots类型,以及MAT的高级技巧如对比文件和OQL查询。文章还提供了与LeakCanary报告的对照方法、常见问题解决方案,并总结出标准的分析流程图。通过这套方法,开发者可以精准定位内存泄漏问题,特别是由静态字段或后台任务导致的Context泄漏。
2025-12-16 17:04:19
1168
原创 【内存优化】LeakCanary 与 Monkey 测试结合使用
LeakCanary与Monkey测试结合可有效检测内存泄漏。Monkey模拟用户操作触发页面跳转,LeakCanary监控组件泄漏。关键步骤:1)使用debug版本APK确保LeakCanary生效;2)运行Monkey测试时限定包名和适当延迟;3)通过Logcat日志或hprof文件确认泄漏。建议编写自动化脚本集成到CI流程,实现泄漏自动检测与分析。这种组合能在压力测试中高效发现内存问题,提升应用稳定性。
2025-12-15 14:24:29
663
原创 【内存优化】在项目里集成 LeakCanary
摘要:LeakCanary 是 Android 开发中检测内存泄漏的高效工具。本文详细介绍了最新版本(v2.13)的集成方法:只需在 build.gradle 中添加 debug 依赖即可自动监测 Activity、Fragment 等组件泄漏。文章还涵盖自定义配置、结果查看、高级排除技巧及注意事项,并提供了验证集成成功的测试方法。通过简单配置,开发者可快速发现和修复内存泄漏问题,提升应用性能。
2025-12-15 14:19:49
738
原创 Kotlin 中的 inline 和 reified 关键字
在 Kotlin 里,inline 和 reified 经常成对出现,但它们各自解决的问题并不一样。下面把两个关键字拆开讲,再给出它们“合体”时的典型用法。Kotlin 的高阶函数(参数里带 lambda)会被编译成对象。原地展开(copy-paste),彻底消除上述开销。被直接硬编码在调用处,因此运行期可以安全强转。也写进字节码里,于是运行时就能拿到。具体是什么,因而无法安全转换。反编译结果里只剩下一行。和计时代码,没有任何。reified 做了什么。inline 做了什么。
2025-11-13 09:48:21
275
原创 基于 Launcher3 的 iOS 风格桌面 04 拖拽和移位
摘要:本文介绍了桌面应用图标删除移位和拖拽移位的实现方案。删除移位通过修改removeItemsByMatcher方法实现后方应用前移;拖拽移位包括页面内拖拽和跨页拖拽,分别通过rearrangeChildren方法处理应用前移/后移逻辑,以及onAlarm方法处理跨页拖拽时自动准备空位。关键点在于计算目标位置索引、确定移动方向,并为拖动视图准备新的单元格位置。
2025-10-28 16:38:32
430
1
原创 Android 系统中的 App 启动流程
Android应用启动流程涉及三大核心服务协同工作:AMS负责接收启动请求并管理进程生命周期,PMS解析Intent并校验权限,WMS处理窗口创建与显示。首先Launcher通过Binder向AMS发起请求,AMS调用PMS解析目标Activity信息并检查权限。若进程不存在,AMS通过Zygote创建新进程,初始化ActivityThread主线程环境。
2025-10-23 15:02:21
1111
原创 Android 系统的进程模型
Android进程模型基于Linux进程但受AMS管控,核心是通过动态调整进程优先级(oom_adj)实现资源管理。进程优先级由最活跃组件决定,从高到低分为前台、可见、服务、后台和空进程。AMS结合LMK机制按优先级回收进程,优先保留交互进程。特殊进程如Persistent进程具有高存活优先级。该设计通过组件绑定进程、动态优先级调整和智能回收机制,在有限内存下平衡性能与用户体验。
2025-10-21 20:33:00
790
原创 Android 系统中进程间通信方式
方式底层原理优点缺点典型场景Binder内核驱动+内存映射效率高(1次拷贝),支持双向通信实现较复杂(需AIDL)跨进程服务调用(AIDL、Messenger)SocketTCP/UDP 协议通用,支持跨设备效率低,需处理网络问题跨设备通信、文件传输文件共享磁盘文件简单,适合静态数据实时性差,有并发问题配置信息共享Binder适合结构化数据,支持权限控制仅支持基本数据操作(增删改查)联系人、媒体库等数据共享广播Binder(AMS 分发)简单,一对多通信。
2025-10-20 16:57:39
489
原创 Android 系统中的事件分发机制
Android点击事件传递机制采用双向流程:首先从父View到子View(捕获阶段),再从子View到父View(冒泡阶段)。核心通过dispatchTouchEvent()、onInterceptTouchEvent()和onTouchEvent()三个方法实现。事件从Activity开始,依次经过ViewGroup判断是否拦截,最终由消费事件的View处理完整事件序列。
2025-10-20 13:58:50
973
原创 Android 中 invalidate 和 requestLayout 的区别
若只需更新 View 的显示内容(如颜色、文本),用(性能更优)。若 View 的尺寸、位置发生了变化,用(会自动处理必要的重绘)。错误使用可能导致问题:例如,修改了 View 尺寸却只调用,会导致布局不更新,显示异常;反之,仅修改颜色却调用,会造成不必要的性能浪费。
2025-10-20 13:31:57
437
原创 Android 自定义 View 如何设置默认尺寸
本文介绍了在 Android 自定义 View 中设置默认宽度和高度的方法。核心是在 onMeasure() 方法中处理测量逻辑,根据 MeasureSpec 模式决定使用默认值还是父容器约束。具体步骤包括:1) 在构造方法中定义默认宽高并进行单位转换;2) 重写 onMeasure(),针对不同测量模式(EXACTLY、AT_MOST、UNSPECIFIED)计算最终尺寸。关键点在于正确处理 wrap_content 情况并使用默认值,同时兼容 match_parent 和具体尺寸设置。
2025-10-20 13:05:54
269
原创 AIDL 接口中的 in、out、inout、oneway 关键字
/ 1. in + oneway:异步传递输入参数(调用方发指令,不等待结果)// 2. out + 同步:同步获取服务端输出结果(调用方等待服务端填充数据)// 3. inout + 同步:同步双向交互(调用方传初始配置,服务端更新后返回)
2025-09-18 20:49:29
510
原创 什么是汽车 DMS 系统
车辆DMS系统(驾驶员监控系统)通过计算机视觉和传感器实时监测驾驶员状态,主要功能包括检测疲劳驾驶(闭眼、打哈欠)、分心行为(视线偏离、使用手机)及危险动作(未系安全带、吸烟)。系统通过红外摄像头采集数据,利用AI算法分析面部特征和行为,采取声光震动等多级预警。应用场景涵盖乘用车(防疲劳)和商用车(法规强制安装)。未来将向多功能融合、多模态监测和隐私保护方向发展,成为智能汽车的标配安全配置,有效预防人为因素导致的事故。
2025-09-16 13:05:18
1355
1
原创 Android 中 ViewGroup 的 clipToPadding 和 clipChildren 属性
clipToPadding和clipChildren是Android中控制视图裁剪行为的两个重要属性。clipToPadding决定子视图是否被父容器的padding区域裁剪,默认true会裁剪,false则允许延伸到padding区,常用于实现滚动列表的自然过渡效果。clipChildren控制子视图是否被自身边界裁剪,默认true限制在布局范围内,false允许超出边界显示。两者常配合使用:clipChildren处理子视图自身溢出,clipToPadding处理父容器padding区的显示。
2025-09-15 11:19:24
911
原创 Launcher3 新应用添加到主屏幕时,如何避免自动跳转到新应用页面
在 Android 系统的 Launcher3 启动器中,当新应用被安装并添加到主屏幕时,默认行为通常是自动跳转到新应用所在的页面,以便用户立即看到新安装的应用。然而,在某些定制化场景下,我们可能需要禁用这一自动跳转行为,让用户保持在当前页面。
2025-09-12 10:16:17
345
原创 Android 使用使用 flow 来实现一次性事件的最佳实践
本文介绍了在Android开发中处理一次性事件(如按钮点击、条目删除等)的最佳实践方案。一次性事件与StateFlow不同,它们不需要缓存且触发后应仅消费一次。文章按照安全性和易用性排序,推荐了三种主要方法: Channel方案(官方推荐): 使用Kotlin的Channel组件实现一对一事件发送/接收 无缓存特性可避免页面重建后重复执行 需配合repeatOnLifecycle实现生命周期安全 EventWrapper封装方案: 通过包装类标记事件消费状态 适合已使用StateFlow但需处理一次性事件的
2025-09-09 16:32:22
1102
原创 基于 Launcher3 的 iOS 风格桌面 03 文件夹支持
本文介绍了Launcher文件夹图标和展开状态的修改方案,主要包括以下内容: 文件夹图标修改: 实现九宫格显示(3x3布局) 调整图标大小和位置计算 修改文件夹背景色和圆角 文件夹展开状态修改: 将应用图标排列改为2x6网格布局 解除尺寸限制实现全屏展示 自定义宽高参数 修改背景颜色 这些修改涉及多个类的调整,包括图标布局规则、网格组织器、视图测量等核心功能,同时修改了相关的XML资源配置。通过代码片段展示了具体实现方法,如九宫格位置计算、尺寸参数调整等关键逻辑。
2025-09-05 16:09:02
841
1
原创 Android Activity 中收集 StateFlow 的最佳实践
本文介绍了在Android Activity中安全收集StateFlow的最佳实践,重点包括:1)使用lifecycleScope和repeatOnLifecycle实现生命周期感知的收集;2)合理选择collect或collectLatest运算符;3)自动线程切换机制;4)与ViewModel的配合使用。文章提供了完整代码示例,强调在正确生命周期阶段收集数据、避免内存泄漏和资源浪费,并对比了StateFlow与LiveData的适用场景。这些实践能确保UI数据流的高效管理和性能优化。
2025-09-03 19:31:14
467
原创 Android 系统应用如何监听系统热点AP的开关状态
摘要:Android系统级应用可通过高权限方式监听热点状态变化。主要方法包括:1) 使用WifiManager结合广播监听;2) 在API 26+通过registerDefaultNetworkCallback间接判断。实现需要系统签名和CONFIGURE_WIFI权限,能获取热点SSID、密码等详细信息。该方法适用于定制ROM或设备管理应用,普通应用因权限限制无法实现。关键点包括热点状态枚举值、自启动设置及系统级API调用限制。
2025-09-03 16:10:24
384
原创 使用 Binder 机制监听进程死亡
Android Binder进程死亡监听机制 Binder是Android进程通信(IPC)的核心机制,其DeathRecipient功能可监听服务端进程异常终止。关键实现包括: 原理:Binder驱动检测服务端进程终止后,通知所有注册了死亡回调的客户端 核心类: IBinder.linkToDeath()注册监听 DeathRecipient.binderDied()回调处理
2025-09-03 11:00:25
923
原创 基于 Launcher3 的 iOS 风格桌面 02 桌面图标展示
本文介绍了将Launcher3桌面改造为Launchpad样式的主要步骤。通过WorkspaceHelper工具类实现将所有已安装应用图标自动添加到桌面,并支持新安装应用自动添加。在LoaderTask和PackageUpdatedTask中调用相关方法实现功能。此外,还调整了桌面图标布局,在device_profiles.xml中修改了6x3网格参数,包括行列数、图标尺寸和边距等;在dimens.xml中设置了工作区的垂直和水平padding值,优化了桌面显示效果。
2025-09-02 19:54:11
492
原创 基于 Launcher3 的 iOS 风格桌面 01 布局修改
摘要:Launcher功能禁用清单 本文档详细记录了如何禁用Android Launcher中的多项交互功能,包括搜索框、Hotseat区域、拖拽条等8项关键组件。通过全局功能开关定义和布局修改相结合的方式实现:在FeatureFlags类中定义7个BooleanFlag控制开关;针对不同组件,分别采用隐藏布局视图、置零尺寸、拦截触摸事件等具体方案。重点对Hotseat区域进行了全面处理,包括清理默认配置、隐藏布局、禁用手势响应等5项措施。所有修改均通过条件判断实现,保持代码可维护性。
2025-09-02 19:48:00
393
原创 Kotlin CoroutineScope.cancel 和 Job.cancel 有何联系
Kotlin协程中CoroutineScope.cancel()和Job.cancel()都用于取消协程,但作用范围不同。scope.cancel()会取消作用域内所有协程(通过取消根Job)并使作用域失效,适用于组件销毁等场景;而Job.cancel()仅取消单个Job及其子Job,不影响作用域其他协程,适合精细控制任务。二者都基于Job的层级结构实现递归取消,但前者用于整体管理,后者用于局部控制。开发时应优先使用scope.cancel()管理生命周期,必要时才用Job.cancel()处理特定任务。
2025-08-27 20:07:24
843
原创 Android 系统应用如何根据包名静默卸载应用
摘要:Android系统出于安全考虑,严格限制静默卸载应用,仅系统级应用或Root权限设备可实现。系统应用需预装在/system目录并使用厂商签名,通过PackageInstaller或PackageManagerAPI实现无确认卸载;Root方案需执行pm uninstall命令。普通应用只能调用系统卸载界面(需用户手动确认)。高版本Android推荐使用PackageInstaller,需配合PendingIntent接收结果。该功能深度依赖系统权限,普通开发者无法直接实现。(149字)
2025-08-27 10:44:31
1226
原创 Kotlin Flow 与数据倒灌
冷流和热流是Kotlin协程中两种数据流模式:冷流按需产生数据,每个收集者触发独立数据流;热流主动产生数据,多个收集者共享同一数据流。数据倒灌指新订阅者接收到历史数据现象,主要发生在热流中,由缓存机制导致。避免方法包括:冷流无需处理;热流需合理配置SharedFlow的replay参数(0表示不缓存历史数据)及缓存策略,区分事件和状态场景使用。
2025-08-25 10:54:27
954
原创 Android Splash 的最佳实践
如何通过品牌广告主题有效利用 App 的冷启动时间 App 的冷启动时间取决于它的尺寸大小以及你在它的 Application 类的 onCreate() 方法内的所部属任务的多少(我希望尽可能的少)。
2017-04-07 11:45:57
2362
原创 Improve Android App Performance
According to Droidcon NYC 2015 : 10 ways to improve your Android app performance
2016-03-05 22:41:06
532
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅