IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:Android

共 139 篇相关文章

IT 累计浏览 39

「置顶」我做了什么

本文是作者的个人技术项目总览,系统梳理了他长期维护的四大方向工作。在 Android 性能分析与工具链建设上,以 SmartPerfetto 为核心,构建了一套基于 Perfetto 的 AI 辅助分析体系,并配套开发了 Android App Memory Analysis、TraceFix(自动插桩)等专用工具,形成了从 Trace 采集、数据可视化到自动化分析的完整流程。AI 与自动化方向,重点介绍了本地运行的 OpenClaw 系统,它整合了多种模型与工具,用于知识管理、日报生成及工程协作,其公开成果如 AI Field Notes 展现了持续的自动化信息处理能力。此外,作者还开发了数款面向真实需求的 iOS 与 Android 应用,如健康预测 App 100Years。在技术内容输出方面,他通过维护 Android Performance 博客、Android Weekly 周刊及知识星球,沉淀了大量关于系统性能、工具使用及方法论的深度文章与案例,构成了公开的知识体系。整体而言,这些项目贯穿了从底层性能分析、工具开发、AI 实践到应用实现与知识分享的完整技术闭环。

IT 累计浏览 16

SmartPerfetto 开源:面向 Android Trace 分析的 Perfetto AI Assistant

SmartPerfetto 是一个面向 Android 性能工程师的开源 AI 助手,深度集成于 Perfetto UI,旨在将重复性的 trace 数据查询与初步判断流程自动化,使工程师能更专注于核心归因与决策。该项目将 Perfetto UI 作为前端,在其基础上增加了 AI Assistant 面板;后端由 TypeScript 编写的 agentv3 运行时负责场景识别、计划编排、工具调用与报告生成;核心数据查询仍然依赖 Perfetto 官方的 trace_processor_shell 执行 SQL。 其核心设计是将领域分析经验封装为可执行的 YAML Skill(目前包含 165 个,覆盖滑动、启动、ANR、渲染管线等场景),并通过 MCP 工具协议向 Agent 暴露结构化操作,确保大模型不直接接触原始 trace 文件,而是通过调用 SQL、Skill 和内部工具来获取数据与结论。这种架构使得分析过程可重复、结果可展示、规则可审查与复用。 该项目选择在开发阶段开源,以期利用真实设备、厂商差异和业务 trace 样本来持续打磨其分析规则与策略。它并非替代工程师,而是作为一个能稳定执行查询、整理证据并按策略检查的分析辅助工具,帮助性能工程师从海量 trace 事件中快速定位问题侧,减少手动翻表与编写临时 SQL 的工作量。

IT 累计浏览 11

定位 Android 权限声明来源

在 Android 开发过程中,排查某个应用权限由哪个第三方依赖库引入是一个常见问题。本文介绍了一种通过 Gradle daemon 日志快速定位权限声明来源的方法。 Gradle daemon 是 Gradle 构建系统的后台进程,其日志文件(位于 ~/.gradle/daemon/ 目录)详细记录了依赖解析和 AndroidManifest.xml 合并过程。通过使用 grep 命令在这些日志中搜索特定权限字符串(如 "android.permission.INTERNET"),可以获取相关记录。查询结果通常能明确指出该权限在哪个依赖库的 AndroidManifest.xml 的哪一行被声明,并显示合并操作的日志行号。 根据日志信息,开发者可以确认权限来源。若需移除不需要的权限,可以在应用的主 AndroidManifest.xml 文件中使用 `` 来显式删除。需要注意的是,daemon 日志会随构建次数增加而变大,应定期清理,且不同 Gradle 版本的日志格式可能存在细微差别。

IT 累计浏览 14

Android ANR 系列 1 :理解 Android ANR 设计思想

Android ANR(应用无响应)机制是系统层面为保障稳定性而设计的核心防御体系,其设计思想远非简单的“主线程超时”。ANR的实质是系统通过跨进程的协同监控与强制干预,对应用行为实施严格约束与熔断,以在开放生态中防止单点故障蔓延。系统将应用ANR与系统级无响应(SNR)明确区分,分别采用事件驱动检测和主动轮询两种不同的治理策略。 ANR监控由system_server进程主导,核心分为两类。组件类ANR通过ActivityManagerService追踪异步任务生命周期,采用“派发-回调-熔断”模型,利用Binder同步调用与Handler延迟消息构建超时检测机制。输入类ANR则更为复杂,InputDispatcher通过socket与应用建立事件通道,依赖队列状态管理(inboundQueue、outboundQueue、waitQueue)和超时检测(默认5秒)来监控事件处理流程。此外,No Focused Window类ANR反映了窗口焦点状态异常,导致事件无法分发。 该机制遵循状态可追踪、故障隔离和用户控制权兜底的设计原则。当超时触发时,系统执行多维熔断:采集线程堆栈与性能数据至traces.txt、隔离问题进程资源、并弹出提示将最终决策权交予用户。这种设计强制开发者关注主线程响应性与异步架构。 ANR问题的分析与治理也已演进为一套方法论,从依赖traces.txt的静态堆栈分析,发展到使用systrace/perfetto进行动态追踪,再到利用机器学习预测复杂根因。最终,治理的目标是走向架构预防性设计,例如约束通信拓扑、管理资源预算与强化异步边界,从而在代码层面内化系统约束,从源头预防ANR。

IT 累计浏览 14

Android Perfetto 系列 4:使用命令行在本地打开超大 Trace

针对Android性能分析中遇到的超过2GB的大型Perfetto Trace文件无法在网页端直接打开的问题,本文介绍了使用官方提供的trace_processor_shell命令行工具进行本地解析的解决方案。由于浏览器存在内存限制,超大Trace文件会导致在线分析工具失效。trace_processor_shell是Perfetto的核心组件之一,它基于Rust/C++实现高性能解析引擎,能够绕过浏览器限制,在本地高效处理大文件。用户需从GitHub下载对应平台的工具包,然后通过命令行添加`--httpd`参数启动本地服务,之后再访问Perfetto UI界面,选择连接该本地服务进行分析。文章对比了命令行启动与直接使用网页UI两种方式的核心区别:命令行模式提供原生加速、支持高级SQL查询和状态保持,适合复杂的大文件分析;而网页UI模式则更便捷,支持分享等功能,但性能受限。此外,文章还提醒了Mac系统可能遇到的安全权限问题及解决方法。整体而言,该工具为深度性能分析提供了更强大的本地处理能力。

IT 累计浏览 16

Android Weekly 2025-06 期

Android Weekly 2025-06期聚焦Android技术生态的最新动态与深度解析。在UI与渲染层面,详细对比了传统DiffUtils与Jetpack Compose在列表更新中的机制差异,并深入探讨了如何通过GPU硬件加速、RenderThread优化动画流畅度,以及分析了Android系统的渲染流程与Vsync信号处理。工具与调试方面,介绍了如何使用Perfetto分析渲染机制及在本地处理超大Trace文件,以及利用Frida实现JNI方法的动态跟踪、反汇编与代码补丁。此外,内容还涵盖了Compose与原生View的跨平台混排原理、使用ASM进行字节码插桩、理解ANR设计思想,以及Android Gradle任务机制解析。AI融合趋势明显,探讨了移动端相册如何利用CLIP模型实现AI搜图,以及DeepSeek-R1等推理模型的技术突破。最后,部分文章延伸至内核技术,如鸿蒙微内核论文解读和并发错误检测方法。整体内容广泛覆盖从底层系统到上层应用开发的关键技术点。

IT 累计浏览 20

Android Perfetto 系列 5:Android App 基于 Choreographer 的渲染流程

Choreographer 是 Android 渲染管线中承上启下的核心协调者,负责配合 Vsync 信号,为上层应用提供稳定的渲染时机,从而确保流畅的帧率输出。当 Vsync 信号到达时,Choreographer 会被唤醒,并按顺序执行 Input、Animation、Traversal(包含 Measure、Layout、Draw)等关键回调,集中处理一帧的所有更新操作。这一机制取代了早期帧与帧之间无间隔处理的模式,避免了因屏幕刷新周期不匹配而导致的帧率不稳和掉帧问题。 现代 Android(Android 12+)在 Choreographer 调度 UI 线程渲染的基础上,引入了 BlastBufferQueue 机制。RenderThread 可以通过 BlastBufferQueue 更独立地向 SurfaceFlinger 提交帧数据,而 UI 线程不必等待 RenderThread 完成当前帧即可开始准备下一帧,进一步减少了主线程的阻塞时间。深入理解 Choreographer 的初始化流程、Vsync 信号接收方式(如通过 BitTube 与 SurfaceFlinger 通信)以及其与 MessageQueue 的交互,有助于开发者从根本上理解每一帧的运行原理,并利用这些机制进行针对性的性能监控与优化。

IT 累计浏览 21

Android Weekly 2025-15 期

本期Android Weekly聚焦于性能优化、架构分析、工具链演进及新兴AI技术在移动端的应用。性能优化领域探讨了多层次策略:从“扁鹊三兄弟”故事出发,强调通过编程范式进行预防性设计;介绍了基于预测模型提升GPU绘制效率的方法;提供了在无法adb连接时通过配置文件抓取开机trace进行性能分析的实战指南;并记录了使用perf工具在线定位死循环bug的处理过程。在架构与源码层面,深入剖析了NowInAndroid项目的模块化与数据流设计,以及MMKV相比SharedPreferences在文件操作和数据格式上实现高性能的原理。工具与语言方面,关注到IntelliJ IDEA 2025.1默认启用K2模式以提升Kotlin处理性能,同时提供了Jetpack Compose的性能优化建议以平衡其便利性与渲染开销。系统层面,分析了Linux异构CPU环境下的Misfit任务迁移调度、Android V应用冷启动的Activity生命周期机制,以及Android 16 Beta 4中需关注的JobScheduler、广播和安全等行为变更。此外,周刊还涵盖了Android副屏录制方案、AI编译器基础设施(MLIR)、GPT4.1模型能力对比,以及自适应流媒体等跨领域技术解析,为开发者提供了广泛的技能更新与技术视野。

IT 累计浏览 18

Android Weekly 2025-16 期

本期内容聚焦Android技术生态的深度实践与前沿探索。系统层面深入剖析了GPU架构互联、eBPF调度器优化、渲染管线优化及内存管理机制,并结合OPPO极光引擎并行绘制、抖音renderD128 OOM疑难排查等实战案例,分享了性能调优与故障定位的深度经验。跨平台领域关注Flutter线程模型重构、TikTok开源框架Lynx的技术特点及Compose Multiplatform iOS稳定版发布。AI辅助开发成为亮点,涉及MCP协议实践、Cursor/Codex等智能编程工具的应用心得,以及大语言模型在编译优化中的新思路。此外,内容还涵盖Binder原理、CFI安全机制、AOSP代码贡献流程、16K页适配等核心知识,整体展现了当前Android开发在系统底层优化、跨平台效率提升与AI工具融合方面的关键动向与解决方案。

IT 累计浏览 15

Android Perfetto 系列 07 - MainThread 和 RenderThread 解读

本文是Android Perfetto性能分析系列的第七篇,聚焦于主线程(MainThread)与渲染线程(RenderThread)的深入解读。文章旨在帮助开发者利用Perfetto工具,精准分析应用渲染流程,定位卡顿与掉帧问题的根源。核心内容阐述了自Android 5.0引入的双线程渲染架构:主线程负责处理用户输入、执行View的测量、布局与绘制准备(构建DisplayList);渲染线程则专注于通过GPU异步执行渲染命令,提升帧生成效率。文章详细剖析了一帧的完整生命周期,从等待Vsync信号唤醒,到主线程处理输入与动画、执行核心的Traversal(测量、布局、绘制)三阶段,再到通过syncAndDrawFrame将DisplayList同步给渲染线程,最终由渲染线程完成GPU渲染并提交帧至SurfaceFlinger进行合成显示。通过对Perfetto trace中关键事件(如UI Thread的performTraversals、RenderThread的drawing与queueBuffer)的识别与解读,开发者能够理解帧渲染各环节的耗时分布,从而有效区分性能瓶颈所在,并掌握软件绘制与硬件加速模式下的不同Trace表现。

IT 累计浏览 17

Android Perfetto 系列 8:深入理解 Vsync 机制与性能分析

Vsync(垂直同步)是Android图形系统的核心同步机制,旨在协调软件渲染与显示硬件的刷新节奏,从根本上解决屏幕撕裂问题。Android的Vsync体系采用分层架构:由硬件Vsync(HW Vsync)提供精确时钟基准,但为省电常采用软件预测;进而派生出驱动应用渲染的Vsync-app和负责图层合成的Vsync-sf,Android 13还新增了vync-appSf以优化同步。在Perfetto中,可通过跟踪vsync-app、vsync-sf及HW_VSYNC的状态变化来分析时序,同时结合应用主线程的Choreographer#doFrame和渲染线程的queueBuffer等切片,可完整观测帧流水线。应用帧的生产严格遵循“申请Vsync-接收信号-执行渲染-提交合成”的流程,其关键约束在于BufferQueue时序与多缓冲机制。通过配置Vsync Offset(如appOffset与sfOffset之差),可以调整应用与SurfaceFlinger接收信号的时间差,将显示延迟从约两个周期缩短至一个周期,显著提升交互跟手性。理解这些机制及其在Trace中的表现,是分析高刷新率设备性能瓶颈的基础。

IT 累计浏览 17

Android Perfetto 系列 (九) - CPU 信息解读

作为Android性能分析系列教程的第九篇,本文聚焦于利用Perfetto工具深入解读CPU信息,以定位性能瓶颈和功耗问题。文章核心在于解析Perfetto UI中三个关键CPU轨道:调度(展示各核心运行线程)、频率(记录核心频率变化)和空闲状态。教程详细阐述了现代异构多核架构(big.LITTLE)的任务分配逻辑,指出需将任务属性与核心类型匹配以判断调度合理性。深度剖析了Linux线程状态,重点区分了Running、Runnable(含三种抢占类型)、Sleep及关键的D(不可中断睡眠)状态的成因与性能影响,并介绍了通过Perfetto可视化唤醒关系链来分析线程依赖的方法。在CPU频率方面,文章解析了影响频率的任务负载、场景策略、温度控制与功耗限制等多重因素,强调频率需结合核心类型和系统约束综合评估。最后,阐述了Linux内核调度器(如EAS)的核心行为:基于任务利用率和能效模型进行选核,以及为进行负载均衡或适应唤醒时变化而发生的核心迁移。整体为读者提供了一套从数据采集、状态解读到调度策略分析的系统性CPU性能分析框架。

IT 累计浏览 2,292

编译 RenderDoc 的安卓 apk(带interceptor-lib)

作者以亲身经历开篇:之前编译过安卓版的RenderDoc,但因未留笔记,再次需要时只能重头再来。这次他想为需要强Hook能力的版本做详细记录,因为核心的interceptor-lib组件依赖一个非常古老的LLVM版本,编译过程颇为繁琐。 文章的核心价值在于点出了一个官方文档中未明说的关键陷阱。尽管流程大体可循——先按指南配置好JDK/SDK/NDK,再克隆interceptor-lib并修改其构建脚本——但在实际使用CMake生成工程时,新版本CMake与Android NDK工具链的交互方式已经变化。直接使用常见的`-DANDROID_TOOLCHAIN=clang`参数实际上无效,导致构建会默认选用无法工作的GCC工具链。 作者给出的解决方法是使用正确的CMake参数:`-DCMAKE_ANDROID_NDK_TOOLCHAIN_VERSION=clang`,并指明了可参考的具体CMake模块文件路径。这个细微的修正,正是避免编译功亏一篑的关键。文章最终明确,遵循此调整后的步骤,即可成功编译出具备强Hook能力的RenderDoc安卓APK。

IT 累计浏览 2,113

关于 Android 系统流畅性的一些思考

这篇讲的是 Android 流畅性问题的多维度分析。作者认为,用户常遇到的“卡顿”并非单纯是系统优化不足,而是硬件、系统、应用三者复杂交互的结果,需要跳出“甩锅系统”的简单思维。 文章从硬件层面展开,详细对比了 CPU 性能、GPU 强弱、内存大小、存储规格(UFS/eMMC)乃至屏幕分辨率和电池容量对流畅体验的直接影响。例如,内存不足会导致系统频繁杀后台与数据交换,造成操作迟滞;而盲目使用 2K 屏也可能在性能不足时拖累流畅度。 系统层面,作者深入剖析了国内厂商对应用管控、内存策略和进程调度的“魔改”逻辑,指出这主要是为了应对国内应用生态的混乱。同时,文章也提到了渲染线程、TripleBuffer 等底层机制如何共同作用,决定了一帧画面能否在 16 毫秒内完成渲染。 整体而言,作者试图为读者建立一个更全面的分析框架:下次遇到手机卡顿时,除了抱怨系统,或许可以想想是某个后台应用在作祟,或是硬件本身已力不从心。这种多角度的审视,有助于更理性地定位问题根源。

IT 累计浏览 2,194

Android 性能优化必知必会

这篇讲的是Android性能优化的全面知识体系与资源导航。作者基于多年一线经验,坦言性能优化牵涉面广、挑战巨大,因此将自己积累的大量优质技术文章和文档汇总成文,旨在帮助新人快速入门,也作为个人知识的梳理与更新。 文章内容扎实,从“优化心得和经验”到“响应速度”等多个维度,系统性地整理了开发者必知的知识点。其中不仅包含Google官方的性能模式课程与开发指南,更汇集了美团、手机淘宝、微信、支付宝等一线大厂的实战复盘,如手淘全链路性能优化、微信内存优化、支付宝启动优化中的垃圾回收处理等深度实践。 此外,文章还提供了诸如Matrix TraceCanary卡顿监控、I/O质量检测、以及基于二进制文件重排的启动优化等具体技术方案的入口。整个资源库持续更新,为从事系统开发与优化的工程师提供了一份清晰的学习地图和问题解决参考。

IT 累计浏览 2,513

Android 中低内存对性能的影响

这篇文章从实际性能问题出发,系统分析了 Android 系统在低内存状态下对整机性能的拖累。作者首先点明了问题背景:随着系统与应用膨胀,4GB 以下设备在日常使用中极易陷入低内存状态,并直观表现为应用启动慢、列表滑动掉帧、设备发热等现象。 文章详细拆解了低内存的数据与行为特征。开发者可以通过 `dumpsys meminfo` 观察到 Free RAM 极低、ZRAM 使用率飙升等关键指标,同时在系统日志中能看到 Low Memory Killer (LMK) 与 kswapd 线程异常活跃,频繁执行内存回收与进程查杀。 更深入的是,作者剖析了低内存导致卡顿的具体机制:内存不足引发磁盘 IO 频繁,会阻塞主线程;内核回收线程 kswapd 会抢占 CPU 资源,与前台应用竞争;而 LMK 激进查杀后台进程,又会触发应用重启,形成 CPU、内存与 IO 资源的恶性循环。文章还涵盖了相关的调试方法与潜在的优化方向。

IT 累计浏览 3,267

如何在毕业三年完成技术跃迁

这篇讲的是在毕业招聘季的宣讲中,作者分享了程序员如何在职业初期实现关键技术跃迁的经验思考。 他借用量子力学“跃迁”的概念,将技术成长描绘成一个从新手到单领域专家的非连续性跳跃过程。作者用一条清晰的曲线指出,大部分程序员会经历一个漫长的“稳定期”进行知识积累,只有当离散的知识点有意识地联结成网,构建起个人的技术知识体系,才能完成向专家的第一次跃迁。 文章以开发一个App登录功能为例,生动展示了具备知识体系的工程师会如何系统性地进行设计:从确立可靠性、安全性的目标,到考虑架构、网络、多线程、存储等层面的具体设计,而非一上来就编码。 对于如何实现跃迁,作者给出了方法论:持续夯实包括操作系统、网络、算法、架构设计在内的基础知识体系,并在项目中积累平台知识,最后通过不断的反思与总结,将点状经验编织成网。对于即将步入职场的工程师而言,这提供了一份清晰而务实的成长路线参考。

IT 累计浏览 2,452

Android应用内存泄露分析、改善经验总结

这篇讲的是作者如何系统性地分析和改善Android应用的内存泄漏问题。他以实际优化案例开头,展示了将应用退出后内存占用从100多M降至20M以内的显著效果,并成功定位了InputMethodManager和MTK WebView中的具体泄漏点。 作者分享了一套行之有效的方法论:首先遵循“数据说话”和“持续改善”的原则。具体步骤上,建议优先用Android Studio的静态分析解决常见泄漏,比如Handler、未关闭的IO资源和Context使用不当等问题。对于更隐蔽的泄漏,则需要借助Leakcanary或adb命令在程序运行后进行监控,并使用MAT工具对内存快照进行深入分析。文章还详细说明了如何验证改善效果,形成闭环。 整篇文章就像一份手把手的排障指南,从原则、具体操作到验证,流程清晰。特别是对使用MAT时的关键注意事项(如关注Retained Size、排除软弱引用)的总结,对于实际解决问题很有参考价值。

IT 累计浏览 2,232

对Android中的多图片异步加载的重新思考

这篇讲的是图片加载策略引发的性能反思。作者从开源中国客户端的一个实际问题出发:早期版本采用多线程并发下载图片,结果在列表加载时,图片反而出现明显的延迟和卡顿,尤其是在网络条件不佳的情况下。 核心发现直觉与效果的悖论:为什么传统观念中能提升资源利用率的并发,在这里却拖了后腿?文章用了一个生动的比喻——如同一个人同时推进两个相似项目,虽然总工时可能缩短,但单个项目完成的周期却被拉长,导致用户感知到的响应变慢了。 作者进一步剖析了 Android 系统本身的演进:在 Android 3.0 之后,AsyncTask 从默认的并发执行改为了串行执行队列。这个看似“退步”的设计,实际上是为了规避高并发下可能引发的资源耗尽与崩溃风险。在图片加载场景中,配合滚动时及时取消无效任务的机制,串行执行不仅更安全,从用户体感上看也避免了任务间的相互“干扰”,使图片能更连贯、流畅地逐张呈现。 这篇技术复盘最终指向一个启发:在移动端资源受限的环境下,技术方案的选择需要超越纸面的性能理论,紧密结合具体的使用场景和用户体验来重新审视。有时,看似“更慢”的串行,反而是通往“更快”感知的路径。

IT 累计浏览 2,761

仿iPhone辅助球实现

这篇讲的是如何在Android上实现一个类似iOS辅助球的悬浮手势菜单。作者从一个很实用的角度出发,复盘了去年完成的一个个人项目,核心要解决的问题就是:如何让一个View脱离Activity,悬浮在所有界面甚至桌面上,并且能自由拖动和响应点击。 文章深入解释了两个关键的技术实现。第一,如何让Service能够显示View。作者厘清了原理,指出在Service中,通过获取系统的WindowManager服务并调用它的addView方法,就能将自定义View添加到屏幕上,从而实现全局悬浮。第二,如何实现手势交互。这里作者采用了更直接的方式,通过为View设置OnTouchListener,实时获取手指的屏幕坐标,并动态更新View的位置参数(Margin),来实现平滑的拖拽效果。 整篇文章从原理分析到核心代码一气呵成。给出的TopFloatService类代码完整展示了如何创建悬浮球、注册触摸事件监听、以及在点击时弹出菜单,思路清晰,对于想实现类似功能的开发者来说,具有很高的参考价值和实操性。