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

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

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


一、启动速度优化

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格式输出。
相关推荐
java1234_小锋1 小时前
Java高频面试题:Springboot的自动配置原理?
java·spring boot·面试
xiaoye37082 小时前
Spring 中高级面试题
spring·面试
前端大波4 小时前
前端面试通关包(2026版,完整版)
前端·面试·职场和发展
walking9576 小时前
Vue3 日历组件选型指南:五大主流方案深度解析
前端·vue.js·面试
MgArcher9 小时前
Python高级特性:高阶函数完全指南
后端·面试
何陋轩9 小时前
Redis深度解析:把缓存核心讲透,吊打面试官
redis·面试
深蓝轨迹9 小时前
面试常见的jdk---LTS版本新特性梳理
java·面试·jdk
sbjdhjd10 小时前
Docker | 核心概念科普 + 保姆级部署
linux·运维·服务器·docker·云原生·面试·eureka
蓝色的杯子12 小时前
Python面试30分钟突击掌握-LeetCode1-Array
开发语言·python·面试
不爱吃炸鸡柳12 小时前
6道经典算法题详解:从排序到链表,覆盖面试高频考点
算法·链表·面试