- 博客(29)
- 收藏
- 关注
原创 Android APK 极限瘦身:从构建链优化到架构演进
APK 瘦身不是一蹴而就的,而是一套组合拳。构建层(语言包剔除)。兜底层:配置 res/raw/keep.xml,防止反射资源误删,强杀第三方库无用资源。代码层:用 @IntDef替换所有枚举。架构层:ABI 分包 (splits) 或 AAB 动态分发。将Lint 检查(Unused Resources)集成到 CI 流水线中,让包体积治理常态化,才是大厂应用保持轻盈的秘诀。
2025-12-29 18:13:32
955
1
原创 Android 性能优化深水区:电量与网络架构演进
尽管系统管控严格,但对于即时通讯、VoIP 等需要持续保活的应用,Android 提供了一份白名单机制。特权:加入白名单的应用在 Doze 模式下可以使用网络并持有部分 WakeLock。代码实现Java// 检查是否已经在白名单中if (!// 方案A:跳转到列表页让用户自己找(合规推荐)// 方案B:直接弹窗申请(需权限,Google Play 慎用)我们需要继承Worker(或 Kotlin 的) 并重写doWork()方法。这是执行后台任务的地方。Java。
2025-12-22 15:33:41
1218
1
原创 Android 屏幕适配全维深度解析
X2C是由掌阅科技 (iReader)开源的一个 Android 布局加载优化框架。它的核心目的是解决 XML 布局加载慢的问题,通过在编译期将 XML 布局文件翻译成 Java 代码,从而在运行时省去 XML 解析(IO 操作)和反射创建 View 的开销。
2025-12-18 17:37:16
732
原创 Android ANR 深度起底:从系统埋雷机制到全链路治理体系
减少负载:主线程只做 UI 操作,重活儿全部下放。警惕 IO:不仅是网络和数据库,SP 的apply()也是潜伏的杀手。监控闭环:通过 WatchDog 抓取线上真实案例,结合traces文件深挖锁竞争和进程间通信瓶颈。
2025-12-17 22:06:42
714
原创 Android 渲染性能优化实战总结:从监控体系到架构落地
在 Android 开发中,流畅度是用户体验的核心指标。业界公认的流畅标准是,这意味着系统必须在内完成一帧的全部计算与绘制。一旦主线程耗时过长,导致无法在 VSync 信号到来前提交数据,就会发生,用户感知的直接后果就是卡顿。本文总结了一套从底层监控到上层架构的渲染优化方案,涵盖了 Systrace 分析、Choreographer 实时监控、布局层级优化以及 ViewPager2 懒加载实战。
2025-12-17 13:05:16
1077
原创 Android 性能优化之启动加速:从底层原理到架构治理
利用解决白屏,提升第一眼体验。严控主线程耗时,非必须的初始化通通往后推。减少层级,降低渲染压力。在启动优化中,我们经常面临一个死结:有些任务(比如初始化某些依赖 View 的 SDK、预加载下一页数据)必须在主线程执行,不能扔到子线程。但如果直接在onCreate或onResume里执行,就会抢占 CPU,导致首屏渲染变慢。IdleHandler 就是用来打破这个死结的。“IdleHandler 并不是用来替代子线程的。凡是能去子线程的任务,首选依然是子线程。
2025-12-14 20:42:32
1141
1
原创 Android 性能优化之数据结构:Java 集合与 Android 特有容器的深度博弈
在Android开发中,集合类的选择直接影响应用的性能和内存使用。本文将从底层实现机制出发,深入分析ArrayList、LinkedList、HashMap、SparseArray和ArrayMap的内部原理,帮助开发者做出最优的选择。2的幂次方长度- 使用位运算替代取模运算- 性能提升:位运算比除法快10倍以上- 确保所有索引都能被均匀使用负载因子0.75- 基于泊松分布理论的最优值- 平衡空间利用率和查找性能。
2025-10-21 09:15:59
860
原创 OkHttp源码解析(二)
两个异常都是根据recover方法判断是否能够进行重试,如果返回true,则表示允许重试。1,如果是那么直接判定不能重试;(你的请求或者服务器的响应本身就存在问题,没有按照http协议来 定义数据,再重试也没用)2,可能由于网络波动造成了Socket连接的超时,可以使用不同路线重试。3,前者是证书验证失败,后者可能就是压根就没证书,或者证书数据不正确, 那还怎么重试?经过了异常的判定之后,如果仍然允许进行重试,就会再检查当前有没有可用路由路线来进行连接。
2025-10-14 15:07:23
473
原创 OkHttp源码解析(一)
这种模式给予请求的类型,对请求的发送者和接收者进行解耦。在这种模式 中,通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下 一个接收者,依此类推。前面我们提过,分发器就是来调配请求任务的,内部会包含一个线程池。当异步请求时,会将请求任务交给线程池 来执行。那分发器中默认的线程池是如何定义的呢?中进行,在进入这个方法分析之前,我们先来了 解什么是责任链模式,因为此方法就是利用的责任链模式完成一步步的请求。请求会被交给责任链中的一个个拦截器。
2025-10-13 20:44:27
326
原创 PKMS核心分析(一)
服务,也就是安装器,随后判断当前的设备是否处于加密状态,如果是则只是解析核心应用,接着调用。管理本地应用,主要有, 安装,卸载,应用信息查询 等。清单文件,解析清单文件中的所有节点信息。文件,安装系统应用,安装本地应用等。如果设备没有加密,操作它。启用部分应用服务于多用户场景。,如果设备加密了,则只解析。优化,磁盘管理功能,让。
2025-10-08 22:19:41
476
原创 AMS核心分析(二)
Instrumentation是Android系统中的一个核心组件,它提供了对Activity和Application生命周期的监控和控制能力。它允许开发者在不修改应用代码的情况下,监控、测试和调试应用程序// Instrumentation的基本定义// 监控Activity生命周期// 监控Application生命周期。
2025-10-04 22:44:44
768
原创 AMS核心分析(一)
反射创建:通过反射机制创建Lifecycle类实例生命周期管理:Lifecycle类管理AMS的完整生命周期解耦设计:通过反射实现服务创建的解耦统一管理:所有系统服务都通过相同的反射机制创建依赖注入:在创建过程中注入必要的依赖。
2025-10-03 12:12:58
972
原创 Android 底层风暴:Dex 文件格式详解与增量更新原理
增量更新(Incremental Update)是一种软件更新策略,只下载和安装应用程序的变更部分,而不是整个应用程序。这种方法可以显著减少下载时间和数据使用量。bsdiff(Binary diff)是一种高效的二进制差异算法,专门用于生成两个二进制文件之间的差异补丁。它基于后缀数组和最长公共子序列算法,能够生成最小的差异补丁。
2025-10-01 14:15:48
1099
原创 Android系统启动
1. Linux内核启动后,启动init进程init进程启动# 2. init进程读取init.rc配置文件init.rc配置文件中定义了Zygote的启动# 3. init进程启动Zygoteinit进程 → 启动Zygote进程# 4. Zygote启动SystemServerZygote进程 → fork出SystemServer进程# 5. Zygote fork应用进程Zygote进程 → fork出应用进程。
2025-09-29 16:07:28
417
原创 进程间通信机制Binder源码详解(三)
-- 函数指针 --- svcmgr_handler作用:获取或者添加 service。-- 给SM --- 被挂起。- 1.writeTransactionData --- out 写入命令 --write --- cmd == BC_TRANSACTION。- BINDER_WORK_TRANSACTION --- 要处理 cmd == BR_TRANSACTION。- talkWithDriver -- 非常重要 --- 代码非常长。- wait_event_freezable --- 挂起。
2025-09-28 14:06:42
660
原创 进程间通信机制Binder源码详解(二)
函数,通过搜索代码,你会发现根本找不到这个方法是在哪里定义这个函数的。表示目标对象的生命周期受弱指针控制。文件而创建的,其所对应的可执行程序。读数据,没有数据会进入休眠状态。单例模式,如果不为空直接返回。秒后,循环尝试获取直到成功。可能未准备就绪,这时通过。驱动,能支持的最大线程数。是否有效,当前是无效的。通过模板函数来定义的。驱动,得到文件描述符。准备就绪的线程个数加。不存在或弱引用无效时。
2025-09-27 12:12:42
784
原创 进程间通信机制Binder源码详解(一)
Binder是Android系统中用于进程间通信(IPC)的核心机制,它允许不同进程之间安全地交换数据和调用方法。- 进程间通信机制- 也是一个驱动- Binder.java --> 实现 Ibinder --- 跨进程的能力自己创建的进程:webVIew 视频播放、音乐、大图浏览、推送、系统服务:打电话,闹钟等等线程共享区域 --- 麻烦 -- 同步身份识别 --- PID 多少 --- 不靠谱系统分配 UID --- 更安全 -- linux ---组id 用户id。
2025-09-25 21:40:22
1823
原创 Handler源码解析(二)
同步屏障是Android消息机制中的一种特殊机制,用于临时阻止同步消息的处理,优先处理异步消息。它就像一个"屏障",阻挡同步消息通过,让异步消息能够优先执行。
2025-09-22 10:54:47
374
原创 CoodinatorLayout协调者布局
3.为什么在依赖的控件下设置一个behavior,DependedView位置发生改变的时候就能通知依赖方?1. 产生事件(scroll或fling)的控件必须是CoordinatorLayout的直接子View。DirectedAcyclicGraph 图的数据结构,用来保存View 与其依赖的关系:1 -> n。2. 响应Behavior的控件必须是 CoordinatorLayout的直接子View吗?情况2:需要响应依赖View的变化。情况3:需要实现复杂的定位逻辑。情况1:需要自定义布局逻辑。
2025-09-09 23:39:50
371
原创 RecyclerView的回收复用
怎么从集合中去获取:,分几种情况去获取ViewHolder1. getChangedScrapViewForPosition -- mChangeScrap 与动画相关4. mViewCacheExtension.getViewForPositionAndType -- 自定义缓存5. getRecycledViewPool().getRecycledView -- 从缓冲池里面获取RecycledViewPool -- 缓存池。
2025-08-31 22:44:39
897
原创 如何绘制一条灵动的锦鲤?
点击屏幕时,点击位置会出现波纹,锦鲤会扭头朝点击位置游去,此过程中锦鲤尾巴摆动的速度会加快,到达目标点时尾巴速度恢复。// AB连线与X的夹角的tan值 - OB与x轴的夹角的tan值。// ViewGroup 默认 不执行 onDraw。//二阶贝塞尔曲线的控制点 ---- 决定🐟的胖瘦。// 画大圆 --- 只在节肢1 上才绘画。// 执行了整个周期的百分之多少。
2025-08-23 20:20:23
2014
2
原创 事件冲突原因与解决方案
若onTouch() 方法return false,则事件由onClick消费,否则由onTouch消费,onClick不会有反应。内部拦截:getParent().requestDisallowInterceptTouchEvent(false);handled为true说明View处理了事件,为false则说明View未处理事件。当用户明显想要垂直滑动时,不拦截事件让 ListView 处理。分发或者处理(拦截相当于你是最后一个,事件到底处不处理)若为内部拦截,父容器必须不拦截Down事件。
2025-08-19 10:31:09
683
原创 京东淘宝首页二级联动的实现
/ 告诉子View父View已经消耗了这些距离。// 告诉子View父View已经消耗了这些距离。// 调整contentView的高度为父容器高度,使之填充布局,避免父容器滚动后出现空白。// 父View拦截了,子View不需要再处理。// 父View拦截了,子View不需要再处理。在子view(RecyclerView)滑动时,优先考虑父View是否能滑动。// 父View还能向下滑动,优先拦截。// 父View还能向上滑动,优先拦截。// 向下滑动(向上滚动内容)// 向上滑动(向下滚动内容)
2025-08-17 09:39:09
896
原创 LayoutParams是什么?与MeasureSpec有关系吗?
概念作用关系子视图向父容器声明布局需求(宽/高规则等)父容器用其 + 自身约束生成子视图的 MeasureSpec父容器传递给子视图的尺寸约束由父容器的 MeasureSpec + 子视图的 LayoutParams 计算简言之是子视图的“愿望”,是父容器结合自身能力给出的“实际限制”,二者共同决定视图的最终尺寸。
2025-08-14 09:46:57
919
1
原创 c语言实现扫雷游戏
printf("很遗憾,你被炸死了\n");printf("坐标非法,请重新输入\n");一个mine棋盘,11*11大小。一个show棋盘,9*9大小。printf("恭喜你排雷成功\n");printf("请输入坐标");//1.布置好雷的信息。//2.排查雷的信息。首先构思游戏的主要框架。以下为游戏的运行原理。
2023-10-30 14:56:32
92
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅