EN

Android Performance

闻道有先后,术业有专攻,如是而已

loading
Android性能优化后续

前言

本文是一篇译文,原文Android Performance Case Study Follow-up的作者是大名鼎鼎的Romain Guy。本文讲述了Android性能优化的一些技巧、方法和工具。

技术复核(2026-10-13):保留 2015 年 Falcon Pro 3 / Moto X 2014 的历史案例,以下第一人称属于原作者。Tracer for OpenGL ES、Hierarchy Viewer 所在的 Android Device Monitor 已在 Android Studio 3.1 弃用、3.2 移除;旧工具步骤标为历史内容,文末补充 Android 12+ 的 Perfetto 分析入口。原站链接本次未能重新读取,技术修订依据文中列出的官方资料和版本化源码。

译文正文

两年前,我发表了一篇名为Android Performance Case Study 的文章,来帮助Android开发者了解需要使用什么工具和技术手段来确定、追踪和优化性能问题。

那篇文章以一个Twitter客户端 Falcon Pro为典范,其开发人员为 Joaquim Vergès. Joaquim人不错,他允许我在我的文章中使用它的程序作为例子,并且快速处理了我发现的所有问题。一切都OK,直到Joaquim 从头开始开发Falcon Pro 3,前不久在他准备发布它的新应用的时候,他联系了我,因为他有一个和滚动相关的性能问题需要我来帮助他,这一次我依然没有源代码可以参考。

Android 小技巧 - 5

本文是一篇译文,这篇是这个系列的第五篇.讲述的是Android开发中遇到的一些好用的小技巧,或者一些实用的API,很多人都知道,但也有人不知道,记录下来,如果能帮助到大家,也是极好的.由于不是严格的博文,所以翻译也不那么严格,有些工具和类我也会经常用,所以我会根据自己的想法去写.有些地方作者并没有将这个工具的作用讲出来,我会补充上去.

技术复核(2026-10-13):原文发表于 2014 年,本译文发表于 2015 年。旧 Support Library 链接改为 AndroidX;外部存储、缩略图和应用语言补充新版本用法。清除应用数据和数据库让出事务的副作用也在对应条目中明确说明。

Android 小技巧 - 4

本文是一篇译文,这篇是这个系列的第四篇.讲述的是Android开发中遇到的一些好用的小技巧,或者一些实用的API,很多人都知道,但也有人不知道,记录下来,如果能帮助到大家,也是极好的.由于不是严格的博文,所以翻译也不那么严格,有些工具和类我也会经常用,所以我会根据自己的想法去写.有些地方作者并没有将这个工具的作用讲出来,我会补充上去.

技术复核(2026-10-13):这些 View/XML API 大多仍可用,但原文关于配置变化、裁剪和文件原子性的说明需要修正。Gradle 3.0 起默认启用 Daemon;AtomicFile 的实现则以下面的 Android 4.4.4 与 Android 16 源码对照说明。

Android 小技巧 -3

本文是一篇译文,这篇是这个系列的第三篇.讲述的是Android开发中遇到的一些好用的小技巧,或者一些实用的API,很多人都知道,但也有人不知道,记录下来,如果能帮助到大家,也是极好的.由于不是严格的博文,所以翻译也不那么严格,有些工具和类我也会经常用,所以我会根据自己的想法去写.有些地方作者并没有将这个工具的作用讲出来,我会补充上去.

技术复核(2026-10-13):原文发表于 2014 年,本译文发表于 2015 年。平台 android.app.Fragment 在 API 28 弃用,下面的 Fragment 建议改用 AndroidX;LocalBroadcastManager 与 Otto 已停止维护。其余条目保留原顺序,并补充 API 版本和使用边界。

为 Nexus 5 编译 Android Lollipop 固件

技术复核(2026-10-13):这是一篇 Nexus 5 / Android Lollipop 的历史教程,设备与工具链已过期。文中的 LRX22C 二进制对应 **Android 5.0.1 / AOSP android-5.0.1_r1**,下文据此明确源码、驱动和刷机条件。新学习环境另补 Android 16 Cuttlefish 示例;不要把新版本的构建命令与旧真机固件混用。

接前一篇文章使用Android Studio查看Android Lollipop源码, 我们知道,仅仅看代码,提高是比较有限的,而且理解起来也比较肤浅,往往过目就忘. 而自己写过的代码,往往会印象比较深刻,在写的时候也会比较容易理解流程. 所以我们在看代码的同时, 如果能修改代码, 在手机上跑起来并看到修改的效果,这无疑会加快看代码的效率和积极性. 所以这篇文章,就讲解一下如何自己编译AndroidL的源码,并且在Nexus5上跑起来. 至于为何需要自己编译固件,而不是直接安装 Google 给出的工厂固件?这里的目的是获得便于平台调试的 userdebug 构建。user 版本限制 ADB root 等调试能力;userdebug 支持更多调试操作,但并不等于任意分区都能不受限制地写入。

本文假设你已准备好版本一致的 Lollipop 源码和一台 Nexus 5。环境可参考 旧版本 AOSP 构建说明和源码下载说明。Android 5.x 在 Linux 上使用 OpenJDK 7;旧系统与依赖应放在专门的历史构建环境中,不能直接作为当前开发机的安装建议。如果访问官方文档或下载源码不顺畅,需要先处理网络与源码获取环境。

AOSP 是 Android Open Source Project,即 Android 开源项目。它包含平台和开源应用,不包含 Google Mobile Services(GMS)这组专有应用与服务。厂商二进制、GMS 授权和 Android 兼容性是不同问题:满足 CDD 并通过 CTS 是兼容性要求,不等于自动获得 GMS。具体要求可以参见 Android 兼容性说明。

Android 性能优化之 Systrace 工具介绍(一)

技术复核(2026-10-13):本文原写于 2015 年。Systrace 的事件时间线仍有参考价值,Eclipse / Device Monitor 入口已过期;旧脚本参数以下文核对的 AOSP android-5.0.0_r1 为准。新增命令以 Android 11 / API 30 及以上的 Perfetto 为例,旧系统差异另列。后续文章见 Android Perfetto 系列目录。

旧流程 现在的对应方式
Eclipse / Device Monitor 的 Systrace 按钮 Android 9 / API 28 起可用设备端 System Tracing;也可通过 ADB 采集
systrace.py 调用 atrace 并生成 HTML Perfetto 采集命令生成二进制 trace;具体事件由类别或配置文件决定
浏览器直接打开旧 HTML 使用 Perfetto UI 导入 trace,也可用 Trace Processor 做 SQL 分析
把 user 构建理解为不能采集 user 构建可以采集系统 trace;可见数据取决于系统、数据源、应用配置与厂商策略

本文是Android性能优化工具系列的第一篇,这个系列主要介绍Android性能优化过程中会使用到的一些工具,以及如何用这些工具来发现问题和解决问题。在性能优化方面,Android有不少性能工具供大家来使用,按照我们一贯地 “发现问题-解决问题”的思路来看,发现问题才是最主要的,一上来就想着如何去解决问题,反而会事倍功半。

这一篇先来简单介绍一下Systrace这个工具。

Systrace 简单介绍

Systrace 随 Android 4.1 / SDK Tools R20 推出,是系统事件跟踪与可视化工具。它把 CPU 调度、SurfaceFlinger、WindowManager、View 等已启用的事件放到同一条时间线上,帮助开发者寻找系统行为之间的关系。它不会自动采样每一个 Java 方法,也不等于完整调用栈分析器。当年的 SDK Tools R20 公告

旧流程主要由三部分组成:

  • 内核事件:依赖内核已启用的 ftrace 功能和可访问的事件。调度、I/O、频率等类别的可用性要在设备上确认。
  • 用户态标记与采集:系统组件通过 ATrace 写入标记,atrace 配置类别并读取跟踪数据。应用添加自己的区间可使用 android.os.Trace.beginSection() / endSection();这组公开 API 从 Android 4.3 / API 18 才提供,不是从 Android 4.1 就能直接调用。
  • 主机端报告:旧 systrace.py 通过 ADB 调用设备的 atrace,处理数据并生成带查看器的 HTML。采集已有系统事件不要求先修改应用代码;只有自定义业务区间需要相应埋点。

当前 Perfetto 还能接入更多数据源,不能把它的全部功能概括为 ftrace 封装。android.os.Trace 的标记仍可被 Perfetto 读取,接口说明见 Trace 和 Perfetto ATrace 文档。

使用 Android Studio 查看 Android Lollipop 源码

技术复核(2026-10-13):原文面向 Android 5.0 Lollipop 与 Android Studio 1.x。下面的 IDEGen 流程已按 AOSP android-5.0.0_r1 源码核对,属于历史方案;新增的 AIDEGen 示例以 android-16.0.0_r1 文档为准。

Android Studio

作为Google的亲儿子,Nexus手机系列所收到的待遇大家有目共睹.Android5.0出来之后,Nexus5第一时间就升级到了最新的系统.那么作为Google亲儿子的Android Studio同样备受Google的重视,我也是第一时间从Eclipse转投到了Android Studio的怀抱中,从最初的测试版本一路升级到现在的1.0正式版本.

Android 性能优化之过度绘制 - 实战篇

前言

上一篇文章从理论的角度讲解了一下什么是过度绘制,以及可以用来查看和确认过度绘制的工具,还提供了一些优化过度绘制的方法。对代码和布局比较熟悉的人,看完上一篇其实就已经可以对自己的应用进行优化了。我记得有人说过,用iphone你只需要保证苹果有节操即可,用Android你就得保证所有的Android开发者都有节操。但现实是残酷的,现在Android市场上,有很多粗制滥造的应用,其中不乏大厂之作,各位打开过度绘制按钮,就知道我所言非虚。作为一个Android开发人员,我肯定是更希望Android能一步一步好起来,超越iphone。

这篇文章从实战的角度,讲解了一个过度绘制的优化过程。当然这里用到的只是很少的一部分,毕竟每个应用差别很大,优化方式也各不一样。所以这篇文章仅供参考,想把这块做好还是要下功夫的。

如果没有看过前一篇,可以点这里:Android性能优化之过度绘制(一)


Android 性能优化之过度绘制 - 理论篇

2026-10-13 更新:本文原写于 2014 年,源码节选已对照 AOSP android-4.4.4_r2。Overdraw 的概念仍适用,ADT、monitor、Hierarchy Viewer 和旧 OpenGL 跟踪入口已过时;Android Studio 3.1 起改用 Layout Inspector 查看层级,帧时序使用 Perfetto。下文保留历史源码,并补充 Android 12 / Android 16 的对应边界。

博客有一段时间没有更新了,到了新公司后,一直比较忙,博客也更新地不那么频繁了。最近一直在看Android上和性能相关的部分,也就是所谓的Android性能优化,才发现Android性能这一块,自己懂得还是太少了,所以从上层开始看,也算是一点一点入门吧。这个系列将讲解学习过程中总结的和性能相关的内容。

先讲讲 GPU 过度绘制,也是开发者最直接接触的部分吧。这个内容分两篇来讲:第一篇讲原理和一些优化建议,第二篇用实际例子来看一般的优化步骤。

过度绘制概念

GPU 过度绘制(Overdraw)指同一帧内,一个像素被绘制多次。例如 TextView 先画背景再画文字,文字覆盖到的像素就可能参与两次绘制。多余的像素着色、混合和内存访问会消耗资源,但是否造成掉帧,取决于绘制面积、透明度、GPU 能力以及这一帧的其他工作,不能仅凭颜色数量判断。Android 过度绘制说明

Android 小技巧 - 如何让EditText不自动获取焦点

2026-10-13 核查:这个方法适用于传统 Android View 布局,所用焦点属性从 API 1 起可用,仍然有效。但输入焦点和软键盘可见性是两个状态,不能保证加上两个属性后键盘在所有场景都不弹出。

Android中,使用EditText作为输入框很方便,但是有时候EditText会自动获取焦点,其行为:点击进入这个页面后,EditText自动获取焦点,导致软键盘直接跳出.有时候这么做很方便,但是大部分时候我们还是希望在点击EditText的时候,软键盘才弹出来.

Android 小技巧 -2

2026-10-13 核查:本文是 2014 年的 View/系统工具 API 清单。Activity.onBackPressed() 从 API 33 废弃,文字布局应优先使用 API 23 起的 Builder;下面补充替代方式,并修正闹钟、应用内存和屏幕密度的解释。

本文是一篇译文,这篇是这个系列的第二篇.讲述的是Android开发中遇到的一些好用的小技巧,或者一些实用的API,很多人都知道,但也有人不知道,记录下来,如果能帮助到大家,也是极好的.由于不是严格的博文,所以翻译也不那么严格,有些工具和类我也会经常用,所以我会根据自己的想法去写.有些地方作者并没有将这个工具的作用讲出来,我会补充上去.

Android 小技巧 - 1

2026-10-13 核查:这份清单原写于 2014 年,主要面向 Android View 系统。多数 API 仍然有效;旧版 Html.fromHtml(String) 从 API 24 废弃,下面补充替代签名,并修正缓存目录、布局加载和动画反向播放的说明。

本文是一篇译文,这篇是这个系列的第一篇.讲述的是Android开发中遇到的一些好用的小技巧,或者一些实用的API,很多人都知道,但也有人不知道,记录下来,如果能帮助到大家,也是极好的.由于不是严格的博文,所以翻译也不那么严格,有些工具和类我也会经常用,所以我会根据自己的想法去写.有些地方作者并没有将这个工具的作用讲出来,我会补充上去.

Android Tools - Log2File

2026-10-13 更新:2014 年版本直接向外部存储根目录写文件,这种用法已过时。Android 10(API 29)引入分区存储,Android 11(API 30)对 targetSdk 30 及以上应用忽略 requestLegacyExternalStorage。下面改用应用内部目录,示例最低版本为 Android 4.4(API 19),不需要存储权限。Android 11 存储变化

Log2File 工具类用于 Android 程序把应用主动记录的日志写入文件,适合下面这些场景:

  1. 无法连接电脑进行调试,例如 USB 口被 OTG 设备占用。
  2. 日志不容易实时抓取。
  3. Bug 出现很随机,需要保留操作过程中的记录。
  4. 其他自己脑补。

它只保存传给 w() 的内容,不会自动读取系统 logcat;系统日志抓取仍使用 Logcat 工具。

0.说明

这篇文章最早发布在我的 CSDN 博客,后来迁移到这里。原 GitHub 源码地址在本次更新时返回 404,因此下面直接保留可阅读的替代实现。

Android Service:开发自己的通知中心(2):辅助性服务实战

2026-10-13 更新:本文记录的是 Android 4.3 之前通过无障碍事件观察通知的旧方案,这条通用通知中心实现路线已过时。Android 4.3(API 18)起提供专门的 NotificationListenerService,第 4 节补充 Android 7.0(API 24)及以上的最小监听示例。旧代码仅用于理解历史实现,不保证取得完整通知列表。

1.辅助性服务实战介绍

上一篇文章介绍了什么是 Accessibility 以及简单的使用,这一篇文章就来讲讲如何使用Accessibility服务来创建一个简单的Android通知中心。Android中通知中心是一个系统层面的服务,负责显示应用和系统发来的通知(Notification,比如USB插入、选择输入法、未接来电、截图、天气信息、新闻推送等等)。在android4.3之前,一般的第三方应用是无法获取Notification list的(在Android4.3之后,有了一个新的接口,NotificationListenerService.getActiveNotifications(),可以获取当前的Notification)。但是利用Accessibility服务可以监听到各种事件的特性,可以开发一个第三方的通知中心,实现与系统通知栏类似的功能。

Android:Ubuntu 下执行 Adb 命令找不到设备

这篇写于 2014 年,当时用的是 Nokia X 和旧版 Android SDK。2026-10-13 更新了 Ubuntu 24.04 LTS 下的 udev 和用户组配置;旧 SYSFS 规则、Upstart 重启方式已经不适用,adb_usb.ini 的办法留在文末作历史记录。

1.问题概述

最近开发Nokia项目,遇到的问题如下:

插入Nokia x后,电脑没有反应,即不识别,同事的windows也不识别,最后在谷歌上搜索了良久,才找到了解决方案,但是没有记录,后来又要给别人配置的时候,发现忘记怎么配置了。想想这也是一个具有通性的问题,还是记录下来,分享给大家。

2.问题解决方案

先在设备上开启 USB 调试,并使用支持数据传输的 USB 线。用 adb version 确认调用的 Platform-Tools 版本,再运行 adb devices -l 查看设备状态。

  • 列表为空:检查线缆、接口、USB 调试开关,以及主机是否枚举到设备。
  • no permissions:优先检查 Linux 的 udev 规则和当前用户组。
  • unauthorized:设备已经被发现,解锁设备并确认 RSA 调试授权弹窗。
  • offline:设备未正常响应 ADB;重新插拔或重启 ADB 后再观察。

USB 枚举、主机访问权限和设备授权是不同环节。具体连接与状态说明参见 ADB 文档和设备连接指南。