
程序设计
文章平均质量分 86
锐湃
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
资深Android开发者必备资源:保持技术敏锐度,提升职场竞争力
本文介绍了"技术信息金字塔"模型,帮助Android开发者高效获取技术资讯。金字塔分为三层:底层关注开发者社区趋势(如AndroidWeekly、Reddit社区);中层追踪Google官方动态(开发者通讯、示例代码库);高层把握移动行业趋势(设备新闻、应用商店榜单)。该模型强调质量而非数量,帮助开发者在技术领导岗位上保持竞争力,同时平衡业务需求与技术创新。转载 2025-08-05 18:11:23 · 13 阅读 · 0 评论 -
Kotlin开闭原则真香警告
开闭原则(OCP)是SOLID原则之一,主张软件实体应对扩展开放、对修改关闭。文章通过形状绘制和OTP验证系统的案例对比,展示了违反OCP的代码(需频繁修改)与符合OCP的设计(通过接口扩展)的差异。Kotlin中可利用接口、扩展函数和密封类优雅实现OCP。该原则适用于需频繁扩展的支付、日志等系统,但不推荐用于稳定需求或原型阶段。OCP与其他SOLID原则相辅相成,共同构建可维护的软件架构。转载 2025-08-04 18:02:40 · 12 阅读 · 0 评论 -
当Kotlin的object不再是单例时:那些你可能不知道的陷阱
摘要:Kotlin的object关键字虽然能保证单例模式,但序列化过程可能破坏这一特性。Gson通过反射创建新实例,导致单例失效;而kotlinx.serialization能正确识别单例对象并保持引用。Moshi则直接拒绝序列化object对象。使用单例对象时需注意序列化框架的选择,推荐优先使用kotlinx.serialization以避免单例被破坏。(150字)转载 2025-07-31 11:54:59 · 19 阅读 · 0 评论 -
阿里编码规约初体验
阿里编码规约是阿里巴巴开发的Java代码检测插件,支持在编码和代码Review时扫描潜在问题。文章详细介绍了在Android Studio中安装该插件的步骤,包括插件搜索、安装及重启验证。使用方面,插件将问题分为Blocker、Critical和Major三类,分别对应严重、一般和规范性问题,并提供了示例和修改建议。文中演示了如何扫描当前文件或整个module,以及通过快捷键快速定位和修复问题。虽然扫描速度较快且提示清晰,但作者认为其准确性相比FindBugs仍有提升空间。转载 2025-07-14 18:14:12 · 61 阅读 · 0 评论 -
android 最好用的工具
这篇文章详细介绍了Android开发中常用的工具类库com.blankj:utilcode的功能列表。该库包含100+实用工具类,覆盖了Activity管理、屏幕适配、App安装、缓存处理、加密解密、文件操作、网络状态、权限管理、UI控件等开发场景。主要功能模块包括:ActivityUtils - Activity生命周期管理AppUtils - App安装卸载等操作CacheUtils - 内存/磁盘缓存FileUtils - 文件读写操作NetworkUtils - 网络状态检测转载 2025-06-13 23:07:06 · 82 阅读 · 0 评论 -
Java 利用正则表达式完美解析全国省市区地址展开
本文介绍了使用Java正则表达式解析全国省市区地址的方法。首先定义了一个匹配中文地址格式的正则表达式,包含"省"、"市"、"区"、"街道"等可选层级。然后通过Java的Pattern和Matcher类进行匹配,提取各层级信息并去除后缀。该方法灵活处理不同格式的地址,对缺失层级自动填充"未知"。通过调整正则表达式可以适应更精确或宽松的地址格式要求。转载 2025-06-02 19:07:21 · 222 阅读 · 0 评论 -
正则表达式中国行政区域地址解析
本文介绍了通过正则表达式解析中国地址信息的方法。作者首先编写了地址解析工具类,使用正则表达式匹配省、市、区县、镇等层级信息。但在处理直辖市时遇到问题,因为直辖市没有省级前缀。为此,作者采用枚举类ProviceEnum进行判断,对四大直辖市地址进行字符串拼接预处理,确保正则表达式能正确解析。该方法虽存在局限性,但有效解决了特定场景下的地址解析需求。转载 2025-06-02 18:47:59 · 135 阅读 · 0 评论 -
Kotlin单例模式的几种写法
在Kotlin中实现单例模式非常简便,主要依赖于object关键字、伴生对象和by lazy委托。首先,使用object关键字可以直接定义一个单例类,Kotlin会自动确保其唯一性并在首次访问时初始化。其次,通过伴生对象(companion object)可以在已有类中实现单例,结合私有构造函数和静态方法getInstance()来管理实例。最后,by lazy委托提供了延迟初始化的能力,确保单例在首次访问时创建,并且是线程安全的。这三种方式分别适用于不同的场景,开发者可以根据需求选择最合适的实现方法。转载 2025-05-21 21:21:09 · 146 阅读 · 0 评论 -
ASM字节码插桩之Transform的替代方案
最近在学习asm字节码插桩相关的知识,发现在高版本的gradle上以前的Transform已经废弃,于是研究了一下新版本字节码插桩的实现,本文将简单地介绍下新版本gradle上字节码插桩的实现。GitHub - SmilingTeresa/AsmDemo: ASM插桩Demo。转载 2024-12-26 00:53:20 · 305 阅读 · 0 评论 -
Android plugin如何兼容App插件和library插件
最近由于工作需要,开发了一个jacoco与记录用例执行顺序的插件,整体功能开发没有问题,但是在应用到项目的时候,就出错了。被测试的项目是个多模块的项目,原则上需要对app和libraries都添加插件,不然library中的代码没有插入jacoco的桩,也没有记录用例执行顺序的桩,无法达到目的。通过这两个地方的兼容处理,就可以保证插件在app插件和library插件中同时使用,经过Demo测试没有问题。2,对apply函数中添加注册transform的兼容。转载 2024-12-26 00:14:27 · 84 阅读 · 0 评论 -
其实 Gradle Transform 就是个纸老虎 —— Gradle 系列(4)
而 Task 的依赖关系是通过 TransformTask 的输入输出关系隐式确定的,TransformManager 通过 TransformStream 链接各个 TransformTask 的输入输出,进而控制 Transform 的依赖关系顺序。是的,就是卷,而且这次直接是降维打击。Task 增量模式与 Transform 增量模式的区别在于,Task 增量执行时会跳过整个 Task 的动作列表,而 Transform 增量执行依然会执行 TransformTask,但输入内容会增加变更内容信息。转载 2024-12-26 00:13:31 · 335 阅读 · 0 评论 -
在Javassist学习时遇到的javassist.NotFoundException问题的解决办法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。原文链接:https://blog.csdn.net/weixin_43900321/article/details/105189867。与原来程序相比,在新程序的中间添加了insertClassPath()这一方法,猜测是jdk版本的问题。在加入该行代码后运行无误。转载 2024-12-26 00:07:21 · 207 阅读 · 0 评论 -
【Groovy】Groovy 扩展方法 ( 静态扩展方法配置 | 扩展方法示例 | 编译静态扩展类 | 打包静态扩展类字节码到 jar 包中 | 测试使用 Thread 静态扩展类 )
在 工程根目录\src\main\groovy\ 目录下创建 manifest\META-INF\services 目录 ,命令 , 将 classes 中的字节码文件按照 manifest/ 规则 , 打包到 thread.jar 文件中;在 Terminal 面临中 , 使用命令行执行该 Groovy 脚本 ,命令 , 进入到 src/main/groovy 目录中 ,参数 , 在该方法中 , 执行传入的闭包参数;代码语言:javascript。代码语言:javascript。转载 2024-12-25 00:55:16 · 101 阅读 · 0 评论 -
Android Gradle 自定义Plugin实现
Id 就是插件唯一标识,后续在其他项目中引用的时候,也是引用这个 id。这里有很多不需要的文件目录,包括用来测试和 Gradle 的一些相关内容,都可以删除(当然你也可以不处理),因为当我们把这个项目引入到一个 Android 项目中时,Android 项目提供了 Gradle 相关文件。如图所示,ExamplePlugin 目录下 gradle 相关的文件,在 Android 的根目录中都存在。实际上 Gradle 后续就是执行这个 Task ,来执行代码块中的代码的。转载 2024-12-25 00:52:18 · 495 阅读 · 0 评论 -
android 代码读取annotationProcessorOptions;gradle注解传参
通过JavaCompiler的getProcessorOptions()方法,我们可以在Android代码中读取annotationProcessorOptions的值。在Android代码中,我们可以通过JavaCompiler提供的getProcessorOptions()方法来读取annotationProcessorOptions。annotationProcessorOptions是在build.gradle文件中配置的参数,用于指定注解处理器的选项。classNames:用于指定要处理的类名。转载 2024-12-25 00:42:48 · 105 阅读 · 0 评论 -
Android Gradle(九)自定义Transform,使用Javassist工具插入和删除代码
在安卓中,难免会碰到需要动态插入代码,或者删除代码。这时候就需要用到自定义Transform任务,来对Class文件进行扫描和获取。可以插入的代码场景有哪些?例如:打印方法的执行时间等。可以删除的代码场景有哪些?例如:把代码中Log.e日志打印的代码去掉等先看下代码前后效果,原始代码如下:经过修改后(通过反编译apk得到源码):接下来,让我们看看如何对以上两个场景进行代码的插入和删除。转载 2024-12-24 01:44:17 · 171 阅读 · 0 评论 -
Android编译时技术(一)Javassist 基础使用
所谓的Javassist,其实就是如何生成一个Class文件或者修改一个Class文件的工具,包括对Class里的成员变量或者方法进行增加或修改。相比于ASM,Javassist最大的好处就是方便,简单,不用去关心字节码操作。转载 2024-12-24 01:28:39 · 194 阅读 · 0 评论 -
ButterKnife源码完全解析
从上图看到,提供了许多自定义注解,我们以@BindViewSOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃;CLASS:注解被保留到class文件,但JVM加载class文件时候被遗弃,这是默认的生命周期RUNTIME:注解不仅被保存到class文件中,JVM加载class文件之后,仍然存在;如果需要在运行时去动态获取注解信息,只能用 RUNTIME 注解;如果要在编译时进行一些预处理操作,就用 CLASS注解;转载 2024-12-24 01:19:38 · 63 阅读 · 0 评论 -
android注解之APT和javapoet
前面我们已经讲过注解的基本知识,对于注解还不太了解的,可以去看一下之前的文章,android 注解详解_袁震的博客-CSDN博客。之前我们在讲注解的时候,提到过APT和JavaPoet,那么什么是APT和JavaPoet呢?下面我们来详细讲解一下。1,APT是什么?转载 2024-12-24 01:08:48 · 87 阅读 · 0 评论 -
javassisit提升反射效率
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京技术学院的数学和计算机科学系的 Shigeru Chiba 所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态AOP框架。Javassist(JAVA编程ASSISTant)使Java字节码操作变得简单。它是一个用Java编辑字节码的类库;它使Java程序能够在运行时定义新类,并在JVM加载时修改类文件。转载 2024-12-24 00:59:20 · 143 阅读 · 0 评论 -
ASM字节码插桩点击防抖以及统计方法耗时
Transform API 是 AGP1.5 就引入的特性,Android在构建过程中回将Class转成Dex,此API就是提供了在此过程中插入自定逻辑字节码的功能,我们可以使用此API做一些功能,比如无痕埋点,耗时统计等功能。不过此API在AGP7.0已经被废弃,8.0会被移除,取而代之的是Transform Action。转载 2024-12-19 00:20:45 · 140 阅读 · 0 评论 -
什么是可重入锁(递归锁)
通过调用lock()方法获取锁,再调用unlock()方法释放锁,可以实现多次获取和释放同一个锁的操作。在存款(deposit)和取款(withdraw)方法中,首先使用lock.lock()获取锁,然后执行相应的操作,最后使用lock.unlock()释放锁。当一个线程已经获得了锁,但在持有锁的代码块中又调用了另一个需要同样锁的方法时,如果使用非可重入锁,线程会因为无法再次获得同一个锁而陷入死锁状态。当线程再次请求获取锁时,会检查当前线程是否已经持有锁,如果是,则增加持有锁的计数器;转载 2024-12-12 11:31:44 · 287 阅读 · 0 评论 -
多线程篇(基本认识 - 公平锁 & 非公平锁、独占锁 & 共享锁、可重入锁、自旋锁)(持续更新迭代)
根据线程获取锁的抢占机制,锁可以分为公平锁和非公平锁,公平锁表示线程获取锁的顺序是按照线程请求锁的时间早晚来决定的,也就是最早请求锁的线程将最早获取到锁。而非公平锁则在运行时闯入,也就是先来不一定先得。ReentrantLock 提供了公平和非公平锁的实现。公平锁:ReentrantLock pairLock = new ReentrantLock(true)非公平锁:ReentrantLock pairLock = new ReentrantLock(false)转载 2024-12-12 11:01:18 · 361 阅读 · 0 评论 -
探索 APKTool:Android 应用的反编译与重打包工具
本文详细介绍了 APKTool 的使用方法和技术原理。APKTool 主要应用于逆向工程、调试和修改已编译的 APK 文件。文章首先解释了 APK 文件的反编译过程,包括 APK 的解压、DEX 文件的 smali 转换和资源文件的解码。接着,讨论了 APK 的重新打包过程,包括资源的重新编译、smali 文件的 DEX 转换、APK 的打包和签名。转载 2024-12-03 14:50:19 · 644 阅读 · 0 评论 -
探索Android虚拟化框架(AVF):为移动设备打造坚不可摧的盾牌
AVF的安全特性为移动设备提供了强大的保护。通过其分层安全方法、机密性、完整性和可用性的维护,以及Hypervisor和客户机OS的安全特性,AVF确保了移动设备在面对日益复杂的威胁时,能够保持安全和可靠。随着技术的不断进步,我们期待AVF能够继续为移动设备的安全性提供更多的创新和改进。转载 2024-11-27 21:22:39 · 512 阅读 · 0 评论 -
The thrown exception is too generic. Prefer throwing project specific exceptions to handle error
也就是说我们自定义异常需要更细化了,那么让我们看看都有哪些异常IllegalArgumentException 非法参数异常IllegalStateException 状态异常,Java环境或Java应用程序处于不适合所请求操作的状态IndexOutOfBoundsException 数组索引越界异常转载 2024-11-22 13:46:52 · 120 阅读 · 0 评论 -
一个 Kotlin 开发者,对于纯函数的思考
纯函数是数学上的一种理想状态,即相同的输入永远会得到相同的输出,而且没有任何可观察的副作用在数学上函数的定义为。转载 2024-11-15 10:16:57 · 50 阅读 · 0 评论 -
Android 第5种启动模式:singleInstancePerTask
允许一个 Activity 作为任务栈的根 Activity 来运行,并且它只会在这个任务栈中有一个实例。不过,与singleTask不同的是,可以在不同的任务栈中创建多个实例。如果启动该 Activity 时设置了或标志,那么每次启动时都会创建新的任务栈。在 Android SDK 中,通过此定义可以看出,可以避免在同一个任务栈中创建多个实例,但允许在不同的任务栈中有多个实例。而singleTask则会限制该 Activity 只存在于一个任务栈中。转载 2024-10-22 15:02:13 · 351 阅读 · 0 评论 -
android开发中文网站 android developer
android开发中文网站 android developer原创 2024-10-22 15:00:45 · 448 阅读 · 0 评论 -
Android 15 正式发布到 AOSP ,来了解下新特性和适配需求
目前看来 Android 15 上需要适配的难度不高,毕竟 16K Page Size 应该是明年的事情,而且按照目前情况猜测,更多也支持明年 Google Play 上会开始要求,国内估计还会继续延迟,真正需要在国内启用 16K Page Size 也许会更晚。所以,勇敢的少年,是时候开始吃螃蟹了。Android 15 正式发布到 AOSP ,来了解下新特性和适配需求作者:恋猫de小郭链接:https://juejin.cn/post/7410645914585317403来源:稀土掘金。转载 2024-10-16 15:14:58 · 330 阅读 · 0 评论 -
LiveData的ktx是真的香,flow转换LiveData
主要还是认知问题,Android 官网从一开始就在推ktx,现在都已经2.+ 版本了,但是呢,因为之前没有从0开始写过一个Kotlin的APP,就陷入了一个JAVA 思维,在JAVA 中我们知道要做到像协程这么处理不是不能,只是过于复杂,一般水平的人根本驾驭不住,恰巧,我根本不敢想。也就导致了一个问题,ktx 这个界面路过了无数次,今天终于看到了TA。转载 2024-10-10 17:21:50 · 173 阅读 · 0 评论 -
Flow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略
• Flow深入浅出系列之在ViewModels中使用Kotlin Flows• Flow深入浅出系列之更聪明的分享 Kotlin Flows• Flow深入浅出系列之使用Kotlin Flow自动刷新Android数据的策略讨论在Android应用程序中使用Kotlin Flow高效加载数据的用法。它是第二部分“更智能的共享Kotlin Flows”的直接延续,因为它重用了相同的概念,涵盖了另一个用例:用户界面的自动定期刷新。转载 2024-10-10 16:29:29 · 461 阅读 · 0 评论 -
Flow深入浅出系列之在ViewModels中使用Kotlin Flows
查理·卓别林(Charlie Chaplin)背对他的妻子,标签为LiveData,看着一个标签为Flow的迷人女人Flow是比较新潮的类似于异步计算流的值流类,属于Kotlin的Coroutines库,于2019年推出。它的概念与RxJava Observables类似,但基于协程,并且具有更简单的API。首先,只有冷流可用:无状态的流,在每次观察者在协程范围内开始收集值时根据需要创建。每个观察者都有自己的值序列,它们不共享。转载 2024-10-10 16:27:54 · 533 阅读 · 0 评论 -
Jetpack PDF库:解锁Android应用中的PDF功能
在 Android 开发中,加载 PDF 文件是一个比较常见的需求,但就是这么一个比较常见的功能,原生并没有提供一个比较好的方案,而隔壁 IOS 中实现却是很方便的。。。下面是当前在 Android 应用浏览 PDF 的几种方式:在之前大部分选择的还是第二种和第三种方案来实现 PDF 文件的预览,但现在,大家又多了一种额外的选择!转载 2024-10-08 11:21:14 · 506 阅读 · 0 评论 -
主线程锁监控原理和实现
到这里我们基本把主线程锁等待监控的方案思路和关键技术点过了一遍,通过上述方法,我们就能实现我们自己的主线程锁监控。Android主线程锁监控原理和实现。转载 2024-09-30 10:49:15 · 175 阅读 · 0 评论 -
一个Android App最少有几个线程?实现多线程的方式有哪些
多线程在Android开发中非常重要,通过适当的多线程管理,可以显著提升应用的性能和用户体验。应避免在主线程上执行任何耗时操作,以防止应用响应不及时。选择合适的多线程管理方法和工具(如线程池、Kotlin协程等)是保持代码简洁、高效的关键。一个Android App最少有几个线程?实现多线程的方式有哪些?转载 2024-09-30 10:43:37 · 307 阅读 · 0 评论 -
Android设计模式实战 ,实现一个弹窗引擎封装dialog
最近项目使用的一个第三方库很多线上 Bug 所以考虑换一个第三方库了,结果去除依赖之后导致基本每个页面都要修改,项目全部爆红,人都麻了,悔不该当初图方便没有使用引擎类啊。第三方库提供基本的各种功能,引擎类封装一层给自己的项目预定特定的效果,上层应用只需要调用引擎即可实现效果,不需要关心底层的实现,不需要引用第三方的依赖和类库。当我们第三方库升级或替换的时候,只需要修改引擎类即可。下面我以弹窗库的封装为例,封装一个弹窗引擎库,下来就一起来看看吧。转载 2024-09-24 10:14:55 · 386 阅读 · 0 评论 -
Android Context动态升降级与Context权限范围限定
Android 的 Context 大家肯定是不陌生了,它是安卓开发中不可或缺的概念,它允许我们访问系统资源,管理应用程序的生命周期,并与系统交互。实际开发中我们在使用 Toast,使用 Dialog,启动 Activity 与 Service ,加载资源,操作数据库,获取 App 相关的文件路径,创建 View 等操作时,都会涉及到一个 Context 引用。转载 2024-09-23 10:05:58 · 352 阅读 · 0 评论 -
以一种简单的方式来实现弹幕效果
弹幕的无限滚动:确保弹幕能够连续地滚动,而不是在到达末尾时重新开始。弹幕的多行显示:能够在屏幕上同时显示多行弹幕,并且每行弹幕独立滚动。滚动速度的控制:能够控制弹幕的滚动速度,以实现流畅的视觉效果。本文将通过一个示例项目来展示如何实现上述功能。gif图有点卡,可以自行运行一下看效果。通过本文的介绍,我们实现了一种简单的弹幕效果。使用和,不仅实现了多行弹幕的效果,还可以通过控制scrollBy方法的速度,实现弹幕的平滑滚动。这种方式非常适合在需要显示大量动态文本信息的场景中使用,例如商品评论等。转载 2024-09-20 13:46:57 · 347 阅读 · 0 评论 -
现代应用架构最佳实践
尽管架构模式可以有多种实现方式,但核心目标始终是实现高内聚和低耦合,从而提高代码的可读性、健壮性和可扩展性。在实际应用中,根据项目的具体需求和约束,灵活应用这些架构理念,才能构建出适合自身项目的最佳架构。作者:麦客奥德彪链接:https://juejin.cn/post/7377220397403865142来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。转载 2024-09-14 13:33:14 · 365 阅读 · 0 评论