Love at First Launch

2019/9/11 posted in  iOS
  • 直接显示内容而不是弹出需要注册登录的页面
  • 通过交互引导用户,而不是一些文字引导
  • 延迟请求授权,而不是一下登录之后就开始要权限(定位,相机,图片)。

针对延迟请求,想到一个好主意,就是新建一个类,可以是单例,负责管理这些请求。

App Startup Time: Past, Present, and Future

了解在苹果平台上使用的dyld动态链接器,它是如何在这些年来发生变化的,以及它下一步的发展方向。了解改进的工具如何使优化应用程序的启动时间变得更容易,并了解dyld中的新更改如何进一步改善启动时间。

  • startup time 启动时间

    main函数执行之前所用的时间

  • launch closure启动收尾

    启动你的程序所需要的全部信息,比如使用什么dylib,他们的哪些偏移位置用于不同的符号,代码签名是什么,

Improving App Startup Time

Do less!

  • Ember fewer dylibs
  • Declear fewer classes/methods
  • Use fewer initializers

减少代码,代码越少,启动速度越快。使用更少的dylib,减少嵌入的dylib,使用系统库效果会更好。应该声明较少的库和方法,减少初始化函数( 初始化函数是在main函数执行之前执行 )。

Use more Swift

  • No initializers
  • Swift size improvements

因为Swift从设计上避免了许多的陷阱,在c、c+++、oc可能遇到这些陷阱。
Swift没有初始化器,不允许特定类型的未对齐的数据结构。所以转向Swift可以让你更容易获得快速的程序启动(Apple says)。

Static initilizer tracing

静态初始化追踪器,instrument提供每个静态初始化器的准确时间。方便知道初始化的过程花费了多久的时间。

屏幕快照 2018-12-11 下午3.33.52

dyld3

为什么推出dylb3

提升速度(启动应用的时候尽量多的减少工程量)
增强安全(更积极的安全检查)
可测试性和可靠性

怎么做到上述目标

  • 速度

    • 把复杂操作dylb移出进程

      • 现在大多数dylb只是普通的后台程序
    • 允许部分dylb驻留在进程之中

      • 减少受攻击面积(驻留部分要尽可能少)
      • 提高启动速度
        • 最快的代码就是你不写代码
        • 关注那些你几乎不执行的代码
  • 安全

    • 确定安全敏感性组件身份

      • 边界检查
      • @rpath 攻击
    • 标识可占用缓存的组件

      • 依赖关系不会改变
      • 符号在库中的偏移位置不会发生改变

屏幕快照 2018-12-11 下午5.36.31

dylb3有三个部分

  • 一个进程外的macho 解析编译器
  • 一个进程内的处理闭包(launch closures)的引擎
  • 一个缓存服务的启动闭包(launch closures)

大多数启动的时候使用缓存不会触发进程外的mach-o parser/compiler
launch closures比mach-o更简单
launch closures为速度而构建

使用dylb3要注意什么

完全兼容dylb2.x

  • 一些apis关闭了dylb3的优化导致程序变慢或者会在dylb3中使用回退模式
  • 一些为dylb2.x的优化不再有任何影响

严格的链接语义
在加入新动态连接器后,很多的语义可能现在还无法使用,甚至是错误的。

  • 放入一个支持旧二进制数据的工作区
  • 新的二进制数据可能导致链接错误