自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(3319)
  • 资源 (6)
  • 收藏
  • 关注

转载 Javassist API文档详解:动态字节码操作实战指南

Javassist是一款简化字节码编辑的Java开源库,提供源码级API、字节码指令和元数据操作三层架构。其核心功能包括类池机制、方法编辑(拦截/替换/异常处理)和字段动态生成,支持AOP实现、动态DTO生成等场景。使用时需注意性能优化(缓存策略)和热替换问题,相比ASM和ByteBuddy具有更低学习曲线但性能稍逊。典型应用包括动态代理和代码生成,调试时可借助字节码验证和调试模式。建议原型开发使用Javassist,生产环境复杂场景选用ASM或ByteBuddy。

2025-12-31 16:07:58 2

转载 apg8自定义插件实现ARouter 兄弟版(LRouter)

本文介绍了LRouter框架的开发背景与实现思路。针对Android Gradle Plugin 8.0弃用Transform、KAPT编译速度慢等问题,作者基于KSP和ASM开发了LRouter路由框架。相比ARouter,LRouter采用KSP处理注解提升编译速度,通过ASM直接插入初始化代码和拦截器,优化了参数注入方案,并改进了路由表生成方式。框架支持模块独立初始化,提供简单依赖注入功能,但仅适用于AGP7.4+和JDK11环境。文章详细对比了LRouter与ARouter在注解处理、参数注入等方面

2025-12-31 14:26:01 2

原创 agp8自定义插件,使用Javassist示例

agp8自定义插件,使用Javassist示例

2025-12-30 15:43:08 187

转载 AGP8.0 插件适配中 学到的一些知识点

本文总结了AGP 8.0+插件开发中的关键点:1) Gradle与gradle-api的区别,建议直接使用Gradle依赖;2) 任务输入输出的配置规则和常用注解;3) AGP 8.0后Artifacts API成为任务编排的核心方式;4) 处理manifest文件的新方法;5) 字节码修改的两种实现方式(ASM和JavaAssist)。特别指出Artifacts API目前尚不支持mergeResources任务,这是8.0+版本中的一个重要限制。文章提供了大量实用代码示例,对AGP插件开发者具有重要参考

2025-12-30 14:44:33 7

原创 手写agp8自定义插件,用ASM实现路由跳转

手写ASM自定义agp插件,实现路由跳转

2025-12-30 10:27:44 128

转载 Gradle筑基篇(五)-Gradle自定义插件实战

本文介绍了Gradle自定义插件的开发与使用。主要内容包括:1) Gradle与插件的区别,插件作为构建系统中的可复用任务模块;2) 插件的优势(逻辑复用、配置扩展)和三种形式(脚本、buildSrc、独立项目);3) 以独立项目形式实现一个版本信息上传插件的完整流程,包含模块创建、插件类实现、扩展配置、任务开发、生命周期集成、本地发布和应用;4) 重点演示了如何通过扩展机制实现插件配置,以及如何将自定义任务挂接到构建生命周期。文章提供了完整的代码示例,帮助开发者掌握Gradle插件开发的核心技术。

2025-12-30 10:15:29 2

原创 ASM插桩Cannot constrain type: INT for value: v10 by constraint: OBJECT错误解决

ASM插桩Cannot constrain type: INT for value: v10 by constraint: OBJECT错误解决

2025-12-29 10:39:29 209

转载 JAVA ASM总结篇-03

本文介绍了使用ASM框架进行Java字节码操作的方法。主要内容包括:1) MethodVisitor访问方法字节码的基本流程,包括visitCode和visitMaxs标记开始结束;2) 三种创建ClassWriter的方式及其区别;3) 常用API如visitFieldInsn、visitMethodInsn等指令访问方法;4) 通过示例代码演示如何动态生成getF和setF方法;5) 使用ClassAdapter和MethodVisitor实现方法hook;6) 处理条件跳转和异常抛出的字节码生成技巧。

2025-12-26 16:35:31 12

转载 JAVA ASM总结篇-02

本文详细解析了Java字节码指令的执行机制。通过分析Java方法区存储的字节码指令,阐述了JVM线程执行模型中的栈帧结构,包括局部变量表和操作数栈的运作原理。文章以具体代码示例演示了常见字节码指令(如ILOAD、ALOAD、PUTFIELD等)的执行过程,并深入比较了i++和++i在字节码层面的实现差异。通过构造方法调用、字段赋值、条件判断等典型场景,展示了字节码指令如何实现Java语言特性。最后通过复合表达式计算案例,完整呈现了字节码指令序列的执行流程,揭示了Java代码底层运行机制。

2025-12-26 16:29:20 10

转载 JAVA ASM总结篇-01

摘要:ASM是一个高效的字节码编辑库,相比动态代理具有更好的性能优势。它采用访问者模式遍历类结构的树形表示,通过ClassReader读取字节码,利用ClassVisitor及其子类(如MethodVisitor)修改目标类。文章详细解析了ASM的工作原理,包括责任链机制的应用、字节码修改的具体实现步骤(如添加方法调用),并提供了代码示例。核心在于理解ASM处理字节码的流程和信任链构造方式,通过重写相应访问方法实现精准修改。参考链接提供了ASM的官方文档和技术博客资源。

2025-12-26 16:20:07 13

转载 练习Sample跑起来 ASM插桩强化练习

本文介绍了通过ASM实现方法耗时统计和线程替换的编译插桩实践方法。首先推荐使用ASMBytecodeOutline插件辅助理解字节码转换,详细讲解了如何利用AdviceAdapter在方法入口和出口插入耗时统计代码,并强调需注意局部变量管理和栈平衡问题。接着演示了替换项目中所有new Thread为CustomThread的实现方案,指出需要处理new和INVOKESPECIAL指令配对等特殊情况。文章提供了具体代码示例和GitHub练习项目,建议通过实践掌握ASM插桩技术,最后抛出如何添加try-catc

2025-12-26 16:00:49 8

转载 Gradle8.0以上使用ASM插桩统计方法耗时

使用插桩的技术对使用了KtMethodTime注解的方法统计出运行时长

2025-12-26 15:53:44 10

转载 方法耗时监控插件:基于Gradle 8.0 & ASM字节码插桩的性能分析工具

本文介绍了MethodTimeMonitor,一个基于ASM字节码插桩的Android性能监控插件。该插件能在编译时自动为方法添加耗时统计代码,实现零侵入的性能监控。主要特性包括:零代码侵入、纳秒级精度计时、智能过滤系统类、线程安全统计、多维度数据分析和自动化报告。插件采用模块化架构,包含Gradle插件和运行时库两个核心组件,支持主线程检测、方法过滤和自动打印等功能。通过ConcurrentHashMap和原子类保证多线程安全,并建议在Debug版本中使用。项目已在GitHub开源,为开发者提供了一种高效

2025-12-25 15:27:21 20

转载 Kotlin 协程 Flow 取消的 N 种方法

Kotlin协程中Flow的取消操作至关重要,涉及资源管理、用户体验和性能优化。本文介绍了13种Flow取消方法:1)Job取消;2)Scope取消;3)withTimeout;4)withTimeoutOrNull;5)布尔标志手动取消;6)cancellable操作符;7)take/takeWhile;8)first();9)single();10)any()/all()/none();11)transformWhile;12)collectLatest;13)SharedFlow/StateFlow自

2025-12-17 11:34:12 33

转载 Kotlin 协程避坑指南:GlobalScope vs Application Scope 怎么选?

Kotlin协程中GlobalScope和ApplicationScope的选择至关重要。GlobalScope因其"全局性"存在四大缺陷:与UI生命周期脱节、资源浪费、缺乏结构化并发以及难以测试。相比之下,自定义ApplicationScope绑定应用生命周期,具有可控性、安全性和易维护性优势。最佳实践是:全局任务用ApplicationScope,UI相关任务用LifecycleScope/ViewModelScope,Repository层应由调用方注入Scope。核心原则是协程作

2025-12-17 11:28:28 43

转载 Gradle8.0中Transform的替代方案

本文介绍了基于Gradle 8.0的路由插件开发方案。针对Transform被移除的情况,文章提出了通过注解收集和ASM插桩实现路由功能的替代方案。主要内容包括:1)定义HuiRouterPath注解标记路由页面;2)创建HuiRouterApi管理路由表;3)开发HuiRouterTask任务扫描注解并收集路由信息;4)使用ASM在编译时将路由信息注入HuiRouterApi;5)通过插件机制实现自动化路由注册。该方案实现了页面跳转的路由管理功能,并给出了完整的实现流程和Demo示例。

2025-12-17 11:13:44 27

转载 基于Gradle8.0的插件开发

本文介绍了Gradle 8.0插件开发的主要变化与实现方法。首先对比了新老版本配置方式的差异,重点说明插件仓库和依赖仓库迁移到settings.gradle.kts文件,以及插件引入方式从classpath改为插件ID。其次详细讲解了使用java-gradle-plugin和Kotlin开发自定义插件的流程,包括创建模块、编写Plugin类、配置插件信息、发布到本地Maven仓库等步骤。最后针对Transform被废弃的情况,提出使用Instrumentation API和AsmClassVisitorFa

2025-12-17 11:07:14 20

转载 Compose主题切换——让你的APP也能一键换肤

本文介绍了在Jetpack Compose中实现主题切换功能的方法。首先阐述了Compose主题的基本结构和使用规范,强调应避免硬编码颜色值而使用MaterialTheme中的定义。然后详细讲解了通过状态管理实现动态主题切换的方案:定义多套主题颜色,使用MutableState存储当前主题ID,并通过DataStore持久化主题选择。文章还展示了主题切换页面的实现,使用LazyVerticalGrid布局展示多种主题选项,点击时更新状态触发UI刷新。最终实现了无需广播通知、完全基于状态驱动的主题切换功能,提

2025-12-08 13:23:20 31

转载 深入浅出 Compose 测量机制

本文深入探讨了Compose框架的测量流程,分析了其核心机制与实现原理。文章首先介绍了Compose的UI树结构,指出LayoutNode作为核心数据结构贯穿运行时机制。重点阐述了测量流程中的两个关键概念:限制传递和测量结果生成,解释了子节点必须在满足父节点限制条件下确定自身大小。文章详细分析了NodeCoordinator的作用,包括InnerNodeCoordinator和LayoutModifierNodeCoordinator的不同职责,以及它们如何协同完成测量过程。同时探讨了二次测量的存在性,指出

2025-12-03 15:18:03 38

转载 【Kotlin 协程】Flow 流组合 ( Flow#zip 组合多个流 | 新组合流的元素收集间隔与被组合流元素发射间隔的联系 )

摘要:本文介绍了Kotlin协程中Flow流的zip组合操作。通过Flow#zip函数可以将两个Flow流合并,使用transform函数处理每对值。当流元素发射间隔不同时,合并后的流发射间隔以慢的流为准。示例展示了数字流和字符串流的合并过程,以及不同发射间隔(100ms和1000ms)下合并流的输出结果,验证了合并流会等待较慢流的特性。

2025-11-21 17:24:15 59

转载 【Kotlin 协程】Flow 异步流 ③ ( 冷流 | 流被收集时运行 | 流的连续性 )

本文介绍了Kotlin协程中Flow异步流的两个重要特性:冷流机制和流的连续性。冷流是指flow构建器中的代码仅在调用collect函数收集元素时才会执行,并通过示例展示了日志打印时机。流的连续性则体现在元素按照固定顺序从上游到下游传递,可以使用filter、map等操作符处理元素。文章通过两个代码示例分别演示了冷流的执行时机和流的顺序处理过程,展示了Flow异步流的核心工作机制。

2025-11-21 17:22:00 58

转载 【Kotlin 协程】Flow 流展平 ( 连接模式 flatMapConcat | 合并模式 flatMapMerge | 最新展平模式 flatMapLatest )

本文介绍了Kotlin协程中Flow流的三种展平操作模式:flatMapConcat(连接模式)、flatMapMerge(合并模式)和flatMapLatest(最新展平模式)。flatMapConcat按顺序连接两个流的所有元素;flatMapMerge同时合并多个流;flatMapLatest只保留最新的数据流,会取消之前的流。每种模式都提供了代码示例和执行结果,展示了不同展平方式下元素发射的顺序和时间间隔。这些展平操作适用于需要处理多个Flow流交互的场景。

2025-11-21 17:20:01 67

转载 LiveData的map()和switchMap

在Android Developer官网上,对于map和switchMap的解释是这样的:对存储在 LiveData 对象中的值应用函数,并将结果解封和分派到下游。传递给 switchMap() 的函数必须返回 LiveData 对象。其实单纯的看上面两个官方文档反而还会觉得更加的莫名其妙。其实这两句话差异的核心在于 “解封” 和 “返回LiveData对象” 。我们先来举个栗子来说明下这两个方法的区别(例子来源于此文章):我们可以看到运行结果是这样的:结合代码运行结果以及上面文档中对map函数的定义

2025-11-20 11:27:43 27

转载 CompletableDeferred 使用和注意事项

CompletableDeferred需要手动调用complete()或completeExceptionally(),否则await()会永久挂起协程。它专为单次异步结果设计,不适合数据流场景,主要用于回调API、协程协调和外部事件响应。与async自动完成的Deferred不同,CompletableDeferred必须显式完成,否则会导致内存泄漏和程序卡死。最佳实践包括设置超时保护和确保完成路径,如示例中通过withTimeout和try-catch保证deferred最终会被完成。

2025-11-13 17:54:18 56

转载 Timber 日志工具学习

Android日志工具Timber使用指南:首先在build.gradle添加依赖implementation"com.jakewharton.timber:timber:4.5.1",然后在Application的onCreate中初始化,DEBUG模式下使用DebugTree,发布版用自定义的CrashReportingTree。使用时可添加标签Timber.tag("activityName"),通过Timber.e()等方法记录日志。该工具提供了简洁的API和

2025-11-12 14:40:38 58

转载 kover 覆盖率排除不需要统计的类的配置

原文链接:https://blog.csdn.net/weixin_40387773/article/details/137038402。版权声明:本文为CSDN博主「T形槽」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

2025-11-10 17:49:00 70

转载 探索Kover:一站式Kotlin代码测试覆盖率解决方案

Kover是由JetBrains官方支持的开源测试覆盖率工具,专为Kotlin开发者设计,支持JVM和Android平台。它提供灵活的配置选项,通过Gradle/Maven插件、CLI工具和JVMAgent实现覆盖率统计,并能处理混合Kotlin/Java代码。Kover适用于各类项目,从小型应用到多平台开发,可生成HTML/XML报告,设置覆盖率阈值,帮助团队提升代码质量。虽然会带来一定的性能开销,但其强大的功能和易用性使其成为Kotlin生态中测试覆盖率的理想解决方案。

2025-11-10 17:47:09 82

转载 Flow stateIn 和 shareIn的区别

Kotlin Flow中的stateIn和shareIn操作符指南 本文详细介绍了Kotlin Flow中stateIn和shareIn两个关键操作符的使用。stateIn适合管理持续状态(如用户登录状态),会保留最新值(.value);shareIn适合处理一次性事件(如Toast提示),可配置历史事件缓存(replay)。两者的核心区别在于:stateIn有当前值,新订阅者立即获取最新状态;shareIn无当前值,需通过collect接收数据,可配置replay缓冲策略。文章提供了实用选择口诀:&quo

2025-11-10 11:28:59 61

转载 Koin 注入框架 - Android 使用方法 及 问题记录

本文介绍了Koin依赖注入框架在Android开发中的应用。主要内容包括:1)Koin的配置和使用方法,包括gradle依赖配置、单例声明和Koin启动;2)Koin在Android中的优势,特别是Context注入的便捷性;3)常见问题解决方案,如Kotlin版本冲突、Java/Kotlin中不同的注入方式等。文章还提供了官方文档链接和代码示例,帮助开发者快速上手Koin框架。

2025-11-07 18:08:39 105

转载 paging 3 从网络和数据库加载页面

本文介绍了如何利用Paging库和RemoteMediator实现网络与本地数据库的协同分页加载机制。通过Room持久化库缓存网络数据,当本地数据耗尽时,RemoteMediator会自动从网络加载新数据并存入数据库。文章详细说明了实现步骤:创建Room实体和DAO、实现RemoteMediator的load()方法处理三种加载类型(刷新/追加/前置)、管理远程键以保持数据同步,以及处理竞态条件确保数据一致性。这种架构能够在网络不稳定时提供流畅的离线体验,同时保持数据更新。适用于需要支持无限滚动和离线访问的

2025-11-07 17:47:28 69

转载 Kotlin协程Flow使用

Kotlin协程Flow使用

2025-11-07 14:04:23 56

转载 理解android AIDL

本文介绍了Android AIDL(Android接口定义语言)的基本概念和使用方法。AIDL是Android中实现跨进程通信(IPC)的核心工具,基于Binder机制实现进程间服务调用。文章详细说明了AIDL接口的定义方式,包括服务端和客户端的实现步骤,以及从Android 12开始需要在build.gradle中配置aidl=true的设置要点。同时分析了AIDL生成的Java代码结构,解释了Binder类的attachInterface和queryLocalInterface关键方法的作用,阐述了本地

2025-11-06 13:14:22 60

转载 AIDL中使用setAction绑定Service

AIDL中使用setAction绑定Service时,需确保服务端正确配置<intent-filter>并设置android:exported="true",同时客户端需指定服务端包名。

2025-11-06 11:32:42 26

转载 一个例子让你学会使用Paging3

Jetpack Paging 3是Android列表分页加载的最新解决方案,基于Kotlin协程重构,支持Flow、RxJava和LiveData。本文通过请求reqres.in API的实例,详细介绍了Paging3的使用流程:1)添加依赖库;2)定义API服务;3)创建数据模型;4)实现PagingSource处理分页逻辑;5)在ViewModel中配置Pager;6)在Activity中绑定RecyclerView和Adapter;7)使用PagingDataAdapter显示数据。此外还介绍了加载状

2025-11-05 18:10:51 48

转载 Verison Catalogs 管理,统一依赖管理

本文介绍了Gradle中的Version Catalogs功能,它用于统一管理项目依赖版本。主要特点包括:依赖对所有模块可见、支持类型安全访问器、可组合依赖包(bundles)、版本号与依赖名分离等。文章详细说明了两种声明方式:在settings.gradle中直接编写,以及更推荐的TOML文件方式(libs.versions.toml)。TOML文件包含versions、libraries、bundles和plugins四个主要部分,并提供了命名规范和使用示例。从Gradle 7.4.1开始,Versio

2025-11-04 19:03:54 36

转载 packageManager.setComponentEnabledSetting()和setApplicationEnabledSetting()方法介绍

摘要:本文介绍了Android中PackageManager的两个关键方法:setComponentEnabledSetting()和setApplicationEnabledSetting()。前者用于动态启用/禁用四大组件,通过改变COMPONENT_ENABLED_STATE参数实现状态切换,并可查询组件当前状态,典型应用如动态更换APP图标。后者用于禁用整个应用程序,但仅限当前应用且需要相应权限,提供了多种禁用状态选项。文中给出了Kotlin实现代码示例,并说明了相关参数含义及使用注意事项。

2025-10-31 10:24:35 77

转载 Jetpack Compose UI预览

文章摘要:本文详细介绍了Jetpack Compose中的UI预览功能(@Preview),包括基础配置、快速部署、互动模式等实用技巧。重点讲解了@Preview的各种属性配置,如name、group、widthDp、locale等参数的使用方法,以及Multipreview自定义注解和@PreviewParameter带参数预览的实现。文章还提供了常见问题解决方案和最佳实践建议,帮助开发者高效利用Android Studio的预览功能进行UI开发。

2025-10-30 16:40:20 81

转载 Jetpack Compose 的可组合项预览详解(@Preview)

本文详细介绍了Jetpack Compose中@Preview注解的使用方法,通过@Preview可以在Android Studio中直接预览UI组件而无需部署到设备。文章讲解了基本预览功能、多重预览注解、参数设置(如尺寸、背景、区域等),以及如何通过@PreviewParameter提供示例数据。同时指出了预览函数的参数限制,并提供了错误处理建议。这些功能能显著提高Compose开发效率,帮助开发者快速验证UI效果。

2025-10-30 16:29:44 109

转载 Compose中的预览@Preview与@PreviewParameter的使用

本文介绍了Jetpack Compose中@Preview和@PreviewParameter注解的使用方法。@Preview用于预览Composable函数,支持多种参数配置如尺寸、语言、背景等。当预览函数包含非默认参数时,需使用@PreviewParameter注解,通过实现PreviewParameterProvider提供预览数据。文章展示了单参数和多参数的实现方式,包括自定义数据类的封装。这些功能能帮助开发者在编写Composable组件时获得即时预览效果,提高开发效率。

2025-10-30 16:15:39 95

转载 Compose Preview

Compose Preview是Jetpack Compose提供的功能,允许开发者在Android Studio中实时预览UI组件布局和效果,无需运行完整项目即可快速验证设计。‌性能限制‌:预览功能依赖Compose工具库,部分旧版本设备或配置可能存在兼容性问题。‌多设备适配‌:支持通过widthDp、heightDp等参数模拟不同设备的显示效果。‌图标混淆‌:早期版本中“刷新”与“构建”图标功能区分不清,后续优化为统一操作逻辑。‌实时交互‌:开发者可快速调整代码并实时看到UI变化,提升开发效率。

2025-10-30 16:04:01 47

jdk-6u45-linux-x64.part1

如标题示,此为linux下64位java 1.6jdk,经验可以安装运行:我的linux为64 位ubuntu: uname -a Linux kevin-virtual-machine 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

2013-07-31

ormlite-4.48

Android中用ormlite实现持sqlite持久化 共含三个jar包 ormlite-android-4.48.jar ormlite-core-4.48.jar ormlite-jdbc-4.48.jar

2014-11-29

二维码扫描ZxingDemo

一个二维码扫描例子

2016-04-06

jdk-6u45-linux-x64.part2

如标题示,此为linux下64位java 1.6jdk,经验可以安装运行:我的linux为64 位ubuntu: uname -a Linux kevin-virtual-machine 3.5.0-17-generic #28-Ubuntu SMP Tue Oct 9 19:31:23 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux

2013-07-31

空空如也

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

TA关注的人

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