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

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

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


一、启动速度优化

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格式输出。
相关推荐
银空飞羽5 小时前
职型求职工具实测:把简历分析、岗位匹配和定向优化串成一条求职链路
人工智能·经验分享·面试·职场和发展·跳槽·求职招聘·创业创新
三小河6 小时前
AI 对话 "打字机" 是怎么实现的?从 SSE 流式、Markdown 组件到 Nginx 防粘连
前端·人工智能·面试
旺仔不是程序员6 小时前
致命索引失效:索引列运算与函数索引不匹配
数据库·后端·面试
六边形工程师8 小时前
真实调研2500名程序员:工资差一倍,AI拉开分水岭
面试
敲代码的嘎仔9 小时前
28届后端开发-百人小厂面试题
java·后端·面试·程序员·秋招·实习·转正
ocean210310 小时前
2025-2026年Java语言及生态面试高频知识点洞察
java·开发语言·面试
写后端的胖头鱼12 小时前
【高频面试题】面试题里常出现的Bitmap是什么(附源码和多种场景)
java·开发语言·面试·位图·bitmap
怕浪猫21 小时前
长会话不崩盘:DeepSeek Harness 的上下文压缩与目标管理策略
面试·github·agent
ocean21031 天前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
letisgo51 天前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理