自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

猿小蔡的博客

每一天都是值得期待的一天。

  • 博客(82)
  • 资源 (5)
  • 收藏
  • 关注

原创 Gradle 中 Maven 仓库配置

Gradle 配置 Maven 仓库指南 本文详细介绍了在 Gradle 中如何配置 Maven 仓库,包括基础配置、常用参数和高级过滤技巧。主要内容: 基础配置:通过 maven 块声明仓库地址,支持 HTTPS/HTTP 协议 关键参数:包括 url、credentials 认证、allowInsecureProtocol 等 核心功能:重点讲解 content {} 块的依赖过滤功能,提供多种包含/排除依赖的方法 完整示例:展示企业级配置方案,包含安全认证和模块过滤 通过合理配置仓库,可以优化依赖解析

2025-09-21 02:18:01 1128

原创 Android Studio 构建变体中的资源选择顺序详解

本文解析了Android开发中资源合并的优先级规则。当同一资源存在于不同目录时,Gradle会根据构建变体的具体情况按优先级选择:最具体的构建变体目录(如devGoogleDebug)优先级最高,其次是组合Flavor目录(devGoogle)、单一Flavor目录(dev/google)、构建类型目录(debug),最后是main目录。资源合并遵循"最具体优先"原则,开发者可利用这一规则管理多环境下的资源,避免冲突。理解这一机制有助于正确处理不同构建变体下的资源覆盖问题。

2025-09-06 17:30:22 530

原创 Robolectric拿到当前的Activity

在 Robolectric 测试中获取当前 Activity 的方法: 若手动通过 Robolectric.buildActivity() 启动,直接使用返回的实例即可; 若通过 startActivity(Intent) 启动,需通过 ShadowApplication 获取启动的 Intent,再手动构建目标 Activity 实例。 Robolectric 不会自动创建通过 Intent 启动的 Activity,需要开发者显式处理。

2025-08-31 00:01:50 1038

原创 Robolectric如何启动一个Activity

Robolectric启动Activity的简明指南 基本用法 通过Robolectric.buildActivity(MyActivity.class).create().start().resume().get()模拟生命周期,支持UI测试。 带Intent启动 传入自定义Intent测试参数传递: Robolectric.buildActivity(MyActivity.class, intent).resume().get(); 动态类启动(反射场景) 使用Class.forName()加载类名,强

2025-08-30 23:57:13 1032

原创 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 2273

原创 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 903

原创 Android 项目中如何在执行 assemble 或 Run 前自动执行 clean 操作?

在 Android 项目中,会删除构建目录build/下的所有缓存文件,从而强制 Gradle 进行全量重新构建。这对解决某些构建错误非常有效,但代价是构建时间显著增加。clean是一种构建前的重置手段,有用但不要滥用。使用场景推荐方式临时排查构建问题✅ 命令行组合(方法1)Android Studio 日常调试✅ Before Launch(方法2)自动化脚本 / CI✅ 自定义 Gradle 任务(方法3)

2025-07-20 19:04:38 994

原创 Kotlin 中 Lambda 表达式的语法结构及简化推导

本文详细介绍了Kotlin中Lambda表达式的使用。首先讲解了完整语法结构{参数:类型 -> 函数体},并通过查找最长水果名的实例演示其应用。随后逐步推导了五种简化写法:从定义变量传入、直接传入、调整位置、省略括号到利用类型推导和使用it关键字。这些技巧能显著提升代码简洁性,如最终简化为list.maxBy{it.length}。掌握Lambda表达式有助于编写更优雅高效的Kotlin代码。

2025-05-27 23:05:45 787

原创 Kotlin中let、run、with、apply及also的差别

函数主要用途返回值访问对象的方式let对对象进行操作并返回处理结果处理结果itrun对对象进行操作并返回处理结果处理结果thiswith对对象进行多次操作并返回处理结果处理结果thisapply对对象进行初始化并返回对象本身原始对象本身thisalso对对象进行副作用操作并返回对象本身原始对象本身it这些作用域函数在 Kotlin 中为开发者提供了灵活的工具,使得代码更加简洁和可读。在实际开发中,选择合适的作用域函数能够有效提升代码的可维护性。

2025-05-24 22:29:53 864

原创 Android多维度构建:灵活配置不同包名、应用名称和图标

​​:定义产品风味的分类维度(如环境、渠道等)​dimension​:指定每个产品风味属于哪个维度android {dev {dimension "environment" // 开发环境配置 } google {dimension "channel" // Google渠道配置 } } }轻松管理同一应用的不同版本灵活配置不同包名、应用名称和图标为不同环境、渠道创建定制化版本保持代码库的统一性和可维护性。

2025-05-24 15:37:06 807

原创 如何单独指定 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 549

原创 Android Activity栈关系解析

→ 管理多个 ActivityDisplay(每个屏幕一个)→ 每个 ActivityDisplay 管理多个 ActivityStack→ 每个 ActivityStack 管理多个 TaskRecord→ 每个 TaskRecord 管理多个 ActivityRecordActivityRecord 是砖块,TaskRecord 是房间,ActivityStack 是楼层,ActivityDisplay 是整栋楼,ActivityStackSupervisor 是物业总公司。

2025-03-02 04:07:42 893

原创 Java中将异步调用转为同步的五种方法

其实,两者的区别还是很明显的,这里也不再细说,我们主要来说一下Java如何将异步调用转为同步。换句话说,就是需要在异步调用过程中,持续阻塞至获得调用结果。同步调用:调用方在调用过程中,持续等待返回结果。异步调用:调用方在调用过程中,不直接等待返回结果,而是执行其他任务,结果返回形式通常为。在需要多轮协作的场景中的典型用法,例如:分布式计算分片处理、游戏多玩家回合制操作等。使用Future的方法和之前不太一样,我们调用的异步方法也不一样。

2025-02-26 00:07:12 1676

原创 ubuntu20.04安装imwheel实现鼠标滚轮调速

Ubuntu 系统自带的设置中仅具备调节鼠标速度的功能,而无调节鼠标滚轮速度的功能。其默认的鼠标滚轮速度较为缓慢,在查看文档时影响尚可接受,但在快速浏览网页时,滚轮速度过慢会给用户带来不便,用户往往期望能够加快滚动速度。若要实现鼠标滚轮速度的调节,需安装 imwheel 软件。

2024-12-23 01:08:24 1081

原创 Android中perform和handle方法的区别——以handleLaunchActivity与performLaunchActivity为例

在Android系统中,和方法经常出现在关键流程中,分别承担不同的职责。这种命名约定反映了框架设计中的分层思想,帮助开发者区分任务的调度与实现。本文通过和这两个典型方法的源码分析,详细讲解它们的区别和设计意图。​​​方法:​​​方法:总结: 专注于实现任务,专注于管理任务的流程。和是中两个核心方法,用于启动Activity。以下从源码角度说明这两个方法的职责分工和调用关系。源码():职责:源码():职责:执行具体的Activity初始化逻辑,包括:返回初始化完成的Activity实例。通过源码分析可

2024-11-17 14:57:45 1015

原创 Java 中的 Socket 编程入门教程

Socket 是网络通信的端点,允许两个应用程序通过网络进行数据交换。

2024-11-17 02:18:08 637

原创 ActivityStartController 和 ActivityStarter 的工作原理

ActivityStarter 作为 Android 系统中负责启动 Activity 的关键组件,其在整个应用架构中有着独特的地位和作用。它依托于 Android 强大的框架体系,运用了诸如反射机制、任务栈管理等核心技术来实现 Activity 的精准启动。反射机制在 ActivityStarter 中被广泛应用于根据 Activity 的类名动态地创建 Activity 的实例。

2024-11-16 19:43:30 954

原创 Android 中的 Zygote 和 Copy-on-Write 机制详解

Zygote 是 Android 的母体进程,负责创建应用程序的进程。当 Android 启动时,系统会首先启动 Zygote 进程,并加载一些常用的系统库和资源。之后,当有新的应用启动请求时,Android 系统不会重新创建一个独立进程,而是通过fork一个 Zygote 的子进程来创建新的应用进程。这个新进程会继承 Zygote 的所有资源,从而极大地加快了启动速度。减少内存占用:Zygote 进程加载的资源(如系统库)可以共享给所有应用进程,显著减少内存占用。提升应用启动速度。

2024-11-15 02:10:20 1477

原创 避免误差!Android 中正确计算时间差的方式

在 Android 开发中,是计算时间差异的最佳选择,尤其是当计时过程可能跨越系统待机或涉及高精度的时间间隔计算时。它的单调递增特性和独立于系统时间调整的特点,确保了计时的连续性和稳定性。而更适合用来获取绝对的系统时间,例如记录日志时间、事件的发生时间等。选择合适的计时方法,不仅可以避免时间误差带来的影响,还能提升应用性能,确保计时功能的可靠性。希望本文能帮助你在实际开发中理解和应用这些计时方法,写出更高效、准确的 Android 应用!

2024-11-15 00:53:52 1424 1

原创 Android 中 View 与 SurfaceView 主动与被动更新的应用场景

在 Android 开发中,View和是两种常用的视图绘制组件。它们虽然都能用于绘制内容,但其更新机制不同,分别适用于不同的场景。理解它们的区别,有助于在开发中选择合适的组件。

2024-10-10 03:34:51 827

原创 Android一个APP里面最少有几个线程

这个线程是否也是每个进程所必须包含的线程。后来我查看了一下Daemons创建的过程,能确定的是Android启动一个APP最少包含ReferenceQueueDaemon线程、FinalizerDaemon线程、FinalizerWatchdogDaemon线程、HeapTaskDaemon线程,以及在ActivityThread中开启的主线程。的源码发现 startHeapTaskProcessor()、runHeapTasks()均是native方法。页面的工程,线程包含以下的这些。

2024-10-07 00:32:05 2116

原创 CPU 多级缓存

在多线程并发场景下,普通的累加很可能错的。

2024-10-06 23:10:19 912

原创 SynchronousQueue 的 常用场景及使用示例

​​是 Java并发框架中的一个特殊类型的阻塞队列,它的特点是队列内部容量为零,即不存储元素。每个put​操作必须等待一个对应的take​操作,反之亦然,因此它主要用作线程间的直接 hand-off(传递)工具,而不是作为一个缓冲区。以下是​的一些常用场景及一个简单的使用示例。

2024-10-05 03:34:10 697

原创 Java 类加载委托机制

Java 中的类加载机制是 JVM 的核心之一,它通过将字节码加载到内存中,使得程序能够正常运行。而在这个过程中,Java 引入了一种独特的“类加载委托机制”(也称双亲委派机制),以确保类加载的稳定性与安全性。本篇文章将详细阐述这一机制的原理、实际应用及其潜在的优缺点,帮助读者深入理解这一关键概念。

2024-10-03 05:39:01 1005

原创 Java操作数栈分析

操作数栈的核心作用是在方法执行过程中存储中间计算结果。每当需要进行数学运算、方法调用或者对象操作时,JVM 会通过操作数栈来传递这些数据并处理结果。

2024-09-19 01:12:18 593

原创 Android Room 数据库自动升级与迁移策略

Room 数据库的版本升级需要谨慎对待。每当数据库结构发生变化时,务必升级版本号并提供相应的迁移逻辑,以确保已有的数据不会丢失。同时,通过合理规划数据库结构和版本迁移策略,可以最大程度地避免版本升级带来的潜在问题。在实际项目中,随着业务逻辑的不断演进,数据库升级几乎是不可避免的。掌握 Room 的迁移机制,有助于我们更好地维护项目的稳定性。

2024-09-18 01:29:30 2071 1

原创 Android单元测试框架Robolectric使用教程

Shadow类需要通过注解与原始类关联在一起若原始类有有参构造方法,可以选择在Shadow类中定义类型的名为的方法,且方法参数与原始类的构造方法参数一致定义与原始类方法签名一致的方法,在里面重写实现,Shadow方法需用进行注解Robolectric支持原始类上的所有方法生成Shadow方法,包括或native。Shadow方法必须实现最原始类的定义方法,如, 如果你想shadow方法那你应该去shadowView的而不是ViewGroup的,否则当你对ViewGroup调用将不起作用。

2024-09-08 23:23:41 5591 2

原创 PowerMock 单元测试总结与常见坑解决方案

用于 mock 静态方法。: 抑制某个类的构造函数。: 禁止某个类的方法执行。: 禁止某个类的字段初始化。: 使用反射设置类的私有成员变量。: 禁止静态初始化块的执行。当遇到复杂的类结构,PowerMock 提供了丰富的工具来帮助我们绕过不必要的依赖并聚焦于类本身的测试逻辑。通过组合使用mockStaticsuppress以及等方法,可以有效解决静态方法、final 方法、私有方法等难以测试的场景。合理地使用和注解,能够帮助我们避免常见的类加载和初始化错误,从而编写更健壮的单元测试代码。

2024-09-07 03:53:00 1892

原创 PowerMock 注解和使用方法

和@RunWith注解是结合使用的,不要单独使用它们中的任何一个,否则不起作用。当使用 PowerMock 去 mock 静态、final 或者私有方法时,需要加上这两个注解。注意:在输入@RunWith注解时,IDE(如 Eclipse)可能会自动导入包,记得把它换成,否则会抛出异常。

2024-09-07 02:09:02 1039

原创 Android Studio Module 引入aar

例如,如果您在实际开发中,需要添加其他的依赖库,按照上述的格式在。部分进行相应的配置即可。目录位置有所变化,那么在。中的路径也需要相应地修改。

2024-07-30 01:15:29 884

原创 网络请求的读取和写入理解

写入时间:从开始发送请求数据到数据成功发送出去的时间。例如,填写表单、准备数据、发送到服务器。读取时间:从开始接收服务器响应数据到数据成功读取并处理完毕的时间。例如,接收数据包、解析数据、处理响应。写入时间就像寄信:你写信、封好信封并寄出。读取时间就像收信:你收到信、打开信封并阅读信件内容。在网络请求的过程中,客户端先进行写入操作(发送请求),然后进行读取操作(接收响应)。这个顺序确保客户端可以发送所需的数据给服务器,并在服务器处理完请求后接收到相应的响应数据。

2024-07-28 18:11:25 769

原创 Android源码目录结构概览

Android源码的目录结构是为了组织和模块化不同层次的系统组件而设计的。

2024-07-20 18:56:39 466

原创 android工程中gradle编译时的所有task,打印其依赖和输入输出

【代码】android工程中gradle编译时的所有task,打印其依赖和输入输出。

2024-07-18 01:28:53 486

原创 常见的测试策略

测试策略是制定和实施软件测试计划的一部分,旨在确保软件产品符合质量标准,并满足用户需求和业务目标。

2024-07-17 23:17:14 1309

原创 关于 LayoutInflater.inflate 的取值结论

时,返回的对象上则拥有根节点的布局参数。时,所返回的是不具备布局参数信息的根节点。

2024-07-15 04:01:57 283

原创 Windows文件无法固定到开始菜单

创建exe文件的快捷方式在exe快捷方式上右键 - 固定到开始屏幕任务管理器中找到windows资源管理器,右键,重新启动这时此文件会在开始屏幕找到。

2024-07-14 22:43:36 1106

原创 Python实现批量下载文件

从配置文件或命令行参数读取下载任务列表,使用库读取配置文件,使用argparse库处理命令行参数。argparse。

2024-07-10 03:26:35 1343

原创 Android Bitmap 和Drawable的区别

直接操作:Bitmap:允许直接操作图像的像素数据,适用于图像处理和操作。Drawable:无法直接操作像素数据,更适合于通用的图形绘制。灵活性:Bitmap:主要用于位图图像,较为简单直接。Drawable:抽象类,提供了更丰富的子类和功能,适用于更复杂的图形操作。内存管理:Bitmap:占用内存较多,需要手动管理生命周期(如调用recycle()方法)。Drawable:内存管理由系统负责,相对更加安全和方便。类型支持:Bitmap:仅支持位图图像。

2024-07-02 01:45:45 766

原创 Message的复用

不仅是Android开发中一个高效的消息创建策略,更是面向性能优化设计思想的典型体现。它通过简单而高效的对象池模式,最大限度地减少了对象创建的开销,展示了Android框架在细微处对性能极致追求的设计哲学。开发者应当充分利用此类API,以构建更加高效、响应迅速的Android应用。

2024-06-01 19:31:55 715 1

原创 Bash 脚本常用命令

示例:输出“Hello, World!中所有的“apple”替换为“orange”。Bash 脚本中也经常用到条件判断和循环结构。文件的第一列(默认以空格或制表符分隔)。文件的某个字段内容。示例:列出当前目录所有文件和文件夹。在 Bash 脚本中,你可以使用。示例:遍历当前目录下的所有文件。中搜索包含“error”的行。表示将第二列的值增加 5,然后。示例:查看当前目录路径。示例:切换到用户主目录。示例:检查文件是否存在。示例:从 1 数到 5。示例:创建一个新文件。

2024-04-18 01:55:43 1023

一款好用的在Windows上显示webp图片以及预览功能

最少要一个积分,没办法,都不能免费下载,无奈,不过真的好用

2018-09-26

Android studio 翻译插件

ECTranslation1.3是一款翻译的插件,下载此jar包,放在Android studio中通过plugins安装,安装过后重启studio,在选择plugins,选择ECTranslation更新,选择update,在keymap中,搜索Translate,就找到快捷键了,可以自行换快捷键,我是用`来作为快捷键。非常好用的一款翻译插件,可整句翻译

2018-01-03

plugins.zip

AndroidStudio4.2常用的插件

2021-08-04

plugins.zip

AndroidStudio4.2.2系统插件

2021-08-04

DownloadManager

Android自带的DownloadManager的使用,十分的好用方便。

2018-06-04

空空如也

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

TA关注的人

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