性能稳定性: 一:绘制优化:
好的!以下是对 启动速度优化 和 绘制优化 的精简版本,适合作为面试题的答案,便于记忆和背诵:
一、启动速度优化
1. 冷启动、热启动、温启动
- 冷启动:应用进程不存在,从零启动。过程:点击事件 → Binder → AMS 和 Zygote fork 出新的进程 → process.start → 启动 ActivityThread → 初始化 Application → 生命周期 → 绘制 → 渲染 → 处理 Vsync 信号。
- 热启动:应用进程已存在,直接从后台切换到前台。
- 温启动:应用进程存在,但 Activity 栈被清理,需要重新创建 Activity。
2. 优化方式
- 减少初始化时间 :
- 避免在
Application.onCreate()
和Activity.onCreate()
中执行耗时操作。 - 使用
ViewStub
延迟加载布局。
- 避免在
- 异步初始化:将非关键任务放到子线程中执行。
- 优化布局 :使用
<merge>
减少层级,用ConstraintLayout
替代RelativeLayout
和LinearLayout
。 - 预加载数据 :使用
SharedPreferences
或数据库预先加载必要数据。 - 使用 SplashScreen(Android 12+):优化启动页面显示。
二、绘制优化
1. 绘制流程
- 应用层 :
ViewRootImpl
负责测量、布局和绘制(软件或 GPU 硬件绘制)。 - 系统层 :
WindowManagerService
和SurfaceFlinger
负责渲染。 - 编舞者(Choreographer) :处理
Vsync
信号,每 16ms 触发一次,目标 60 FPS。
2. 卡顿原因
- 绘制耗时 :主线程未及时处理
Vsync
,导致掉帧。 - 布局层级过深:测量和布局时间过长。
- 过度绘制:同一区域多次绘制,浪费 GPU 资源。
3. 优化方式
- 减少层级 :使用
<merge>
和ViewStub
,避免过度嵌套。 - 优化布局 :使用
ConstraintLayout
,复用布局<include>
。 - 优化动画 :优先使用
属性动画
,避免帧动画
和补间动画
。 - 避免过度绘制 :
- 使用
GPU 过度绘制调试
工具。 - 移除不必要的背景设置。
- 使用
- 硬件加速 :确保启用硬件加速,使用
Canvas.clipRect()
减少绘制区域。 - 优化自定义 View :避免在
onDraw()
中创建对象或执行耗时操作。
三、总结
启动优化:
- 减少初始化时间,异步操作,预加载数据。
- 使用
SplashScreen
和ConstraintLayout
优化布局。
绘制优化:
- 减少层级,避免过度绘制,优先使用属性动画。
- 使用
GPU 加速
和Canvas
优化工具。
通过这些方式,可以显著提升应用的启动速度和流畅度,给用户更好的体验。
App 瘦身流程
第一阶段:分析 APK 文件各部分的占比
- 使用Android Studio (AS) 自带的APK Analyzer工具来查看APK文件中各个部分的大小占比。
第二阶段:资源与代码优化
1. 资源优化
-
删除无用资源:
- 使用AS工具的"Refactor"功能中的"Remove Unused Resources"来查找并删除无用的资源文件。
-
资源名混淆:
- 使用工具如ProGuard或R8进行资源名混淆,增强反编译难度的同时也可以减少资源名称占用的空间。
-
图片优化:
- WebP格式:将PNG、JPG等格式的图片转换为WebP格式,利用WebP的更高效压缩节省空间。
- 矢量图SVG:对纯色图片和简单图片使用SVG格式,以减小文件大小。
- 统一出图风格和UI规范:在公司层面指定统一的出图风格和UI规范,以提高开发效率并减少冗余资源。
-
动态资源下载:
- 对于非必要的动态资源(如字体、主题、大型图片等),采用动态下载的方式,减少APK体积。
2. 代码优化
-
代码混淆:
- 使用ProGuard或R8对代码进行混淆,尽可能减少代码的可读性和大小。
-
Lint工具扫描:
- 每周使用Lint工具进行代码扫描,查找并修复无用的代码和警告,优化代码质量。
3. 原生库优化(lib文件夹)
- 忽略冷门架构 :
- 在构建APK时,忽略冷门的CPU架构,如mips、x86_64等,减少APK体积。
第三阶段:融入迭代流程
- CodeReview :
- 将上述瘦身流程纳入每次迭代的CodeReview中,确保每次发布前都有经过瘦身处理。
- 包体积异常处理 :
- 如果出现包体积异常的情况,需针对性处理,并记录处理方法和结果。
- 报告生成与归档 :
- 每次迭代结束后,生成关于包体积的报告,并作为归档文件保存。报告内容包括包体积变化、优化措施执行情况等,使用MarkDown格式输出。