android系统开发知识
文章平均质量分 86
介绍安卓系统的相关知识
xzkyd outpaper
一个普普通通的小白罢了
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Android中handler机制
核心目的:解决多线程并发和线程切换的问题。在 Android 中,主线程(UI 线程)负责处理用户交互和UI更新,绝对不允许在主线程中进行耗时操作(如网络请求、数据库读写),否则会引发 ANR。同时,Android 的 UI 工具包不是线程安全的,不允许在子线程中直接更新 UI。在子线程中执行耗时任务,然后将结果发送回主线程进行UI更新。Handler 就是这个机制的基石。Handler 机制的四大组件:Message: 需要传递的消息,可以携带数据和标识。: 一个按时间排序的优先级队列。原创 2025-08-30 17:45:11 · 946 阅读 · 0 评论 -
Android中APK包含哪些内容?
Q:“一个Android APK文件里面主要包含哪些内容?APK本质上是一个ZIP压缩包,它包含了Android应用安装和运行所需的所有文件。:这是应用的总配置文件,声明了包名、组件、权限等信息,但它被编译成了二进制格式。:这是Android系统的可执行字节码文件,由Java/Kotlin源码编译后转换而成,是应用的代码核心。如果方法数超限,还会有。:这是编译后的资源索引表,它是一个二进制文件,建立了资源ID到资源路径的映射关系,用于系统高效地加载适合当前设备配置的资源。res/目录:存放编译后的资源文件。原创 2025-08-27 19:31:20 · 1273 阅读 · 0 评论 -
Android中AAR、JAR文件
Q:“谈谈对 Android 中 JAR 和 AAR 的理解,它们有什么区别?“JAR 和 AAR 都是 Android 开发中常用的依赖包格式,但它们的定位和用途有本质区别。JAR是Java 平台的标准打包格式,它里面主要包含编译后的.class文件和一些 Java 资源。它在 Android 中主要用于引入纯 Java 的工具库或算法库,比如 Gson、OkHttp 的核心逻辑库。因为它不包含任何 Android 相关的资源或清单文件。AAR是Android 特有的库项目打包格式。原创 2025-08-27 19:25:35 · 1095 阅读 · 0 评论 -
Android中点击链接跳转到对应App页面的底层原理
Q:“说一下在Android里,点击一个链接跳转到对应App页面的底层原理。“这个功能的底层原理是基于Android的隐式Intent和机制。首先,App如果想要被链接唤醒,必须在它的中为目标Activity注册一个。这个过滤器里会定义动作、BROWSABLE和DEFAULT类别,并通过<data>标签声明它能处理的链接格式,包括scheme(如https)、host(域名)和path(路径)。当用户点击一个链接时,系统会创建一个包含此链接的隐式Intent。然后,系统的核心服务。原创 2025-08-27 19:10:33 · 1254 阅读 · 0 评论 -
ASM字节码框架和KSP能够解析JAR包或者AAR包里面的内容吗?
特性ASMKSP处理层面字节码.class文件)源码符号(AST, 符号表)处理阶段编译后期 (Class文件已生成)编译前期 (源码刚被解析)核心能力读取、修改、生成字节码读取符号信息,生成源码对 JAR可直接处理其中的.class文件可读取其声明的公共符号和注解对 AAR需先解压,再处理内部的可读取其声明的公共符号和注解典型应用代码插桩、埋点、热修复、性能监控代码生成(如BOF、路由、序列化)、元编程。原创 2025-08-27 16:41:58 · 881 阅读 · 0 评论 -
Android Handler 线程执行机制
Handler 中的代码在哪个线程执行?主线程执行使用创建通过发送的任务在主线程创建的默认 Handler子线程执行绑定子线程 Looper 的 Handler(如 HandlerThread)在子线程创建并初始化了 Looper 的 Handler执行机制所有发送到 Handler 的消息/任务,都会被放入关联的 MessageQueueLooper 在绑定线程中不断循环取出消息最终在 Looper 所在线程执行。原创 2025-08-18 14:10:18 · 734 阅读 · 0 评论 -
Android中Activity销毁底层原理
Q:请说明Activity从finish()到完全销毁的底层过程?A1. 发起阶段(用户进程)调用finish()后:保存数据通过Binder IPC调用AMS的2. 调度阶段(AMS)AMS收到请求后:标记ActivityRecord为FINISHING状态启动暂停流程:通过Binder回调等待onPause()完成(设置10秒超时)启动下一Activity并传递结果数据3. 销毁阶段(延迟执行)当主线程空闲时:AMS发送和顺序执行onStop()→释放Surface:通过。原创 2025-08-11 21:24:53 · 1124 阅读 · 0 评论 -
Android16新特性速记
RecyclerView从1.4版本开始已经接入了动态刷新率功能,这也就意味着,使用1.4版本的RecyclerView在支持动态刷新率的手机上将会拥有更好的性能和更低的能耗。传统4KB页是x86/ARM的历史标准,但16KB页能减少TLB未命中率,提升App启动速度。:操作系统将内存划分为固定大小的"页"(如4KB/16KB),通过页表管理虚拟页与物理页映射。:16KB页减少TLB未命中率(相同内存范围需更少页表项),提升内存访问效率。:CPU缓存页表的小型高速缓存,TLB未命中时需访问内存,降低性能。原创 2025-08-11 20:53:17 · 2014 阅读 · 0 评论 -
Android Intent 解析
核心概念:消息传递、组件激活、跨应用通信关键区别:显式Intent(精准)vs 隐式Intent(灵活)安全实践:导出控制、URI权限、PendingIntent不可变性性能要点:避免大数据传递、预查询匹配组件最新特性:Android 12导出限制、深链接验证。原创 2025-08-10 14:47:44 · 770 阅读 · 0 评论 -
Android 四大布局:使用方式与性能优化原理
布局最佳使用场景性能风险点简单列表/表单嵌套超过3层时性能骤降碎片容器/悬浮按钮多子视图定位困难中等复杂度相对定位子视图超过10个时测量缓慢所有复杂界面超简单布局略显繁琐。原创 2025-08-10 14:18:29 · 1272 阅读 · 0 评论 -
Android视图状态以及重绘
请解释Android视图状态变更如何触发界面更新?不重新测量/布局 → 适用于内容变化但尺寸不变场景。合并状态变更(避免连续多次invalidate)消息被标记为异步类型,优先于普通消息处理。保证16ms内完成绘制(60Hz刷新率)向父视图递归 → 可能引发全局重新布局。在消息队列插入屏障,阻塞后续同步消息。匹配新状态对应的Drawable资源。(measure/layout跳过)解决UI更新被业务消息阻塞的问题。仅允许异步的UI更新消息通过。执行完整的视图树遍历。渲染新状态对应的图片。原创 2025-08-07 23:59:18 · 1141 阅读 · 0 评论 -
Android渲染/合成底层原理详解
显示阶段:所有的buffer在此阶段的使用者都是hwc,因为hwc控制着显示芯片从生命周期可以看出GraphicBuffer对象在流转的过程中,会被GPU、CPU、DPU三个不同的硬件访问,如果同一块内存能够被多个硬件设备访问,就需要一个同步机制。合成阶段:GPU渲染完成后将图层传递给sf进程,sf进程决定由谁来合成,hwc或者GPU如果使用GPU合成,那么此时buffer的使用者依旧是GPU,如果使用hwc合成,那么此时buffer的使用者是hwc。原创 2025-08-07 22:32:50 · 1653 阅读 · 0 评论 -
Android中视图测量、布局、绘制过程
Q:简述自定义View的三大流程及核心方法?A:Measure(测量)目标:确定View的宽高核心机制:父容器通过传递约束条件,子View调用保存结果Layout(布局)目标:确定View的位置(四个顶点坐标)核心机制:父容器遍历子View并调用其layout(),子View通过setFrame()保存坐标Draw(绘制)目标:将View绘制到屏幕执行顺序:背景 → 自身内容 → 子View → 前景硬件加速:通过录制指令,由RenderThread异步执行。原创 2025-08-07 16:17:42 · 939 阅读 · 0 评论 -
Android中性能优化——白屏避免
- 关键属性:设置自定义背景 --></style>白屏的避免是通过自定义启动主题的实现的,系统在Activity创建后立即绘制该背景,因此用户感知到的第一个画面是预设的启动图而非白屏。此过程发生在初始化之后、Activity布局渲染之前,属于系统级行为,无需手动绘制代码。原创 2025-08-05 14:31:14 · 608 阅读 · 0 评论 -
Android 开发中,HandlerThread、IntentService 和 AsyncTask区别对比
Android 8.0+ 限制后台服务,推荐改用。:Android 11 起已弃用,推荐改用。不需要 UI 交互的后台任务(如下载文件)需要更新 UI 的轻量级任务(如加载图片):可通过 Intent 从其他组件启动。需要长时间运行的线程(如日志记录):容易引发内存泄漏(需配合。需要消息队列机制的任务序列。:比普通线程更难被系统回收。:任务按启动顺序依次处理。需要跨组件调用的独立操作。需保证任务顺序执行的场景。短时后台操作(< 几秒):支持顺序处理多个任务。:任务完成后自动调用。:简化主线程更新操作。原创 2025-08-05 14:24:08 · 1261 阅读 · 0 评论 -
Android 中 merge、include 和 ViewStub
缺点是可能引入多余嵌套,使用时需注意 ID 冲突问题。(如标题栏、底部导航、广告条)抽取为独立 XML 文件,实现“一次编写,多处引用”。,适合非立即显示的布局(如错误页、引导图)。相同结构的列表项布局(Item Layout)被多个 Adapter 使用。非立即显示的布局(如错误页、引导图、网络失败提示)。条件性布局(如横竖屏切换不同布局、VIP专属模块)。当被引入的布局根容器类型与父容器相同时(比如都是。的占位符,仅在代码触发时动态加载目标布局,,减少视图层级,提升渲染性能。)的布局文件中作为根节点。原创 2025-08-04 11:06:28 · 762 阅读 · 0 评论 -
Android中PID与UID的区别和联系(2)
PID是进程的"临时身份证",用于资源管理;UID是应用的"永久身份证",用于安全控制。二者协同构建了Android的安全沙盒机制。原创 2025-07-28 14:07:36 · 465 阅读 · 0 评论 -
Android中应用进程中Binder创建机制
Q:Zygote fork 子进程时会创建 Binder 线程池吗?ApplicationThread 在哪个线程运行?AZygote fork 时不创建Binder 线程池子进程继承的是 Binder 通信的底层能力(如的文件描述符和预加载的库)。真正的 Binder 线程池是在首次收到 Binder IPC 请求时动态创建的(由 Binder 驱动发送命令触发)。ApplicationThread 的运行线程它是的内部 Binder 对象。实际执行代码在 Binder 线程池的随机线程中。原创 2025-07-28 13:25:38 · 1018 阅读 · 0 评论 -
Android中主线程、ActivityThread、ApplicationThread的区别
AMS → Binder驱动 → ApplicationThread(Binder线程池) → ActivityThread.H(主线程) → 组件生命周期。Android应用进程均由Zygote进程fork生成,继承Zygote预加载的类路径和资源(如Android框架类)。接收AMS的IPC调用(如启动Activity),转发给主线程Handler执行。,无消息时休眠释放CPU,有消息(如VSync信号、点击事件)时被唤醒。该进程承载主线程(即UI线程),负责运行。),默认最大线程数16。原创 2025-07-28 11:58:56 · 1711 阅读 · 0 评论 -
Android中ViewStub和View有什么区别?
答:merge 需要作为根布局,而 ViewStub 必须指定单一父容器进行替换(完整含有Linerout等布局的xml文件)。答:View.GONE 的视图仍会创建对象并参与 measure/layout,而 ViewStub 完全跳过这些步骤。示例:电商APP商品详情页中,规格选择弹窗用 ViewStub 加载,而立即显示的图片画廊用普通 View。:请解释 ViewStub 和普通 View 的区别及其使用场景。内存占用:ViewStub 自身仅 4KB,远小于普通 View。ViewStub 在。原创 2025-07-26 16:26:02 · 1115 阅读 · 0 评论 -
Android Activity与Fragment生命周期变化
Q1: Activity和Fragment生命周期如何联动?答创建阶段Activity的onCreate()触发Fragment的Activity的onStart()触发Fragment的前台交互Activity的onResume()触发Fragment的onResume()Activity的onPause()触发Fragment的onPause()后台阶段Activity的onStop()触发Fragment的返回时Activity的触发Fragment的销毁阶段Activity的。原创 2025-07-24 18:53:02 · 1023 阅读 · 0 评论 -
JVM、Dalvik、ART垃圾回收机制
卡顿:ART(5ms)< Dalvik(30ms)< JVM Full GC(100ms+)ART:四空间划分(Image预加载类+Large Object专存大对象)最终标记(非STW):处理引用变更(ModUnionTable记录脏数据)Dalvik:Zygote堆(共享)+Active堆(进程独享)初始标记(STW暂停1次):标记根对象(耗时≤1ms)JVM:新生代(Eden+Survivor)+老年代。:10倍于Minor GC,导致应用暂停(STW):标记-清除(产生碎片)或标记-整理(无碎片)原创 2025-07-23 19:29:36 · 778 阅读 · 0 评论 -
JVM、Dalvik、ART区别
(Android 7.0+):运行时记录热点代码,空闲时编译(混合模式平衡安装时间与运行效率)。:优化后的Dex,包含目标平台特定指令(Dalvik)或预编译机器码(ART)。分Zygote堆(预加载核心类)和Active堆(应用对象)。(Android 7.0+),安装时生成机器码,运行效率最高。:安装时预编译整个Dex为本地机器码(.oat文件)。标记-清除(Mark-Sweep)、分代收集(G1)。低内存:多进程隔离(每个App独立Linux进程)。:”一次编译,到处运行“(依赖各平台JVM实现)。原创 2025-07-23 19:21:57 · 1471 阅读 · 0 评论 -
Android 持久化存储原理与使用解析
Q1:SharedPreferences有什么缺陷?如何优化?A:全量写入导致I/O性能差apply()异步提交可能引发ANR(ActivityThread等待QueuedWork)多进程不安全(已废弃)无类型安全检查迁移到MMKV或DataStore避免存储超过1MB数据对高频修改项单独拆分文件Q2:MMKV为什么比SharedPreferences快?mmap内存映射:文件直连内存,省去系统调用和数据拷贝Protobuf编码:比XML节省50%+存储空间增量更新。原创 2025-07-23 13:40:24 · 1584 阅读 · 0 评论 -
Android 中 SystemServiceManager 和 ServiceManager 的应用场景、区别与联系
系统服务(如 AMS、PMS)启动时将自身 Binder 对象注册到 ServiceManager。:在 SystemServer 进程中按顺序初始化 AMS、PMS、WMS 等服务。(如 AMS、PMS)。是 SystemServer 进程内的组件,充当系统服务的“孵化器”,负责。:SystemServer 将 AMS 的 Binder 对象注册到。是独立进程,作为全局 Binder 服务的“黄页”,负责服务的。:仅系统级进程可注册服务,普通 App 仅限查询。,负责系统服务的创建、启动与依赖管理。原创 2025-07-21 16:01:39 · 1294 阅读 · 0 评论 -
Android性能优化
Application优化:通过延迟初始化非关键组件,使用Jetpack Startup库管理初始化顺序视觉优化:配置启动主题避免白屏,添加Splash Screen提升用户体验异步加载:使用线程池或IntentService在后台初始化非UI相关组件"布局优化:使用ConstraintLayout减少嵌套层级列表优化:实现ViewHolder模式并配合DiffUtil,使列表滑动FPS稳定在60帧过度绘制:移除冗余背景,使用clipRect限制绘制区域工具使用。原创 2025-07-18 13:54:29 · 944 阅读 · 0 评论 -
Android CameraX使用
"CameraX 的核心架构围绕展开,它负责:通过选择物理摄像头将Preview用例绑定到通过接收用户交互指令:接收生命周期所有者、摄像头选择器和用例列表:连接显示预览:接收输出配置、执行器和回调"原创 2025-07-16 20:00:30 · 886 阅读 · 0 评论 -
Android中Launcher简介
Launcher的双重角色系统入口:响应点击事件,启动其他应用(通过Intent触发AMS)。桌面管理器:显示已安装应用的图标(从PackageManagerService获取应用信息)。请描述从点击桌面图标到应用显示的全过程“该过程分为Launcher响应和应用启动两个阶段:1. Launcher端点击图标触发,生成包含的Intent。通过Binder向AMS发送请求,AMS记录并检查目标进程是否存在。2. 系统调度端进程不存在:AMS通过Socket通知Zygote fork新进程 → 加载。原创 2025-07-15 19:03:12 · 1179 阅读 · 0 评论 -
Android 事件分发机制深度解析
答:Activity -> Window -> DecorView -> ViewGroup -> View。内部拦截法:子View调用requestDisallowInterceptTouchEvent():消费ACTION_DOWN的View将接收整个事件序列。后续事件:若未拦截DOWN,仍可拦截MOVE/UP。:View应在DOWN时初始化触摸状态。:一旦拦截,整个事件序列不再检查拦截。:GONE状态的View不参与分发。:后添加的子View优先(可通过。:仅分发到触摸区域内的子View。原创 2025-07-08 19:00:54 · 1502 阅读 · 0 评论 -
Android Navigation 原理解析
解析节点属性(id、label、arguments 等)替换操作会销毁上一个 Fragment 的视图。NavHostFragment 的。Fragment 无内置任务栈管理。视图重建开销(特别是复杂UI)建立 action 连接关系。首次设置导航图时触发启动流程。处理嵌套导航图(递归解析)避免视图叠加导致的潜在问题。:严格的内存管理,避免泄露。确保每次导航都传递新参数。根据标签名获取对应的。优先保证导航行为一致性。提交事务后立即执行(状态保存/恢复复杂化。原创 2025-06-24 17:25:12 · 608 阅读 · 0 评论 -
Android Navigation 架构
处理导航操作(navigate/popBackStack)提供 Fragment 容器(通常是。将具体导航操作委托给专门的。可以是原子目标或嵌套图。:导航的物理容器和起点。:导航系统的中央协调器。:具体导航操作的执行者。处理特定类型目标的导航。实现导航结构的树形组织。实现导航和返回栈操作。:导航路线的抽象定义。原创 2025-06-24 16:41:28 · 1110 阅读 · 0 评论 -
Android中Navigation使用介绍
所有页面需在 XML 预定义,大型项目修改成本高。:目标 Fragment 会经历完整生命周期。响应 NavController 指令。所有目的地(Destination):无法根据条件(如登录状态)动态设置。管理返回栈(BackStack):当前页面被销毁,目标页面重建。参数(Argument)声明。:回退后栈中页面保留原有参数。:向上导航(遵循导航图层级):传递参数的 Bundle。:是否同时弹出目标页面本身。协调 Navigator。,若目标页不在栈中返回。时,目标页面也被移除。原创 2025-06-24 15:31:03 · 1507 阅读 · 0 评论 -
Android Bitmap 质量压缩原理与压缩机制详解
问题: Bitmap 的质量压缩原理回答Android 的质量压缩是通过方法实现的有损压缩。它调整图片的编码质量参数(0-100),主要作用于 JPEG/WEBP 格式。其核心原理是:对色彩数据进行离散余弦变换(DCT),分离高频/低频分量通过量化表降低高频细节(人眼不敏感部分)的精度使用哈夫曼编码压缩数据块这种压缩会减小文件体积,但不改变图片尺寸,解码后内存占用不变,适合网络传输场景。问题:Bitmap 有哪些压缩方式?原创 2025-06-23 16:20:22 · 1310 阅读 · 0 评论 -
什么时候会发生内存泄漏?
"内存泄漏本质是无用对象无法被回收。工作中我重点关注五大场景:1. 单例误用:避免持有Activity,改用Application Context2. 内部类泄漏:将非静态内部类改为static,或使用弱引用3. Handler泄漏:采用静态Handler+弱引用,并在onDestroy移除消息4. WebView泄漏:动态创建+及时移除,或使用独立进程5. 资源未关闭:在onDestroy中释放Cursor/文件流/广播等。原创 2025-06-20 16:50:50 · 738 阅读 · 0 评论 -
Android Retrofit 解析
动态代理解耦将接口声明与实际实现分离运行时生成API实现类注解驱动设计@GET@POST定义请求方法@Path@Query处理参数@Headers配置请求头组件化架构| - 注解解析器 || - 请求构建器 || - 网络执行器 || - 数据转换引擎 | +-----------------+| - 调用方式适配器 | +------------------+线程切换机制默认通过实现主线程回调可自定义线程调度策略总结Retrofit 的核心原理分为三步:第一步:接口声明。原创 2025-06-18 17:07:40 · 909 阅读 · 0 评论 -
Android ViewBinding 简述
ViewBinding 是 Android Jetpack 组件,用于替代传统 findViewById,提供类型安全和空安全的视图访问方式。它会在编译时为每个 XML 布局文件生成绑定类,直接映射视图 ID。二、ViewBinding优点 类型安全:自动匹配视图类型,避免类型转换错误空安全:生成的视图引用永不为 null(除非布局中不存在)编译时检查:XML-ID 错误在编译时暴露,而非运行时崩溃代码简洁:消除模板代码,提升可读性性能优化:编译时生成代码,零运行时开销2. 自动生成的原创 2025-06-18 14:39:11 · 668 阅读 · 0 评论 -
Glide缓存机制
弱引用 + LruCache减少网络流量消耗避免Bitmap频繁创建/销毁引发的GC提升图片加载速度acquired变量记录引用次数acquire():引用+1(图片使用时调用)release():引用-1(图片释放时调用):弱引用 → LruCache:磁盘 → 弱引用 → LruCache(释放时):弱引用减少LruCache的trimToSize频率(trimToSize是LruCache(Least Recently Used Cache)中的核心方法,用于。原创 2025-06-18 14:12:44 · 758 阅读 · 0 评论 -
Android中Glide.with().load().into() 应付面试源码解析
with(this):创建与 UI 生命周期绑定的通过获取单例向 Activity/Fragment 添加通过 Fragment 生命周期回调控制请求(页面销毁时自动取消加载):使用全局生命周期:解决内存泄漏问题,实现请求与页面生命周期同步load(url)创建对象初始化→(处理网络流)最终组合为(支持流 + 文件描述符双通道)封装参数:URL 数据源解码器(转码器(:通过泛型抽象支持多种数据源(URL/文件/资源ID等)原创 2025-06-17 20:06:35 · 1121 阅读 · 0 评论 -
Android中ContentProvider细节
应用的全局初始化(Application.onCreate)可能包含与特定 ContentProvider 无关或非必需的复杂操作,不应该阻塞关键的数据服务启动。(其中可能包含大量耗时的全局初始化,如第三方库初始化、网络配置、复杂业务逻辑等),会让客户端等待更长时间,大大增加 ANR 风险。理解这个顺序对于编写健壮、高效的 ContentProvider 至关重要,尤其是在处理跨进程请求时,避免在。(如打开数据库、初始化文件句柄、建立必要的网络连接池等),确保它能以最小、最必要的状态快速响应数据请求。原创 2025-06-09 18:24:01 · 985 阅读 · 0 评论 -
从面试角度回答Android中ContentProvider启动原理
场景已启动未启动触发条件本地或远程已加载的Provider首次跨进程访问未加载的Provider流程核心直接获取Binder,跨进程调用触发进程创建→安装Provider→发布Binder生命周期onCreate()早于应用启动初始化延迟至首次访问多进程支持依赖和process配置需显式配置多进程属性。原创 2025-06-09 18:14:55 · 1257 阅读 · 0 评论
分享