自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(146)
  • 收藏
  • 关注

原创 C语言文件加解密

本文介绍了C语言中文件操作的基本方法,包括文件读写、复制、获取文件大小以及加密解密操作。主要内容有: 文件读取:使用fopen()打开文件,fgets()逐行读取内容,最后用fclose()关闭文件 文件写入:以"w"模式打开文件自动创建新文件,使用fputs()写入内容 文件复制:通过二进制模式(rb/wb)读取和写入文件,使用fread()和fwrite()实现高效复制 获取文件大小:利用fseek()将指针移动到文件末尾,再用ftell()获取字节数 文件加密解密:通过异或运算对每

2026-02-13 10:53:55 26

原创 结构体与结构体指针数组

主题 关键点结构体 数据聚合、栈/堆分配、指针操作、数组应用动态内存 malloc/free 配对使用,避免内存泄漏typedef 消除编译器差异,实现跨平台代码统一枚举 提升代码可读性,替代魔法数字

2026-02-13 09:31:31 89

原创 指针实战运用进阶之字符串操作

本文介绍了C语言中字符串操作的几种常见方法:1)字符串的两种定义方式(字符数组和字符指针)及其修改特性差异;2)通过指针遍历获取字符串长度的手写API实现;3)字符串转换(atoi/atof)和比较(strcmp/strcmpi)函数的使用;4)字符串查找(strstr)、拼接(strcat)等操作;5)大小写转换的自定义函数实现;6)字符串截取的两种实现方案(栈区和堆区内存分配)。文中通过代码示例展示了指针在字符串操作中的核心作用,同时强调了内存管理的注意事项。

2026-02-12 16:02:53 88

原创 静态开辟内存与动态开辟内存

本文探讨了C语言中静态与动态内存开辟的差异及应用场景。静态开辟使用栈区内存,大小固定且有限(约2MB),适合确定大小的需求;动态开辟则通过malloc在堆区分配内存,容量更大(约40MB),适用于需要灵活调整内存的情况。文章详细介绍了动态内存管理的核心操作:malloc分配内存、realloc调整大小及free释放内存,并强调避免野指针和悬空指针的重要性。最后通过用户输入数组大小的实例,展示了动态内存分配的典型应用场景,体现了其灵活扩展的优势。

2026-02-12 15:33:10 64

原创 函数指针与指针运算

本文摘要:通过C语言代码示例展示了指针的核心概念与应用。包括多级指针的解引用(**num_ppp获取值)、数组与指针的关系(数组名即首元素地址)、指针遍历数组的3种方式(arr[i]、(arr+i)、*arr+i的区别)、指针类型的作用(决定偏移量和取值方式),以及函数指针实现回调机制。重点解析了指针运算的底层逻辑,如指针加减时的字节偏移量计算,并通过sizeof验证了不同指针类型在内存中的存储特性。最后通过opreate函数演示了如何将函数指针作为参数传递实现回调功能。

2026-02-12 11:14:39 362

原创 基于LLM + GitLab Webhook实现AI代码自动化审查

摘要 本文介绍了一个基于GitLab Webhook和大语言模型(LLM)的自动化AI代码审查系统。该系统在用户提交或更新Merge Request时自动触发,通过AI分析代码变更并生成专业诊断报告与修改建议,结果自动同步到GitLab评论区辅助人工评审。系统支持文件后缀过滤、多项目Prompt配置、MR体量限制、分支跳过规则等功能,兼容各类支持OpenAI标准接口的LLM服务。配置包含GitLab连接信息、LLM接口参数、审查策略及分支匹配规则等,通过Flask服务实现核心流程,为代码审查提供智能化辅助。

2026-02-11 16:19:19 832

原创 C语言指针入门与基本数据类型

本文摘要: 文章主要介绍了Android NDK开发工具包的基本概念与组成,包括其定义、作用(开发C/C++动态库、交叉编译等)和特点(高效、安全、易移植)。随后详细讲解了C语言的基础知识:代码结构、基本数据类型及其占位符、指针概念(地址操作、修改值)以及函数参数传递(通过指针修改实参)。重点内容包括指针的定义与使用(*p操作)、函数间通过指针交换变量值、以及指针与内存地址的关系。文章通过多个代码示例演示了指针在C语言中的核心应用场景。

2026-02-04 11:12:54 223

原创 Android 16KB 腾讯Mars XLog适配

本文详细介绍了在Windows环境下编译和适配Android 16k XLog的全过程。主要内容包括:Python3、NDK、CMake和Cygwin的安装配置;XLog的编译步骤及注意事项;针对NDK r19+版本的特殊处理,如修改build_android.py中的ANDROID_STL_FILE路径和使用llvm-strip工具。文章还提供了编译后的so文件路径说明,并指出执行strip操作可显著减小文件体积。整个流程涵盖了从环境搭建到最终编译成功的完整指南,为开发者提供了Android 16k XL

2026-02-02 18:20:08 681

原创 一篇搞定Kotlin协程(进阶篇)

本文主要介绍了Kotlin协程的取消机制。通过cancel()方法可以取消协程执行,协程会抛出CancellationException异常并进入取消状态。文章详细讲解了Job的生命周期状态转换,以及如何通过isActive检查协程状态来正确终止循环任务。同时对比了join()和await()在取消时的不同行为,join()会等待协程完成,而await()会立即抛出异常。最后介绍了使用try-catch-finally块来释放协程取消时需要清理的资源。这些机制可以帮助开发者更好地管理协程生命周期。

2026-01-30 18:05:42 642

原创 一篇搞懂Kotlin协程(基础篇)

Android协程是一种简化异步编程的轻量级解决方案,通过挂起机制实现非阻塞操作。它支持结构化并发,内置取消功能,并集成Jetpack组件。协程可以通过runBlocking(阻塞线程)、launch(不阻塞)和async(返回结果)三种方式构建。launch适合无需返回值的场景,async则用于并发任务和结果获取。协程能有效避免主线程卡顿,减少内存泄漏,是处理耗时任务(如网络请求)的理想选择。依赖库为kotlinx-coroutines-core和kotlinx-coroutines-android。

2026-01-23 11:00:03 593

原创 重学设计模式之拦截器和责任链

摘要:本文探讨了拦截器模式在软件设计中的应用,重点分析了其与责任链模式的结合实现。拦截器通过在执行流程中插入处理点来检查、修改或替换数据和行为,而无需修改原有代码。责任链模式将多个拦截器组织成处理流水线,每个拦截器可决定是否传递请求或直接响应。文章提供了Kotlin实现示例,展示了日志、校验和认证拦截器的协同工作,并解释了其在支付场景中的实际应用,如免密支付和预订单创建流程的灵活处理。这种设计实现了职责分离、可插拔扩展和短路机制等优势。

2026-01-17 10:46:49 695

原创 一篇搞懂Kotlin协程(原理篇)

Kotlin协程通过挂起函数(suspend)和CPS转换,将异步回调代码简化为同步写法。协程编译器自动将suspend函数转换为带Continuation回调的异步代码,实现线程切换。这种机制避免了回调地狱,使异步代码更简洁易读。核心原理是:挂起函数在执行IO操作时挂起协程,完成后恢复执行后续代码,整个过程通过Continuation对象控制流程。协程通过编译期转换,在保持同步代码风格的同时实现了异步执行。

2026-01-05 14:54:51 958

原创 一篇搞定注解在Android的应用

Java注解(Annotation)是JDK5.0引入的元数据机制,用于将元数据与程序元素关联。注解分为标准注解(如@Override、@Deprecated)和元注解(如@Target、@Retention)。@Target指定注解应用范围,@Retention定义注解保留策略(SOURCE、CLASS、RUNTIME)。SOURCE级别注解仅用于源码检查,如@IntDef可用于限定参数取值,提供编译时语法检查而不增加运行时开销。注解通过@interface或annotation class声明,是Jav

2025-12-27 20:07:24 911

原创 Git “cherry-pick“ 命令详解和应用场景

Git cherry-pick 是一个选择性复制提交到当前分支的命令,适用于同步特定功能或修复而非整个分支合并。其基本语法支持挑选单个、多个或连续范围的提交,并提供-n(不自动提交)、-x(记录来源)等实用选项。使用时可能遇到冲突,需手动解决后继续或终止操作。高级技巧包括处理合并提交和批量压缩提交,但需谨慎避免对公共分支频繁操作导致历史混乱。最佳实践是优先考虑merge/rebase,使用-x追踪来源,并避免重复cherry-pick同一提交。

2025-12-23 14:04:07 863

原创 Android数据库Room之基本使用

摘要:Room是Android JetPack组件中的ORM数据库框架,由Google官方维护。它包含Entity(数据表)、Dao(数据访问对象)和Database(数据库管理)三个核心组件,支持SQL语句高亮和编译检查。使用Room需添加依赖并配置编译器选项,通过注解定义表结构(@Entity)和CRUD操作(@Insert/@Query等)。Database类需继承RoomDatabase并采用单例模式管理。Room自动生成实现类,支持Kotlin协程/RxJava,提供类型安全的数据库操作方案。(1

2025-12-20 10:30:23 786 1

原创 Android广告投放过程分析

本文系统介绍了移动应用深度链接技术及其在Android平台的应用实现。首先从运营角度区分了深度链接和延迟深度链接的概念,前者直接引导用户至应用内特定页面,后者先引导未安装用户下载应用。然后详细解析了Android平台三种链接类型:深度链接(支持自定义URI)、网页链接(HTTP/HTTPS)和Android App Links(需autoVerify验证)。文章还阐述了Appsflyer的OneLink技术实现,包括直接深度链接和延迟深度链接的工作流程,以及广告投放中的归因机制。最后简要介绍了两种常见广告投

2025-11-26 18:11:50 1003

原创 SYN关键字辨析,各种锁优缺点分析和面试题讲解

本文详细解析了Java中synchronized的实现原理和锁的优化机制。synchronized基于Monitor对象实现同步,通过对象头的MarkWord存储锁信息,包含偏向锁、轻量级锁和重量级锁三种状态。文章分析了自旋锁的优缺点及适用场景,比较了不同锁状态的性能特点,并指出锁只能升级不能降级。最后通过面试题形式讨论了synchronized修饰方法与可见性问题,以及悲观锁/乐观锁的区别。关键点包括:锁状态转换、自旋锁优化、偏向锁适用场景等,为理解Java同步机制提供了全面指导。

2025-11-01 17:49:42 974

原创 AQS底层原理、运用和volatile详解

摘要 本文介绍了阻塞队列和线程池的概念及其应用。阻塞队列是一种支持线程安全的队列,常用于生产者-消费者模式,平衡生产与消费速度。常见的阻塞队列包括ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue等,各有不同的实现方式和适用场景。线程池(ThreadPoolExecutor)通过复用线程降低资源消耗,提高响应速度和管理性,适用于高并发任务处理。文章详细分析了线程池的参数配置、核心类关系及不同阻塞队列的特性,如DelayQueue适用于延迟

2025-10-25 20:47:36 650

原创 并发基础知识补全和CAS原理

本文介绍了Java中线程的启动方式和死锁问题。启动线程主要有两种方式:继承Thread类或实现Runnable接口。文章重点讲解了死锁的四个必要条件:互斥条件、占用并等待、不可抢占和循环等待,并通过示例代码演示了死锁的产生过程。为避免死锁,提出了三种解决方案:按固定顺序加锁、使用超时机制(tryLock)和随机退避策略。这些方法通过破坏死锁的必要条件来预防死锁发生,确保多线程程序的安全运行。

2025-10-19 16:39:43 850

原创 多线程性能优化基础

本文介绍了Java多线程编程中的锁机制和生产者消费者模型的实现。在锁机制部分,分别讲解了类锁、对象锁和显示锁的应用场景及实现方式,包括synchronized关键字和ReentrantLock的使用规范。生产者消费者模型部分通过代码示例展示了共享资源的安全问题,指出由于线程间资源不共享导致的数据不一致问题。文章强调了多线程编程中同步机制的重要性,为处理并发问题提供了基础解决方案。

2025-10-17 21:28:03 707

原创 线程与进程理论知识入门

本文主要探讨了CPU核心数、线程数与多线程编程的关系。首先解释了CPU多核心和多线程技术的基本概念,指出核心数与线程数通常为1:1关系,但超线程技术可实现1:2。接着介绍了CPU时间片轮转机制,分析了时间片设置对系统性能的影响。在进程和线程部分,强调进程是资源分配的最小单位,线程是CPU调度的最小单位。文章还区分了并发(交替执行)和并行(同时执行)的概念,并阐述了高并发编程的优势:提高CPU利用率、加快响应速度、实现模块化编程,同时提醒注意线程安全、死锁和资源耗尽等问题。最后指出Java程序天生就是多线程的

2025-10-08 21:31:45 736

原创 Android性能优化之Apk瘦身

【摘要】随着业务迭代,APK体积逐渐增大,影响应用性能。本文介绍了APK组成结构及多种优化方法:1)使用Android Size Analyzer插件分析体积;2)通过shrinkResources移除未使用资源,配合Lint工具物理删除;3)配置resConfigs保留指定语言资源;4)动态库优化,按CPU架构分包;5)使用矢量图替代位图,通过tint属性复用资源。这些方法可有效减少APK大小,提升加载速度和运行效率。(150字)

2025-09-27 18:53:34 671

原创 Android模拟简单的网络请求框架Retrofit实现

本文介绍了静态代理和动态代理两种设计模式。静态代理通过中介类间接访问目标对象,实现业务逻辑与控制分离,但每个接口需要单独编写代理类,导致代码冗余。动态代理在运行时动态生成代理类,可同时代理多个接口,避免重复代码。静态代理适用于简单场景,而动态代理更灵活,适合接口频繁变化的系统。两种代理都能在不修改目标对象的前提下增强功能,但动态代理的扩展性更优。

2025-09-06 22:41:50 1060

原创 一篇搞懂HTTP的概念、原理、工作机制、数据格式和REST

摘要:本文介绍了HTTP协议的基本概念和工作方式。HTTP作为超文本传输协议,与HTML共同用于网络请求和传输。文章详细解析了URL格式、HTTP报文结构、请求方法(GET、POST、PUT、DELETE等)、状态码、Header类型及其作用,包括Content-Type、Content-Length等常见首部。此外还涉及REST设计风格和HTTP缓存机制,最后通过选择题测试读者对HTTP基础知识的掌握程度。全文为理解HTTP协议及其应用提供了系统性的介绍。

2025-08-30 17:10:49 828 1

原创 Java高级语言特性,注解与反射

本文介绍了Java注解的基本概念和使用方法。主要内容包括:1)注解的声明方式,使用@interface关键字;2)元注解@Target和@Retention的使用,分别限制注解作用范围和存储方式;3)注解类型元素的定义,支持默认值设置;4)注解的三种应用场景:源码级别(SOURCE)用于IDE语法检查,编译时(CLASS)处理,运行时(RUNTIME)保留。特别说明了@IntDef注解如何替代枚举实现参数限制,以及注解处理器(APT)在编译时处理注解的机制。通过示例代码展示了注解的具体应用方式。

2025-08-23 21:50:43 1055

原创 Android Crash监控

Android Crash监控机制分析 本文主要分析了Android系统中Java层和Native层的Crash监控机制。对于Java层Crash,主要通过Thread.UncaughtExceptionHandler接口捕获未处理异常,可自定义实现该接口将崩溃信息保存到本地。系统默认使用KillApplicationHandler处理未捕获异常,最终杀死应用进程。Native层Crash则通常由系统signal信号触发,机制与Java层不同。文章还展示了Java层Crash监控的具体实现代码,包括异常信息

2025-07-19 12:03:46 963

原创 Android使用拦截器结合协程实现无感知的Token预刷新方案

本文提出了一种Token预刷新方案,在Token接近过期时提前刷新以避免用户登录中断。方案采用拦截器实现,通过双重锁检查确保线程安全,并在刷新失败时引导用户重新登录。关键点包括:提前5分钟计算刷新时间、使用独立Retrofit实例防止循环调用、通过协程机制实现异步刷新。该方案能有效提升用户体验,避免传统Token过期导致的请求失败问题。实现代码以Kotlin编写,适用于Android平台。

2025-06-15 10:45:11 819

原创 Kotlin中的::操作符详解

摘要:Kotlin的::操作符支持成员引用,简化高阶函数编程。主要用法包括:引用类成员(如String::length)、构造函数(如::Person)、顶层函数、扩展函数,以及获取KClass对象。实际应用场景包括作为高阶函数参数(如users.map(User::name))和绑定实例方法。编译时会被优化为函数接口对象,如String::length转为fun(s:String):Int = s.length。这种机制使函数传递更简洁高效。

2025-05-29 19:56:24 850

原创 Kotlin委托机制使用方式和原理

本文介绍了Kotlin中的类委托和属性委托机制。类委托通过by关键字实现类似Java代理模式的效果,委托类持有真实类对象并转发方法调用。属性委托则是对属性set/get方法的委托,被委托类需要提供setValue/getValue方法。文中通过代码示例展示了两种委托的使用方式,包括接口定义、实现类、委托类以及主函数调用,并提供了反编译后的Java代码展示底层实现原理。最后通过输出结果验证了委托机制的正确性,说明Kotlin通过by关键字简化了代理模式的实现。

2025-05-29 17:14:30 1677 1

原创 一篇搞定Android方法耗时监控插件开发

摘要:本文介绍了如何通过自定义Gradle插件结合ASM框架来统计方法耗时,并在耗时超过阈值时通过Log日志定位耗时方法。ASM是一个高效的字节码操作框架,支持通过ClassVisitor、ClassReader和ClassWriter等工具读取、修改和生成类字节码。插件通过Transform Action在编译时对指定包名的类进行插桩,过滤不需要插桩的类。具体实现中,ClassVisitor用于访问类结构,MethodVisitor用于插入耗时统计代码,最终通过Log输出耗时方法和线程信息。该插件可以帮助

2025-05-10 20:37:32 1174 1

原创 一篇学会Android Gradle插件开发

自定义插件的时候经常会有这种自定义配置的需求,通过自定义的配置可以让我们的插件提供更丰富的能力。这些配置就是通过扩展插件来的。增加定义了一个SubExtension类,然后在YiRanPluginExtension实例化的时候加到ExtensionContainer中。类嵌套的话,不能写成内部类,不然编译识别不过。

2025-04-26 18:43:53 1844 1

原创 Android Gradle多渠道打包

当渠道配置越来越多的时候,app目录下的build.gradle文件就会显得有些不易阅读和维护,这时候可以将配置模块化,把渠道相关配置抽成一个channel.gradle文件,然后在app/build.gradle文件中apply依赖进来,这样可以更好的管理和维护渠道项目的渠道配置,app/build.gradle文件也会少一些。除了资源文件和代码文件之外,我们的依赖可能会根据渠道有所不同,比如在做推送功能的时候,在打华为渠道包的时候,只依赖华为的推送,而不依赖oppo的推送,也就是根据渠道来配置依赖项。

2025-04-20 14:01:24 1240 1

原创 Android性能优化之内存分析

内存抖动就是不停的在新生代创建对象,创建对象很多,会有空间分配担保,新生代空间比较小占1/3,老年代2/3,当新生代空间不够时,老年代会腾挪一部分空间给新生代,导致老年代空间下降,这个时候假设创建了大对象,从新生代经过了from到to,年龄足够到了老年代,这个时候空间不够,如果没有连续的空间,就会导致OOM。GC过程中会暂停用户线程包括UI线程,Stop the World,频繁的创建,释放对象,GC频繁出现,就会导致App整体卡顿。引用计数法:一个对象身上没有引用,不可用,这个对象就会被回收。

2025-04-06 16:47:35 905

原创 Android Compose入门和基本使用

Jetpack Compose是用于构建原生Android界面的新工具包,是一种声明式UI框架。状态是可以变化的任何值。在Compose函数中,如果数据状态没有发生改变,则UI永远不会自行改变。在Compose中,每个组件都是一个被@Composable修饰的函数,其状态就是函数的参数。因为Composeable是个函数,只能通过传参,当参数不变,则函数的输出就不会变,唯一的参数决定唯一输出。反言之,如果要让界面发生变化,则需要改变界面的状态,然后 Composable 响应这种变化。

2025-04-06 16:46:39 5162

原创 UML中类和类之间关系和各种图

百度百科截图:首先了解一下软件开发生命周期:做需求(项目经理,产品跟客户去谈,比如要求这个页面怎么样,点击按钮出现什么效果)–>形成文档(需要什么描述清楚)–>系统设计(设计一下整个功能有那些类,需要准备的数据库表)–>开发人员编写代码–>测试–>运维…这里重点在于系统设计:就好比在实际生活中要盖一栋大楼,一栋大厦,这个时候是不是需要一个设计的图纸,因为只有设计好之后,才知道设计的合不合理。如果设计得不好,就会导致楼塌,豆腐渣工程,如果设计的好,就可以给建筑工人按照图纸进行设计。

2024-09-28 17:29:25 2049 1

原创 Android中的冷启动,热启动和温启动

在App启动方式中分为三种:冷启动(cold start)、热启动(hot start)、温启动(warm start)

2024-09-16 22:04:30 4540 5

原创 Android自定义View实现不同朝向字体变色

实现效果:1.一个文字两种颜色2.实现不同朝向3.结合ViewPager思路:TextView可行?系统提供的只能够显示一种颜色,需要自定义Viewextends TextView:onMeasure()不需要实现 textColor颜色,textSize字体大小会少很多逻辑。1.一个文字两种颜色 画2.能够从左到右,从右到左3.整合到ViewPager,监听滚动事件自定义属性,不变化的颜色 originColor 变化的颜色 changeColorx要在这个位置。

2024-09-01 22:51:15 619

原创 Android invalidate方法源码分析

mLayoutRequested: 默认为 false,意味着只会执行 performDraw(), 不调用performMeasure()和performLayout()Invalidate()方法是Android中View的方法,通过用来调用onDraw方法,进行UI上的刷新。依次执行 performMeasure(),performLayout(),performDraw()最终绘制到 调用了invalidate()的View的 onDraw()方法;不断的绘制子孩子,再绘制子孩子的子孩子,

2024-08-31 17:05:50 630

原创 Android 为什么子线程不能更新UI

开了线程,更新UI 一般会调用setText(),setImageView 回调到这里面来 ViewRootImpl checkThread(),checkThread()用来检测线程。而如果在子线程中更新UI,调用checkThread的时候Thread.currentThread()就是子线程,然后和mThread 不相等,就会抛出异常。其中的mThread在构造函数中赋值mThread = Thread.currentThread();

2024-08-25 18:10:06 519

原创 Android自定义简单仿QQ运动步数进展圆环

useCenter 是否使用中心:true,连接矩形中心及弧;false不显示,(是否显示半径连线,true表示显示圆弧与圆心的半径连线,false表示不显示)(Paint.Style.FILL时)连接弧的起点终点。2.可以变化的小圆弧(红色) color borderWidth。1.固定蓝色的大圆弧 color borderWidth。顺时针,起点从135度开始扫了270度的距离到终点。3.中间的步数文字 color textSize。左边距离=控件宽度的一半减去文字宽度的一半。

2024-08-25 17:25:51 378

智能时控开关的资料压缩包

基于51单片机的智能时控开关,包含代码和相关文件。

2024-03-18

程序设计竞赛专题挑战教程配套代码

《程序设计竞赛专题挑战教程》人民邮电出版社 蓝桥杯大赛组委会 组编 罗勇军 杨培林 编著的配套教程书里的代码

2024-03-13

空空如也

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

TA关注的人

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