- 博客(42)
- 收藏
- 关注
原创 Kotlin协程实现原理
Kotlin协程实现原理摘要 Kotlin协程是一种轻量级的线程管理方案,通过挂起函数(suspend)实现非阻塞式异步编程。其核心机制包括: 挂起函数通过CPS转换被编译为带有Continuation回调的代码 状态机机制管理协程执行流程,通过label标记实现挂起/恢复 Continuation保存协程上下文,实现执行状态保存与恢复 线程切换由调度器(Dispatcher)管理,底层基于线程池 协程相比线程优势在于: 用户态调度,避免内核切换开销 更轻量级的上下文切换 以同步方式编写异步代码 整个流程通
2026-08-19 15:13:35
154
原创 WorkManager实现原理
WorkManager是Android Jetpack提供的后台任务管理组件,能确保任务在应用退出后仍被执行。它支持一次性任务(OneTimeWorkRequest)和周期性任务(PeriodicWorkRequest),并允许设置约束条件(如网络连接、充电状态等)。任务通过Worker类实现,Kotlin协程版本(CoroutineWorker)提供非阻塞的异步支持。WorkManager底层使用Room持久化任务,通过JobScheduler/AlarmManager调度执行。初始化时通过Content
2026-08-18 14:51:11
231
原创 Synchronized原理
synchronized原理摘要 synchronized是Java中的内置锁机制,通过对象头中的Mark Word实现锁状态管理。其使用方式包括修饰代码块、实例方法和静态方法,分别对指定对象、当前实例和类对象加锁。 Java对象头由Mark Word、Klass Pointer和数组长度组成。Mark Word在不同锁状态下存储不同内容:无锁状态存储哈希码,偏向锁记录线程ID,轻量级锁指向栈中锁记录,重量级锁指向Monitor对象。 重量级锁关联的Monitor对象(ObjectMonitor)维护了等待
2026-08-14 11:37:45
191
原创 【OkHttp实现原理】
OkHttp实现原理摘要(150字): OkHttp通过RealCall对象处理请求,分为同步和异步两种方式。同步请求直接调用execute()进入拦截器链;异步请求通过Dispatcher调度,将AsyncCall加入队列后由线程池执行。Dispatcher管理着ready和running两个异步队列,默认支持最大64并发请求和每主机5并发。核心流程均会经过五层拦截器链处理:重试/重定向、桥接、缓存、连接建立和服务器通信。OkHttpClient通过newCall()创建RealCall实例,其内部调用D
2026-08-12 14:37:32
352
原创 2026 Google 开发者大会 8月12日总结
2026 Google开发者大会核心速览 8月12日上海世博中心开幕的谷歌开发者大会以"智体新境"为主题,聚焦AI智能体技术革新。核心亮点包括: 智能体开发成为主流,AI从对话工具升级为可执行多步任务的工作主体; Gemini生态爆发:应用月活突破10亿(63%用户使用语音交互),日均生成1.5亿张图片; 技术突破:Gemma 4开放模型下载量达3亿,端侧AI(Gemini Nano+Google AI Edge)成为移动开发新方向; 全栈布局:云侧(Gemini API/Vertex AI)+端侧+开放模
2026-08-12 11:18:59
662
原创 Java基础常见题
Java基础常见题摘要: 面向对象特性:Java通过封装、继承、多态和抽象实现面向对象编程。封装隐藏内部细节,继承实现代码复用,多态允许不同响应(方法重载和重写),抽象简化复杂系统。SOLID设计原则(单一职责、开闭原则等)是构建健壮系统的关键。 ==与equals区别:==比较基本类型值或引用地址;equals默认比较引用,但可重写为值比较。重写equals必须同时重写hashCode以保证哈希集合正确性,避免重复元素和性能问题。 内部类访问限制:非静态内部类持有外部类引用,可访问所有成员;静态内部类仅能
2026-08-07 17:27:25
168
原创 【IntentSeivice实现原理】
IntentService 是 Android 中用于处理异步请求的 Service 子类,其核心实现基于 HandlerThread。摘要如下: 工作原理: 主线程通过 startService() 触发生命周期方法,最终将任务通过 Handler 发送到工作线程 工作线程由 HandlerThread 创建,在 onHandleIntent() 中执行异步任务 每个任务完成后自动调用 stopSelf() 停止服务 使用方式: 继承 IntentService 并重写 onHandleIntent()
2026-08-07 14:13:16
280
原创 InputManagerService解析
IMS服务架构与事件处理流程解析 IMS(InputManagerService)是Android系统中处理用户输入操作的核心服务,其架构和工作流程可概括为: 架构组成: 基于Binder实现,在SystemServer启动时初始化 包含EventHub(监听设备事件)、InputReader(读取原始事件)、InputDispatcher(事件分发)三大核心组件 事件处理流程: 用户输入→Linux内核→EventHub通过inotify/epoll监听 InputReader线程循环读取事件并初步封装
2026-08-07 11:35:04
381
原创 KMP全栈开发:从Android到AI Agent的技术演进与实践
什么是AI Agent?与传统API调用的区别Agent的核心组件:规划、工具使用、记忆、学习LangChain、LlamaIndex等框架的KMP适配性分析Kotlin Multiplatform 通过共享核心业务逻辑、数据模型和网络层,为构建从 Android 到服务端再到 Web 的全栈应用提供了统一的技术基础。当与 AI Agent 能力结合时,KMP 使得智能体的核心推理逻辑、工具调用接口和记忆管理可以一次编写,多端部署,极大地提升了开发效率并保证了跨平台体验的一致性。
2026-08-05 17:13:42
395
原创 Handler实现原理
Android Handler机制摘要 Handler机制采用生产者-消费者模型,由Handler(生产者)、MessageQueue(缓冲队列)和Looper(消费者)组成。消息按优先级分为异步消息(最高)、普通消息(默认)和延迟消息(按时间排序)。MessageQueue通过时间戳排序管理消息,Looper循环取出消息处理。关键流程包括: Handler发送消息并设置target指向自身 MessageQueue按when时间戳排序插入消息 Looper通过next()获取消息,优先处理异步消息 消息分
2026-08-05 16:21:27
493
原创 【HandlerThread实现原理】
HandlerThread 是一个自带 Looper 的线程实现,继承自 Thread 类。其核心原理是在 run() 方法中构建消息循环系统(Looper.prepare()和 Looper.loop()),并提供了 getLooper() 方法供外部获取该 Looper。使用时需先 start() 启动线程,再通过 getLooper() 创建 Handler 进行跨线程通信。优势在于线程复用和任务队列管理,但串行执行机制可能导致任务延迟。典型应用场景包括后台任务处理,需注意在适当时机调用 quit()
2026-08-04 17:22:35
342
原创 APK的打包流程
APK打包流程主要分为编译和打包两个阶段,包含7个关键步骤。APK文件由resources.arsc、AndroidManifest.xml、META-INF校验目录、classes.dex和lib库等组成。打包过程中会使用aapt(资源处理)、aidl(接口转换)、javac(Java编译)、dex(字节码转换)、apkbuilder(APK生成)、jarsigner(签名)和zipalign(对齐优化)等工具。完整流程包括:资源编译生成R.java、AIDL文件转换、Java源码编译、class转dex
2026-08-04 11:47:43
277
原创 Android基础知识汇总
摘要: 本文总结了Android Activity的关键知识点: 生命周期:横竖屏切换会触发完整销毁重建流程,可通过configChanges避免。 启动模式: standard(默认):每次新建实例。 singleTop:栈顶复用,避免重复创建。 singleTask:栈内单例,清除上方Activity,可配合taskAffinity指定任务栈。 singleInstance:独占新任务栈。 启动流程:涉及Launcher、AMS、Binder跨进程通信及ActivityThread创建。 场景分析:通过
2026-07-31 11:39:53
182
原创 Amlogic烧录hdcp密钥后,需要重启才能生效
摘要:该代码片段展示了通过系统控制接口刷新HDMI接收设备密钥的方法。使用SystemControlManager执行三条命令:首先发送"tee_hdcp"指令,然后分别向/sys/class/hdmirx/hdmirx0/debug写入"load22key"和"load14key"命令,用于加载不同类型的HDCP密钥(2.2和1.4版本)。这种操作通常用于HDMI内容保护密钥的更新或初始化。
2026-05-08 10:54:11
35
原创 AndroidStudio打包jar配置
本文提供了一个在Android Studio中打包JAR文件的Gradle配置方案。配置首先声明了项目为Android库模块,设置了基本的编译参数和依赖项。核心部分是通过afterEvaluate块定义了一个createJar任务,该任务会从编译输出目录收集.class文件,排除BuildConfig和R类文件,最终在build/libs目录生成JAR包。配置还包含了必要的依赖声明,如LZ4压缩库和JDK反糖化支持。该方案适用于Gradle 7.x及以上版本,能自动生成可用的JAR文件。
2026-04-30 15:15:03
30
原创 安卓AOSP,OTA升级的错误码
摘要:本文记录了安卓AOSP OTA升级过程中遇到的错误码51(时间戳错误),即当前系统版本比OTA服务器上的更新包编译时间更晚。同时整理了update_engine模块中所有错误码的定义和含义,包括升级成功(kSuccess=0)、各类下载校验错误(kDownloadError)、安装错误(kInstallError)等56种错误类型,涵盖了OTA升级全流程可能出现的各类问题,为开发者排查升级失败原因提供了完整参考。
2026-02-09 15:22:18
1011
原创 String字符串因为语言导致的问题
摘要:在处理多语言字符串时,使用默认的String方法可能导致特殊字符转换问题。例如土耳其语中字母"i"会被转为"ı"。解决方案是指定Locale,如使用name.toLowerCase(Locale.ENGLISH)确保字符转换一致,避免功能异常。该问题在涉及国际化开发时需特别注意。
2026-02-05 16:01:27
50
原创 OkHttp使用指南
本文介绍了OkHttp的基本使用方法,包括同步/异步GET请求、POST请求发送JSON数据、文件上传等功能。详细说明了如何添加依赖、配置拦截器、设置超时和启用缓存。OkHttp提供了简洁高效的API,通过合理配置可以优化网络请求性能,适用于Android和Java应用的HTTP通信需求。文章包含代码示例,帮助开发者快速上手使用这一强大的HTTP客户端库。
2026-01-29 18:17:01
252
原创 Java线程池工作原理浅析
本文简要介绍了Java线程池的工作原理和使用方法。主要内容包括:1) 使用线程池的必要性,避免频繁创建销毁线程带来的资源消耗;2) 通过Executors类创建四种常见线程池(FixedThreadPool、SingleThreadExecutor、CachedThreadPool、ScheduledThreadPool);3) 线程池的核心参数配置及其执行流程;4) 阻塞队列在生产者-消费者模型中的作用及不同类型队列的特点。文章通过代码示例和流程图帮助理解线程池的任务处理机制,适合Java开发者学习线程池
2026-01-29 13:51:40
673
转载 Activity 四大启动模式
前言Activity 具有4种启动模式,分别是:standard、singleTop、singleTask和singleInstance。我们应该根据需求来为每个 Activity 指定合适的启动模式,可以在 AndroidManifest 清单文件中通过给 标签指定 android:launchMode 属性来选择启动模式。理解这些启动模式对构建用户体验良好的应用来说至关重要。standard 是 Activity 默认的启动模式。Android 使用返回栈(Task)来管理 Activity 实
2026-01-12 10:18:11
159
原创 安卓实现二维码信息生成(可用微信扫码)
本文介绍了在安卓平台上实现二维码信息生成的技术方案。通过ZXing库实现核心功能,详细说明了开发环境配置、代码实现步骤和实际应用案例。关键实现包括:创建二维码工具类、处理编码内容、设置二维码参数、生成位图以及自定义样式。示例展示了如何生成包含设备品牌、型号、软件版本等信息的动态二维码,并提供了完整的代码片段和界面布局方案。该方案可扩展为调用远程接口获取数据,适用于多种信息展示场景。
2026-01-05 10:34:52
286
原创 Android14配置自定义输入法
Android14配置自定义输入法方法摘要 本文介绍了在Android14系统中配置自定义输入法的两个关键步骤:首先需要预制输入法应用APK,然后在系统框架中进行相应修改。具体操作包括在defaults.xml中设置默认输入法路径,以及在DatabaseHelper.java中添加相关配置代码。配置成功后可通过命令验证,确保default_input_method和enabled_input_methods属性正确显示目标输入法路径。该方法适用于各类输入法配置,如系统拼音输入法或第三方输入法(如讯飞输入法)
2025-12-10 11:58:45
314
原创 【HashMap原理分析】
HashMap是基于哈希表实现的Map接口类,具有快速访问特性但不保证顺序。其核心属性包括默认初始容量16、负载因子0.75、树化阈值8等。采用数组+链表+红黑树的存储结构,当链表长度超过8且容量大于64时转为红黑树。通过hash(key)计算索引位置,使用高位异或运算减少哈希冲突。HashMap非线程安全,允许多线程写入时可能导致数据不一致。其工作原理是通过哈希函数定位桶位置,采用链表或红黑树处理冲突,动态扩容机制确保性能。
2025-09-17 14:24:35
826
原创 Android View显示原理分析,跟踪源码
文章摘要:本文分析了Android View的显示原理,重点剖析了setContentView的流程。Activity启动时通过PhoneWindow创建DecorView,并调用installDecor方法初始化布局。该方法会生成DecorView和ContentParent,然后将XML布局文件inflate到ContentParent中。整个过程涉及Window、DecorView和ContentParent的创建与关联,最终实现UI内容的显示。
2025-09-09 17:41:38
388
原创 安卓在Service中使用ComposeView
本文介绍了在Android Service中使用ComposeView的实现方案。针对传统Activity方案受系统按键影响的问题,提出了通过WindowManager添加ComposeView到Service窗口的替代方案。核心挑战在于ComposeView需要Lifecycle支持,文中通过自定义ServiceLifecycleOwner类解决了ViewTreeLifecycleOwner缺失问题,并详细说明了如何手动管理生命周期事件(onCreate/onStart/onDestroy)来确保Comp
2025-08-25 15:37:39
498
原创 安卓的Handler机制
Android Handler机制解析 Handler机制是Android实现线程间通信的核心框架,主要由四个关键组件构成: Handler:消息发送和处理的桥梁,负责发送消息(sendMessage)和处理消息(handleMessage) Message:消息数据结构,包含what、obj、arg1/arg2等字段 MessageQueue:消息队列,负责消息的存储和管理 Looper:消息循环,从队列中取出消息并分发 每个线程只能拥有一个Looper,通过ThreadLocal保证线程隔离。使用Han
2025-08-16 16:24:09
1168
原创 Android Binder机制
是现代操作系统的核心安全机制,它确保了不同进程不能直接访问彼此的内存空间。Android系统中的Binder机制是进程间通信(IPC)的核心架构,它高效地连接了应用程序与系统服务,以及不同应用之间的交互。Binder作为Android系统架构的核心枢纽,通过创新的内存映射和C/S架构设计,在保证安全性的同时提供了高效的进程间通信能力。随着Android系统的演进,Binder机制仍在不断优化,如Android 8.0引入的Binder线程池优化、Android 10中的Binder调度改进等。
2025-08-16 14:26:07
808
原创 Android网络框架Retrofit全面解析
Retrofit作为Android平台主流的网络请求框架,通过注解系统和模块化设计简化了HTTP请求处理。摘要:Retrofit基于OkHttp实现,支持类型安全的API定义、自动数据转换和线程管理。核心包括注解系统(@GET/@POST等)、转换器(Gson/Jackson)和适配器(RxJava)。使用步骤涵盖依赖配置、接口定义、实例创建和请求处理。高级功能支持文件传输、协程/RxJava集成,以及自定义转换器。Retrofit以简洁的API和强大的扩展性,成为Android开发中高效处理网络请求的首选
2025-08-07 10:38:45
716
原创 Android13实现导出日志到U盘中
Android 13日志导出到U盘实现方案 本文介绍了在Android 13系统上实现将设备日志(ANR、tombstones等)导出到U盘的技术方案。重点分析了Android 13的分区存储限制和特殊权限处理,特别是MANAGE_EXTERNAL_STORAGE权限的申请。技术实现部分详细展示了通过StorageManager获取U盘挂载点的方法,包括路径转换和状态检查的核心代码。方案解决了可移除存储设备的特殊处理问题,为设备调试和故障诊断提供了有效的日志导出方案。
2025-07-03 10:28:27
292
原创 安卓Seekbar,长按时进度条更新不平滑实战
在安卓应用中使用SeekBar时,进度条更新不平滑,出现卡顿或跳跃现象,影响用户体验。问题主要源于在UI线程中执行耗时操作,导致界面响应延迟。解决方案是将耗时的方法调用移至后台线程,通过Handler处理消息,避免阻塞UI线程。具体实现包括:使用Handler处理进度更新消息,自定义接口OnSeekBarValueChangeListener监听进度变化,并在按键事件中处理进度条的左右移动。通过将耗时操作移至后台线程,有效解决了SeekBar更新不平滑的问题,提升了用户体验。
2025-05-19 16:41:24
348
原创 安卓SeekBar的UI变化不平滑
然而,在某些情况下,SeekBar的UI变化可能不够平滑,导致用户体验不佳。在优化SeekBar的UI变化平滑度后,需要进行性能测试以确保优化效果。可以使用Android Profiler或Systrace工具来监控UI渲染性能,并根据测试结果进一步优化。通过分析SeekBar UI变化不平滑的原因,并采取相应的优化措施,可以有效提升用户体验。通过设置一个阈值或使用定时器来减少SeekBar的更新频率,避免过于频繁的UI更新。通过减少SeekBar的绘制复杂度或使用硬件加速来优化UI渲染。
2025-05-19 16:28:55
479
原创 【AOSP开发在打开某些app时屏幕画面会闪烁】
在AOSP开发过程中,打开某些应用(如Chrome)时出现屏幕闪烁问题。通过排查发现,屏幕密度(density)设置为320时会导致此问题,而将其修改为240后问题消失。为解决此问题,修改了AOSP源代码中的ActivityRecord.java文件,具体在onWindowsDrawn()方法中添加了逻辑,根据应用包名和屏幕分辨率动态调整屏幕密度。对于Chrome应用,当屏幕分辨率大于900时,将密度设置为320,否则设置为213。此解决方案通过系统属性persist.sys.dpi来记录密度是否已调整
2025-05-15 15:29:03
323
原创 安卓AOSP开发,取消U盘插入时自动创建目录的默认行为
在安卓AOSP开发中,插入U盘时系统默认会自动创建一些目录,如Music、Pictures等。然而,某些客户希望取消这一行为。通过修改系统源码,可以实现这一需求。具体步骤包括定位相关源码文件packages/providers/MediaProvider,调整U盘挂载时的目录创建逻辑,并在MediaProvider.java中修改ensureDefaultFolders和ensureThumbnailsValid方法,加入自定义逻辑以控制目录的创建。修改完成后,编译并测试系统镜像,插入U盘验证是否不再生成默
2025-05-15 14:22:21
1340
原创 GORM使用
即Object-Relational Mapping,它的作用是在关系型数据库和对象之间作一个映射,这样我们在具体操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作就可以。
2025-03-10 15:46:06
452
原创 Jetpack Compose状态
在重新创建Activity或进程后,可以使用rememberSaveable恢复界面状态。此外,rememberSaveable也可以在重新创建activity或进程后保持吃状态。LiveData是一种可观察状态容器,这意味着它可让任何人观察状态的变化。然后我们在界面中使用observe方法,以便在状态变化时更新界面。将状态从Activity移到了Viewodel中,在ViewModel中,状态由LiveData表示。在安卓中状态会根据事件进行更新,事件是从应用程序的外部输入。
2025-03-10 15:44:32
1079
原创 安卓14在asop的framework中集成原厂的资源调用依赖
当你编译好后,在刷入设备中调用却发现,无法获取到你想要的数据,要么是返回了 null 要么都是false。这个时候其实是权限不够了,可以使用logcat | grep avc 查看对应的senlinux报错,根据相关信息修改添加对应的权限策略,最后再编译固件刷入设备。在添加权限策略中可能不止需要加一个,可能需要加好几个,还是需要根据日志来查看需要加哪些权限。我是在framework/base/sevices/core中的bp文件中添加了需要使用的依赖。需要编译固件出来,对应的资源才会被打包到系统中。
2025-02-17 15:32:04
348
原创 Gin学习之路
使用gin.Default()还有gin.New();两者的关系,Dafault内部实际上也是调用了New,但是加上了Logger和Recovery中间件。gin支持GET、POST、POST、PUT、DELETE、PATCH、HEAD、OPTIONS方式。gin.default实例化引擎,默认有两个中间件Logger和Recovery分别处理日志和错误。文档地址:https://gin-gonic.com/zh-cn/docs。关键方法:engine.Use()这个案例使用了GET方式。
2024-01-11 14:03:59
478
原创 在使用Mybatis的分页插件PageHelper时导致的分页失效
总的来说,在你调用PageHelper的开始分页方法时,只会在接下来执行的第一条查询有效,在它返回的list其实不是Collection类型,而是Page。不知道大家有没有更好的解决方法,欢迎评论!希望能帮到碰到这种问题的人。
2023-11-17 09:57:10
548
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅