背景
从产品层面看,为服务更多用户,满足更多用户需求不断迭代,对现有应用的架构势必会带来一定的挑战。如何在满足需求的同时,兼顾质量、稳定、体验、效率,这就需要开发侧通过技术手段做出改进和优化
目标
- 提高产品质量
- 快速响应需求
- 提高开发效率
- 提升用户体验
方案介绍
- 移除无用资源
-- 工具扫描 - Asset Catalog 管理图片,PNG → HEIC
-- 使用官方优化方案 - 资源文件压缩
-- 配置文件精简
-- 图片压缩,TinyPNG - 资源文件远程化
-- 自建配置服务
-- 官方 ODR(On-Demand Resources) - 简单纯色图片使用 iconfont 代替
-- 支持不同配色
-- 矢量图
-- 平均5个 item 大约占用 1 KB - 使用 lottie 代码常规 GIF,难以替换的走远程配置或使用 APNG、WebP 格式
-- GIF 图片 → JSON
-- 渲染更流畅,视觉效果更好
代码优化
这部分 ROI 较低,且影响面较大,一般在项目中检索范围如下:
- 无用代码
-- 无用类
-- 无用方法
-- 重复代码
-- ABTest固化 - 过期业务
常见方案: - 工具静态扫描
- 线上代码覆盖率检测
- 排期业务下线需求
编译器优化
主要是通过设置 Xcode 编译配置,取得编译方面的优化收益,常见设置有:
- GCC_OPTIMIZATION_LEVEL => Oz # 编译产物优先体积最小
- SWIFT_OPTIMIZATION_LEVEL => Oz # 编译产物优先体积最小
- SWIFT_COMPILATION_MODE => Whole Module # 总是全量编译以确保 swift 文件优化最大化
- LLVM_LTO => Incremental # 编译阶段做更多的优化
- COPY_PHASE_STRIP => YES # 编译阶段 Copy 资源或文件时,去除调试符号
- DEPLOYMENT_POSTPROCESSING => YES # 去除符号,重置文件信息
- STRIP_INSTALLED_PRODUCT => YES # 去除符号,搭配 DEPLOYMENT_POSTPROCESSING 使用
- ASSETCATALOG_COMPILER_OPTIMIZATION => space # 压缩算法优先减少 Assets.car 体积
防劣化建设
- 基于 Linkmap 和 Mach-O 文件,搭建体积检测卡口
- 迭代版本的增量走势监控
- 定期代码整理、优化,持续投入
APM监控
- 应用启动时长
-- 中位数,均值,极值
-- 版本,机型 - 页面加载耗时
-- 中位数,均值,极值
-- 版本,机型
-- 关联业务 - 卡顿率
-- 中位数,均值,极值
-- 版本,机型
-- 关联业务 - 内存用量
-- 中位数,均值,极值
-- 内存告警次数
-- 关联业务 - 版本,机型
- CPU占用
-- 中位数,均值,极值
-- 关联业务
-- 版本,机型 - 网络信息
-- 网络类型
-- 阶段耗时,中位数,均值,极值
-- 关联业务
-- 版本,机型 - 线程统计
-- 中位数,均值,极值
-- 关联业务
-- 版本,机型 - abort率
-- 中位数,均值,极值
-- 关联业务
-- 版本,机型
组件化
按优先级属于重要不紧急的事项,前期需要有较多投入,一般选用 Cocoapod 配合私有仓库搭建基础结构
核心价值:
- 原子化产品能力,组件复用性高,可以更灵活的应对需求变化
- 极大的提升产品维护性,提高迭代效率
- 可以提升 App 稳定性
工具链
开发侧沉淀一套工具集合,用于辅助解决各类开发问题、测试问题、产品问题等
核心价值:
- 提升研发效率,测试效率
CI/CD
研发视角的CI/CD流程如下,目标是建设流水线化、高度自动化的高效开发交付流程
CICD
核心价值:
- 提升研发测试效率
- 标准化研发流程,提升产品质量,降低发布风险
代码质量
提交卡口
- 建立代码准入的基本标准,代码风格、重复代码、编写错误等等
- 增加自动化单测运行检测,初步排查准入代码是否影响已有业务
- 增加包体积变化检测手段,防止包体积无限制增长
核心价值: - 建立规范和标准,减少人为因素带来的理解和沟通成本
- 增加质量检测关卡,促进代码质量提升
- 建立代码和产物的防劣化机制,延缓工程的熵增趋势
单元测试
所谓测试驱动开发(TDD,Test Driven Development),在iOS研发角度理解,也可以理解为单元测试驱动开发(UTDD,Unit Test Driven Development),一般使用 XCTest + 开源框架实现。
核心价值:
- 提升产品质量和稳定性
- 减少测试资源压力
- 提升开发人员的质量意识和程序设计能力
自动化
每次提交都会运行,用于检测代码对现有业务的影响,同时关键业务执行功能巡航,执行单测
定时任务
每天运行,运行全工程单测,生成单测报告及通知开发测试群
代码扫描
- 可以初步排查因代码书写可能导致的野指针、内存泄露等问题
- 可以规范开发人员编码,保证风格接近,便于阅读
代码评审
- 千行评论数 x
- 代码评审率 xx %
产品设计
建立可持续跟进的 design space,涵盖有字体、颜色、控件、动画、交互等,开发侧对应维护一套组件库,按照版本节奏升级和迭代,改动可追踪。
交互验收标准
- 视觉还原度
- 交互还原度
- 功能完整度
- 使用体验
表格
任务块 | 分解 |
---|---|
包大小 | 图片压缩工具 |
图片远程化 | |
iconfont | |
lottie | |
删除无效图片 | |
图片压缩 | |
资源OSS远程化 | |
工程设置配置化 | |
包体积检测工具 | |
APP监控 | POC方案 |
灰度&上线 | |
工程改造 | LocalHotReloading |
CICD | |
工具链 | DebugRing,集成Flex,设备信息,性能面板,功能巡检 |
组件化 | |
单测 | |
代码扫描 | |
Swift | OC->Swift |
设计与规范 |