ios进阶-app启动优化(代码片段)

极客学伟 极客学伟     2022-12-14     192

关键词:

iOS进阶 - App启动优化

App启动三个阶段

  • main() 函数执行前
  • main() 函数执行后
  • 首屏渲染完成后

main() 函数执行前

  • 加载可执行文件(App的 .o 文件的集合)
  • 加载动态链接库,进行 rebase 指针调整和 bind 符号绑定
  • Objc 运行时的初始处理,包括 Objc 相关类的注册、category 注册、selector 唯一性检查等
  • 初始化,包括了执行 +load() 方法,attribute(constructor) 修饰的函数的调用、创建 C++ 静态全局变量

相应的在这个阶段可以做的优化包括:

  • 减少动态库加载, Apple 建议使用更少的动态库,并且建议在使用动态库的数量较多时将多个动态库进行合并(最多支持6个)
  • 减少加载启动后不会使用的类或者方法
  • +load() 方法里的内容可以放在首屏渲染完成后再执行,或使用 +intialize() 方法替换掉。
  • 控制 C++ 全局变量的数量
静态库 (.a)

静态库可以看做是一个具有特定功能的代码块,如果app中引用了静态库,则在编译时会将静态库直接复制到app的可执行文件(也就是mach-o)中,使用静态库会导致mach-o文件过大,而mach-o文件直接影响app的启动时间和执行时占用的内存大小。

动态库 (.dylib .framework)

为了减少mach-o文件的大小,需要用到动态库。当app中引用了动态库时,动态库并不会被复制到app的mach-o文件中,只有当动态库真正被用到时,才会去加载(加载到内存中)和链接(动态库可能引用了其他库)动态库,可能是在app启动时或者是运行时。

所有系统库都属于动态库。

main() 函数执行后

指的是从 main() 函数执行开始,到 AppDelegatedidFinishLaunchingWithOptions 方法里首屏渲染相关方法执行完成

  • 首屏初始化所需配置文件的读写操作
  • 首屏列表数据的读取
  • 首屏渲染的大量计算

更加优化的开发方式,应该是从功能上梳理出哪些是首屏渲染必要的初始化功能上梳理出哪些是首屏渲染必要的初始化功能,哪些是App启动必要的初始化功能,而哪些是只需要在对应功能开始使用时才需要的初始化。梳理完之后将其分别放在合适的地方进行。

首屏渲染完成后

主要是非首屏其他业务服务模块的初始化、监听的注册、配置文件的读取等。从函数上来看,这个阶段就是截止到 didFinishLaunchingWithOptions 方法作用域内指定首屏渲染之后的所有方法执行完成。简单说就是从渲染完成时开始,到 didFinishLaunchingWithOptions 方法作用域结束时结束。

功能级别的启动优化

优化思路即:main() 函数开始执行后到首屏渲染完成前只处理首屏相关的业务,其他非首屏业务的初始化、监听、配置文件读取等都放到首屏渲染完成后去做。

方法级别的启动优化

  • 检查首屏渲染完成前主线程上有哪些耗时方法,将没必要的耗时方法滞后或者异步执行。通常,耗时较长的方法主要发生在计算大量数据的情况下,具体的表现就是加载、编辑、存储图片和文件等资源。
  • 减少 +load() 方法自定义次数,使用 +intialize() 方法替换。
  • 若使用 RAC 等响应式框架,注意在首屏渲染之前不要过多的创建信号。

检查App启动速度的两种方法

1. 定时抓取主线程的方法调用堆栈,计算一段时间里各个方法的耗时,Xcode 工具套件里自带的 Time Profiler 采用的就是这种方式

2. 对 objc_msgSend 方法进行 hook 来掌握所有方法的执行耗时

我们知道 OC 的方法最终是通过调用 objc_msgSend 方法实现消息发送,是 OC 方法执行的必经之路。
objc_msgSend 方法 的执行逻辑是: 先获取对象对应类的信息,再获取方法的缓存,根据方法的 selector查找函数指针,经过异常错误处理后,最终跳到对应函数的实现

耗时检查的三方库 GCDFetchFeed 其中的 SMLagMonitor 库,感兴趣可以研读其源码,修炼底层功底。

总结

启动速度优化和监控的重要性不言而喻,加快 App 的启动速度对用户体验提升是最大的。
主要需要开发者对启动阶段功能进行分类整理,合理地将和首屏渲染无关的功能滞后。

极客时间-iOS开发高手课 学习笔记

ios优化-瘦身(代码片段)

...iOS优化将是一个专题,其中会包括包体积优化(瘦身)、启动时间优化、UI优化等等。那么这个专题的开篇就从瘦身开始吧。APP的大小是分为APP下载大小和安装大小两个概念的。下载大小是指App压缩包(也就是.ipa文件)所占的空... 查看详情

app启动优化(代码片段)

APP启动优化我们Android开发永远也摆脱不了性能优化的需求,做的App就是给用户用的,随着功能的增加,App启动功能的丰富。点击启动图标时,我们的App启动会出现一个白屏页面。这个非常影响交互体验。这节我们... 查看详情

android进阶——系统启动之framework核心activititymanagerservice服务启动(代码片段)

文章大纲引言一、ActivitityManagerService概述二、ActivityManagerService体系结构概述1、android.app.IActivityManager2、IActivityManager.Stub/android.app.ActivityManagerNative.java3、android.app.ActivityManagerProxy4、com.andr 查看详情

抖音品质建设-ios启动优化《原理篇》(代码片段)

前言启动是App给用户的第一印象,启动越慢用户流失的概率就越高,良好的启动速度是用户体验不可缺少的一环。启动优化涉及到的知识点非常多面也很广,一篇文章难以包含全部,所以拆分成两部分:原理和实战。本文从基础... 查看详情

android进阶——系统启动之systemserver创建并启动packagemanagerservice服务(代码片段)

文章大纲引言一、PKMS遍历安装系统目录下的App1、Apk的结构2、PackageManagerService#main方法触发App安装流程3、构造PackageManagerService对象3.1、保存应用的安装和运行信息3.1.1、android.server.pm.Settings3.1.2、创建Settings对象备用,接着把... 查看详情

android进阶——系统启动之systemserver创建并启动packagemanagerservice服务(代码片段)

文章大纲引言一、PKMS遍历安装系统目录下的App1、Apk的结构2、PackageManagerService#main方法触发App安装流程3、构造PackageManagerService对象3.1、保存应用的安装和运行信息3.1.1、android.server.pm.Settings3.1.2、创建Settings对象备用,接着把... 查看详情

android进阶——系统启动之systemserver创建并启动packagemanagerservice服务(代码片段)

文章大纲引言一、PKMS遍历安装系统目录下的App1、Apk的结构2、PackageManagerService#main方法触发App安装流程3、构造PackageManagerService对象3.1、保存应用的安装和运行信息3.1.1、android.server.pm.Settings3.1.2、创建Settings对象备用,接着把... 查看详情

支付宝架构解析:ios客户端启动性能优化初探(代码片段)

...解客户端在“容器化框架设计”、“网络优化”、“性能启动优化”、“自动化日志收集”、“RPC组件设计”、“移动应用监控、诊断、定位”等具体实现,带领大家进一步了解支付宝在客户端架构上的迭代与优化历程。启... 查看详情

androidapp性能优化——内存cpu耗电量启动时间指标获取(代码片段)

...获取App的相关性能指标,比如:内存占用、CPU利用率、App启动时间、App耗电量等情况,获取以上各指标后,才能针对性分析确定是否存在优化的可能。最近公司要求对App进行性能优化。考虑到既然是优化性能,那首先要获取App的... 查看详情

android进阶——系统启动之framework核心activititymanagerservice服务启动(代码片段)

文章大纲引言一、ActivitityManagerService概述二、ActivityManagerService体系结构概述1、android.app.IActivityManager2、IActivityManager.Stub/android.app.ActivityManagerNative.java3、android.app.ActivityManagerProxy4、com.android.server.am.ActivityManagerService5、android.app.Acti... 查看详情

支付宝架构解析:ios客户端启动性能优化初探(代码片段)

...解客户端在“容器化框架设计”、“网络优化”、“性能启动优化”、“自动化日志收集”、“RPC组件设计”、“移动应用监控、诊断、定位”等具体实现,带领大家进一步了解支付宝在客户端架构上的迭代与优化历程。启... 查看详情

解决优化app启动页白屏黑屏问题(代码片段)

1、需求:Androidapp 启动时总是黑屏或者白屏1秒钟  产品要去改进体验、于是再启动页添加了新的style配置成功解决问题代码如下:manifest中app 启动页:<activityandroid:name=".WelcomeActivity"android:theme="@s... 查看详情

如何实现iosapp的冷启动优化(代码片段)

...务模块越来越多、越来越复杂,集成了更多的三方库,App启动也会越来越慢,因此我们希望能在业务扩张的同时,保持较优的启动速度,给用户带来良好的使用体验。热启动与冷启动当用户按下home键,iOSApp不会立刻被kill,而是... 查看详情

android项目优化:启动页面优化(代码片段)

一、启动页黑屏的问题1.1问题现象描述AndroidApp启动页面黑屏的问题,现象表现为:Android 开发App 启动时若没有做特殊处理的话,会出现一瞬间的白屏现象。即使启动页界面就加载一个布局,不做其他耗时处理,貌似也会... 查看详情

跨平台应用开发进阶(二十八):资源加载速度优化解决方案(代码片段)

文章目录一、前言二、解决方案三、拓展阅读一、前言uni-app开发APP实现上架后,后续面临一系列优化工作事项,其中,动态图片、视频加载慢就是亟需解决的用户体验差问题。图片加载过程为:调用后台接口࿰... 查看详情

跨平台应用开发进阶(二十八):资源加载速度优化解决方案(代码片段)

文章目录一、前言二、解决方案三、拓展阅读一、前言uni-app开发APP实现上架后,后续面临一系列优化工作事项,其中,动态图片、视频加载慢就是亟需解决的用户体验差问题。图片加载过程为:调用后台接口࿰... 查看详情

android性能优化之启动速度优化(代码片段)

前言:文本主要会介绍三大块:1.简略介绍APP启动的完整流程,对整个流程有所了解,才知道在哪里可以进行优化。2.一些常用的APP启动优化的方案,主要分为三大块优化方向。3.一些不常见的APP启动优化的方... 查看详情

ios符号化:基础与进阶(代码片段)

作者:米广,有赞iOS开发,喜欢折腾,微信订阅号:剁手指北,bilibili频道:yz06276审核:五子棋,老司机技术周报编辑,主要致力于研究一站式机器学习平台—MNN工作台,大家可以前往www.mnn.zone下载Damonwong,iOS开发,老司机技术... 查看详情