- 博客(78)
- 资源 (5)
- 收藏
- 关注
原创 Android ADB命令之内存统计与分析
摘要:本文介绍了Android内存分析的核心命令集及其应用场景。adb shell dumpsys meminfo可查看设备全局及应用详细内存状态;adb shell top用于实时监控进程资源占用;adb shell am dumpheap可导出Java堆文件进行深度分析;adb shell setprop libc.debug.malloc支持Native内存分配追踪(需root权限)。文中详细解析了各命令输出参数,提供了异常检测方法,并包含优化建议脚本,帮助开发者全面掌握Android系统内存分析与优
2025-07-26 17:21:23
796
原创 Android Studio Memory Monitor内存分析核心指标详解
本文解析了内存分析中的四个关键指标:Shallow Size(对象自身内存)、Retained Size(可释放总内存)、Native Size(本地内存)和Depth(引用层级)。通过用户详情页案例,展示了各指标的计算方法,并深入讲解了计算规则和特性。重点分析了高Retained Size、Native内存泄漏和引用过深的风险,提出了优化策略和工具验证方法。核心建议:优先优化高Retained Size对象,警惕Native内存泄漏,控制引用层级不超过7层,使用Memory Profiler和MAT等工具
2025-07-26 01:43:52
755
原创 Android 项目中如何在执行 assemble 或 Run 前自动执行 clean 操作?
在 Android 项目中,会删除构建目录build/下的所有缓存文件,从而强制 Gradle 进行全量重新构建。这对解决某些构建错误非常有效,但代价是构建时间显著增加。clean是一种构建前的重置手段,有用但不要滥用。使用场景推荐方式临时排查构建问题✅ 命令行组合(方法1)Android Studio 日常调试✅ Before Launch(方法2)自动化脚本 / CI✅ 自定义 Gradle 任务(方法3)
2025-07-20 19:04:38
832
原创 Kotlin 中 Lambda 表达式的语法结构及简化推导
本文详细介绍了Kotlin中Lambda表达式的使用。首先讲解了完整语法结构{参数:类型 -> 函数体},并通过查找最长水果名的实例演示其应用。随后逐步推导了五种简化写法:从定义变量传入、直接传入、调整位置、省略括号到利用类型推导和使用it关键字。这些技巧能显著提升代码简洁性,如最终简化为list.maxBy{it.length}。掌握Lambda表达式有助于编写更优雅高效的Kotlin代码。
2025-05-27 23:05:45
729
原创 Kotlin中let、run、with、apply及also的差别
函数主要用途返回值访问对象的方式let对对象进行操作并返回处理结果处理结果itrun对对象进行操作并返回处理结果处理结果thiswith对对象进行多次操作并返回处理结果处理结果thisapply对对象进行初始化并返回对象本身原始对象本身thisalso对对象进行副作用操作并返回对象本身原始对象本身it这些作用域函数在 Kotlin 中为开发者提供了灵活的工具,使得代码更加简洁和可读。在实际开发中,选择合适的作用域函数能够有效提升代码的可维护性。
2025-05-24 22:29:53
788
原创 Android多维度构建:灵活配置不同包名、应用名称和图标
:定义产品风味的分类维度(如环境、渠道等)dimension:指定每个产品风味属于哪个维度android {dev {dimension "environment" // 开发环境配置 } google {dimension "channel" // Google渠道配置 } } }轻松管理同一应用的不同版本灵活配置不同包名、应用名称和图标为不同环境、渠道创建定制化版本保持代码库的统一性和可维护性。
2025-05-24 15:37:06
623
原创 如何单独指定 Android SDK tools 的 monitor.bat 使用特定 JDK 版本
在 Android 开发过程中,Android SDK Tools 提供了许多实用工具,其中 monitor.bat 是 Windows 下用于启动 Android Device Monitor 的批处理文件。Device Monitor 可以帮助我们查看日志、内存、线程等运行信息。JDK 与 monitor.bat 的关系:monitor.bat 启动时会依据系统环境变量(例如 JAVA_HOME)确定使用哪个 Java 运行环境。
2025-04-06 15:33:15
490
原创 Android Activity栈关系解析
→ 管理多个 ActivityDisplay(每个屏幕一个)→ 每个 ActivityDisplay 管理多个 ActivityStack→ 每个 ActivityStack 管理多个 TaskRecord→ 每个 TaskRecord 管理多个 ActivityRecordActivityRecord 是砖块,TaskRecord 是房间,ActivityStack 是楼层,ActivityDisplay 是整栋楼,ActivityStackSupervisor 是物业总公司。
2025-03-02 04:07:42
802
原创 Java中将异步调用转为同步的五种方法
其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步。换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果。同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为。在需要多轮协作的场景中的典型用法,例如:分布式计算分片处理、游戏多玩家回合制操作等。使用Future的方法和之前不太一样,我们调用的异步方法也不一样。
2025-02-26 00:07:12
1495
原创 ubuntu20.04安装imwheel实现鼠标滚轮调速
Ubuntu 系统自带的设置中仅具备调节鼠标速度的功能,而无调节鼠标滚轮速度的功能。其默认的鼠标滚轮速度较为缓慢,在查看文档时影响尚可接受,但在快速浏览网页时,滚轮速度过慢会给用户带来不便,用户往往期望能够加快滚动速度。若要实现鼠标滚轮速度的调节,需安装 imwheel 软件。
2024-12-23 01:08:24
881
原创 Android中perform和handle方法的区别——以handleLaunchActivity与performLaunchActivity为例
在Android系统中,和方法经常出现在关键流程中,分别承担不同的职责。这种命名约定反映了框架设计中的分层思想,帮助开发者区分任务的调度与实现。本文通过和这两个典型方法的源码分析,详细讲解它们的区别和设计意图。方法:方法:总结: 专注于实现任务,专注于管理任务的流程。和是中两个核心方法,用于启动Activity。以下从源码角度说明这两个方法的职责分工和调用关系。源码():职责:源码():职责:执行具体的Activity初始化逻辑,包括:返回初始化完成的Activity实例。通过源码分析可
2024-11-17 14:57:45
963
原创 ActivityStartController 和 ActivityStarter 的工作原理
ActivityStarter 作为 Android 系统中负责启动 Activity 的关键组件,其在整个应用架构中有着独特的地位和作用。它依托于 Android 强大的框架体系,运用了诸如反射机制、任务栈管理等核心技术来实现 Activity 的精准启动。反射机制在 ActivityStarter 中被广泛应用于根据 Activity 的类名动态地创建 Activity 的实例。
2024-11-16 19:43:30
905
原创 Android 中的 Zygote 和 Copy-on-Write 机制详解
Zygote 是 Android 的母体进程,负责创建应用程序的进程。当 Android 启动时,系统会首先启动 Zygote 进程,并加载一些常用的系统库和资源。之后,当有新的应用启动请求时,Android 系统不会重新创建一个独立进程,而是通过fork一个 Zygote 的子进程来创建新的应用进程。这个新进程会继承 Zygote 的所有资源,从而极大地加快了启动速度。减少内存占用:Zygote 进程加载的资源(如系统库)可以共享给所有应用进程,显著减少内存占用。提升应用启动速度。
2024-11-15 02:10:20
1369
原创 避免误差!Android 中正确计算时间差的方式
在 Android 开发中,是计算时间差异的最佳选择,尤其是当计时过程可能跨越系统待机或涉及高精度的时间间隔计算时。它的单调递增特性和独立于系统时间调整的特点,确保了计时的连续性和稳定性。而更适合用来获取绝对的系统时间,例如记录日志时间、事件的发生时间等。选择合适的计时方法,不仅可以避免时间误差带来的影响,还能提升应用性能,确保计时功能的可靠性。希望本文能帮助你在实际开发中理解和应用这些计时方法,写出更高效、准确的 Android 应用!
2024-11-15 00:53:52
1281
1
原创 Android 中 View 与 SurfaceView 主动与被动更新的应用场景
在 Android 开发中,View和是两种常用的视图绘制组件。它们虽然都能用于绘制内容,但其更新机制不同,分别适用于不同的场景。理解它们的区别,有助于在开发中选择合适的组件。
2024-10-10 03:34:51
741
原创 Android一个APP里面最少有几个线程
这个线程是否也是每个进程所必须包含的线程。后来我查看了一下Daemons创建的过程,能确定的是Android启动一个APP最少包含ReferenceQueueDaemon线程、FinalizerDaemon线程、FinalizerWatchdogDaemon线程、HeapTaskDaemon线程,以及在ActivityThread中开启的主线程。的源码发现 startHeapTaskProcessor()、runHeapTasks()均是native方法。页面的工程,线程包含以下的这些。
2024-10-07 00:32:05
1998
原创 SynchronousQueue 的 常用场景及使用示例
是 Java并发框架中的一个特殊类型的阻塞队列,它的特点是队列内部容量为零,即不存储元素。每个put操作必须等待一个对应的take操作,反之亦然,因此它主要用作线程间的直接 hand-off(传递)工具,而不是作为一个缓冲区。以下是的一些常用场景及一个简单的使用示例。
2024-10-05 03:34:10
592
原创 Java 类加载委托机制
Java 中的类加载机制是 JVM 的核心之一,它通过将字节码加载到内存中,使得程序能够正常运行。而在这个过程中,Java 引入了一种独特的“类加载委托机制”(也称双亲委派机制),以确保类加载的稳定性与安全性。本篇文章将详细阐述这一机制的原理、实际应用及其潜在的优缺点,帮助读者深入理解这一关键概念。
2024-10-03 05:39:01
953
原创 Java操作数栈分析
操作数栈的核心作用是在方法执行过程中存储中间计算结果。每当需要进行数学运算、方法调用或者对象操作时,JVM 会通过操作数栈来传递这些数据并处理结果。
2024-09-19 01:12:18
532
原创 Android Room 数据库自动升级与迁移策略
Room 数据库的版本升级需要谨慎对待。每当数据库结构发生变化时,务必升级版本号并提供相应的迁移逻辑,以确保已有的数据不会丢失。同时,通过合理规划数据库结构和版本迁移策略,可以最大程度地避免版本升级带来的潜在问题。在实际项目中,随着业务逻辑的不断演进,数据库升级几乎是不可避免的。掌握 Room 的迁移机制,有助于我们更好地维护项目的稳定性。
2024-09-18 01:29:30
1753
原创 Android单元测试框架Robolectric使用教程
Shadow类需要通过注解与原始类关联在一起若原始类有有参构造方法,可以选择在Shadow类中定义类型的名为的方法,且方法参数与原始类的构造方法参数一致定义与原始类方法签名一致的方法,在里面重写实现,Shadow方法需用进行注解Robolectric支持原始类上的所有方法生成Shadow方法,包括或native。Shadow方法必须实现最原始类的定义方法,如, 如果你想shadow方法那你应该去shadowView的而不是ViewGroup的,否则当你对ViewGroup调用将不起作用。
2024-09-08 23:23:41
5205
2
原创 PowerMock 单元测试总结与常见坑解决方案
用于 mock 静态方法。: 抑制某个类的构造函数。: 禁止某个类的方法执行。: 禁止某个类的字段初始化。: 使用反射设置类的私有成员变量。: 禁止静态初始化块的执行。当遇到复杂的类结构,PowerMock 提供了丰富的工具来帮助我们绕过不必要的依赖并聚焦于类本身的测试逻辑。通过组合使用mockStaticsuppress以及等方法,可以有效解决静态方法、final 方法、私有方法等难以测试的场景。合理地使用和注解,能够帮助我们避免常见的类加载和初始化错误,从而编写更健壮的单元测试代码。
2024-09-07 03:53:00
1735
原创 PowerMock 注解和使用方法
和@RunWith注解是结合使用的,不要单独使用它们中的任何一个,否则不起作用。当使用 PowerMock 去 mock 静态、final 或者私有方法时,需要加上这两个注解。注意:在输入@RunWith注解时,IDE(如 Eclipse)可能会自动导入包,记得把它换成,否则会抛出异常。
2024-09-07 02:09:02
949
原创 Android Studio Module 引入aar
例如,如果您在实际开发中,需要添加其他的依赖库,按照上述的格式在。部分进行相应的配置即可。目录位置有所变化,那么在。中的路径也需要相应地修改。
2024-07-30 01:15:29
783
原创 网络请求的读取和写入理解
写入时间:从开始发送请求数据到数据成功发送出去的时间。例如,填写表单、准备数据、发送到服务器。读取时间:从开始接收服务器响应数据到数据成功读取并处理完毕的时间。例如,接收数据包、解析数据、处理响应。写入时间就像寄信:你写信、封好信封并寄出。读取时间就像收信:你收到信、打开信封并阅读信件内容。在网络请求的过程中,客户端先进行写入操作(发送请求),然后进行读取操作(接收响应)。这个顺序确保客户端可以发送所需的数据给服务器,并在服务器处理完请求后接收到相应的响应数据。
2024-07-28 18:11:25
704
原创 android工程中gradle编译时的所有task,打印其依赖和输入输出
【代码】android工程中gradle编译时的所有task,打印其依赖和输入输出。
2024-07-18 01:28:53
438
原创 关于 LayoutInflater.inflate 的取值结论
时,返回的对象上则拥有根节点的布局参数。时,所返回的是不具备布局参数信息的根节点。
2024-07-15 04:01:57
254
原创 Windows文件无法固定到开始菜单
创建exe文件的快捷方式在exe快捷方式上右键 - 固定到开始屏幕任务管理器中找到windows资源管理器,右键,重新启动这时此文件会在开始屏幕找到。
2024-07-14 22:43:36
906
原创 Python实现批量下载文件
从配置文件或命令行参数读取下载任务列表,使用库读取配置文件,使用argparse库处理命令行参数。argparse。
2024-07-10 03:26:35
1177
原创 Android Bitmap 和Drawable的区别
直接操作:Bitmap:允许直接操作图像的像素数据,适用于图像处理和操作。Drawable:无法直接操作像素数据,更适合于通用的图形绘制。灵活性:Bitmap:主要用于位图图像,较为简单直接。Drawable:抽象类,提供了更丰富的子类和功能,适用于更复杂的图形操作。内存管理:Bitmap:占用内存较多,需要手动管理生命周期(如调用recycle()方法)。Drawable:内存管理由系统负责,相对更加安全和方便。类型支持:Bitmap:仅支持位图图像。
2024-07-02 01:45:45
685
原创 Message的复用
不仅是Android开发中一个高效的消息创建策略,更是面向性能优化设计思想的典型体现。它通过简单而高效的对象池模式,最大限度地减少了对象创建的开销,展示了Android框架在细微处对性能极致追求的设计哲学。开发者应当充分利用此类API,以构建更加高效、响应迅速的Android应用。
2024-06-01 19:31:55
629
1
原创 Bash 脚本常用命令
示例:输出“Hello, World!中所有的“apple”替换为“orange”。Bash 脚本中也经常用到条件判断和循环结构。文件的第一列(默认以空格或制表符分隔)。文件的某个字段内容。示例:列出当前目录所有文件和文件夹。在 Bash 脚本中,你可以使用。示例:遍历当前目录下的所有文件。中搜索包含“error”的行。表示将第二列的值增加 5,然后。示例:查看当前目录路径。示例:切换到用户主目录。示例:检查文件是否存在。示例:从 1 数到 5。示例:创建一个新文件。
2024-04-18 01:55:43
922
原创 Android混淆不要怕--一文搞定
默认的混淆规则,放在目录下进一步压缩代码混淆规则,但是会更加耗时,放在目录下proguard-rules.pro:自己写的混淆配置usage.txt :经过压缩过程被删除的类、方法、字段。mapping.txt :存储经过混淆过程,新旧类名、方法名、字段名的映射,软件发布一定要保留此文件,不然收集上来的报错信息,不知道具体是哪个类或方法,你将会很是头疼。seeds.txt :被 Keep 规则匹配到的类、方法、字段,来验证我们的 keep 规则是否合我们的需求。
2024-03-25 22:50:05
3303
原创 Android 开发RxJava2常用操作符
当源 Observable 完成时,reduce 操作符才会发出结果。通过组合多个 Observables 的发射物来创建一个新的 Observable。当任意一个原始 Observable 发射一个新的值时,zip 操作符都会把所有其他原始 Observables 的值组合起来,并发射这个组合的值。在 Android 开发中,RxJava 2 是一个强大的异步编程库,提供了丰富的操作符来简化数据流的处理。创建一个新的 Observable,可以在 subscribe() 方法中定义回调函数。
2023-09-24 03:05:58
311
Android studio 翻译插件
2018-01-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人