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

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

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


一、启动速度优化

1. 冷启动、热启动、温启动
  • 冷启动:应用进程不存在,从零启动。过程:点击事件 → Binder → AMS 和 Zygote fork 出新的进程 → process.start → 启动 ActivityThread → 初始化 Application → 生命周期 → 绘制 → 渲染 → 处理 Vsync 信号。
  • 热启动:应用进程已存在,直接从后台切换到前台。
  • 温启动:应用进程存在,但 Activity 栈被清理,需要重新创建 Activity。
2. 优化方式
  • 减少初始化时间
    • 避免在 Application.onCreate()Activity.onCreate() 中执行耗时操作。
    • 使用 ViewStub 延迟加载布局。
  • 异步初始化:将非关键任务放到子线程中执行。
  • 优化布局 :使用 <merge> 减少层级,用 ConstraintLayout 替代 RelativeLayoutLinearLayout
  • 预加载数据 :使用 SharedPreferences 或数据库预先加载必要数据。
  • 使用 SplashScreen(Android 12+):优化启动页面显示。

二、绘制优化

1. 绘制流程
  • 应用层ViewRootImpl 负责测量、布局和绘制(软件或 GPU 硬件绘制)。
  • 系统层WindowManagerServiceSurfaceFlinger 负责渲染。
  • 编舞者(Choreographer) :处理 Vsync 信号,每 16ms 触发一次,目标 60 FPS。
2. 卡顿原因
  • 绘制耗时 :主线程未及时处理 Vsync,导致掉帧。
  • 布局层级过深:测量和布局时间过长。
  • 过度绘制:同一区域多次绘制,浪费 GPU 资源。
3. 优化方式
  • 减少层级 :使用 <merge>ViewStub,避免过度嵌套。
  • 优化布局 :使用 ConstraintLayout,复用布局 <include>
  • 优化动画 :优先使用 属性动画,避免 帧动画补间动画
  • 避免过度绘制
    • 使用 GPU 过度绘制调试 工具。
    • 移除不必要的背景设置。
  • 硬件加速 :确保启用硬件加速,使用 Canvas.clipRect() 减少绘制区域。
  • 优化自定义 View :避免在 onDraw() 中创建对象或执行耗时操作。

三、总结

启动优化:
  • 减少初始化时间,异步操作,预加载数据。
  • 使用 SplashScreenConstraintLayout 优化布局。
绘制优化:
  • 减少层级,避免过度绘制,优先使用属性动画。
  • 使用 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格式输出。
相关推荐
甜瓜看代码2 小时前
安卓页面绘制流程
面试
小高0074 小时前
前端 Class 不是花架子!3 个大厂常用场景,告诉你它有多实用
前端·javascript·面试
uhakadotcom5 小时前
什么是OpenTelemetry?
后端·面试·github
没有鸡汤吃不下饭5 小时前
前端【数据类型】 No.1 Javascript的数据类型与区别
前端·javascript·面试
知其然亦知其所以然5 小时前
MySQL 社招必考题:如何优化特定类型的查询语句?
后端·mysql·面试
汤姆Tom5 小时前
从零到精通:现代原子化 CSS 工具链完全攻略 | PostCSS × UnoCSS × TailwindCSS 深度实战
前端·css·面试
QZQ541888 小时前
高性能现代CPP--CRTP(奇异递归模板模式)
面试
甜瓜看代码9 小时前
Handler机制的深入解析
面试
无限大69 小时前
HTTP 1.0去哪了?揭开Web协议版本误解的真相
后端·面试