业务稳定性和性能稳定性做的工作

性能稳定性: 一:绘制优化:

好的!以下是对 启动速度优化 和 绘制优化 的精简版本,适合作为面试题的答案,便于记忆和背诵:


一、启动速度优化

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. 资源优化

  1. 删除无用资源:

    • 使用AS工具的"Refactor"功能中的"Remove Unused Resources"来查找并删除无用的资源文件。
  2. 资源名混淆:

    • 使用工具如ProGuard或R8进行资源名混淆,增强反编译难度的同时也可以减少资源名称占用的空间。
  3. 图片优化:

    • WebP格式:将PNG、JPG等格式的图片转换为WebP格式,利用WebP的更高效压缩节省空间。
    • 矢量图SVG:对纯色图片和简单图片使用SVG格式,以减小文件大小。
    • 统一出图风格和UI规范:在公司层面指定统一的出图风格和UI规范,以提高开发效率并减少冗余资源。
  4. 动态资源下载:

    • 对于非必要的动态资源(如字体、主题、大型图片等),采用动态下载的方式,减少APK体积。

2. 代码优化

  1. 代码混淆:

    • 使用ProGuard或R8对代码进行混淆,尽可能减少代码的可读性和大小。
  2. Lint工具扫描:

    • 每周使用Lint工具进行代码扫描,查找并修复无用的代码和警告,优化代码质量。

3. 原生库优化(lib文件夹)

  1. 忽略冷门架构 :
    • 在构建APK时,忽略冷门的CPU架构,如mips、x86_64等,减少APK体积。

第三阶段:融入迭代流程

  • CodeReview :
    • 将上述瘦身流程纳入每次迭代的CodeReview中,确保每次发布前都有经过瘦身处理。
  • 包体积异常处理 :
    • 如果出现包体积异常的情况,需针对性处理,并记录处理方法和结果。
  • 报告生成与归档 :
    • 每次迭代结束后,生成关于包体积的报告,并作为归档文件保存。报告内容包括包体积变化、优化措施执行情况等,使用MarkDown格式输出。
相关推荐
怕浪猫9 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试
Interview Aid11216 小时前
OpenAI SWE 面试流程
面试·职场和发展
飘尘17 小时前
SVG和Canvas,前端里的两支“画笔”,用的时候怎么选择?
前端·javascript·面试
飘尘17 小时前
从"算子"到"AI Infra":大模型背后看不见的那群人在忙什么
人工智能·算法·面试
ShineWinsu17 小时前
对于Redis:主从复制的解析
linux·数据库·c++·redis·缓存·面试·主从复制
ShineWinsu20 小时前
对于Redis:事务的解析
数据库·redis·mysql·缓存·面试·事务·acid
考研保研资料分享1 天前
电子信息保研经验合辑:复旦直博与北邮集成电路,夏令营、预推免和专业面试
数学建模·面试·职场和发展·信息与通信
(Charon)1 天前
【C++面试】堆内存与栈内存:string、vector和对象到底存在哪里
开发语言·c++·面试
lcj25111 天前
【Linux】 Makefile 详解
linux·笔记·面试
(Charon)1 天前
【C++面试】迭代器失效是什么?vector、list、map中如何避免迭代器失效
c++·算法·面试