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

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

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


一、启动速度优化

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格式输出。
相关推荐
uhakadotcom15 小时前
基于 TOON + Next.js 来大幅节省 token 并运行大模型
前端·面试·github
野生技术架构师17 小时前
牛客网Java 高频面试题总结(2025最新版)
java·开发语言·面试
王中阳Go17 小时前
又整理了一场真实Golang面试复盘!全是高频坑+加分话术,面试遇到直接抄
后端·面试·go
JavaGuide17 小时前
今年小红书后端开出了炸裂的薪资!
后端·面试
whltaoin21 小时前
【Spring Boot 注解解析】Bean 生命周期注解深度解析:@PostConstruct 与 @PreDestroy 面试高频考点 + 实战案例
java·spring boot·面试·bean生命周期
tkevinjd1 天前
力扣146LRU缓存
面试
南山安1 天前
面试必考点: 深入理解CSS盒子模型
javascript·面试
TimelessHaze1 天前
🧱 一文搞懂盒模型box-sizing:从标准盒到怪异盒的本质区别
前端·css·面试
绝无仅有1 天前
某游戏大厂计算机网络面试问题深度解析(一)
后端·面试·架构