利用好模拟器

这个 session 讲了模拟器的一些知识,帮助我们更加好的利用模拟器进行开发。

模拟器是什么

从功能上理解

模拟器让我们能在 MacOS 上模拟 iOS、watchOS 和 tvOS。
相比真实的设备,有更多的内存和 CPU,并且能够同时运行多个。
作为工程师,停留在这个水平显然是不够的。

从技术上理解

Simulator is iOS, watchOS, or tvOS userspace running on macOS kernel

怎么理解这句话呢?
操作系统可以大略分为 kernel 和 userspace。
kernel 处理关于硬件的抽象及内存分配等。
userspace 自底向上可以分为四层:

  • launchd
  • daemons,比如 cfprefsd
  • framworks,比如 UIKit
  • appliacation,比如 photo 应用

每一个模拟器都是这样子一个 userspace。 整体架构如下图:
关于模拟器还有以下事实:

  • macOS 和模拟器共用一套文件系统,但是有不同的 $HOME 路径
  • libSystemUIKit,都使用了模拟系统的 ABI
  • 不是 emulator,因此架构不是 arm,而是 x86
  • 不能模拟 CPU 和 内存
  • 和真实设备相比,有不同的 CPU 核心数,多线程表现也不尽相同
  • 没有沙盒限制。在模拟器上可以在在沙盒外写数据,但是在设备上不可以
  • 和macOS 不同,模拟器的文件系统是大小写敏感的
  • 支持 Thread Sanitizer

模拟器使用的技巧

手势操作

  • 可以利用 option 来模拟 pinch 手势
  • 可以利用 control 来模拟 drag & drop
  • 可以通过 hardware 来手动触发 shake 手势

设置音频输入输出


这样子可以在模拟器放歌曲,在耳机里听歌了。

支持 iCloud 操作

可以登陆 iCloud,也可以手动触发 iCloud 同步。

模拟内存不足

Debug 菜单内,也可以通过键盘快捷键。

模拟器管理

  • 新增  新增模拟器时,可以选择 OS Version 和 Simulator Name。
    如果需要下载其他 runtime 的模拟器,比如 iOS 10,那么需要先下载 runtime。

  • 删除
    可以勾选掉 Show as run destination
    也可以直接删除,通过 delete 按键或者上下文菜单都可以

调整模拟器的 size

有三种预置尺寸可以选择

  1. Physical Size
    把手机放上去,和屏幕上一模一样
  2. Point Accurate
    1 UIKit point = 1 AppKit point
  3. Pixel Accurate
    物理像素一致。模拟器的一个物理像素和电脑的一个物理像素对齐。

此外,还可以使用鼠标缩放模拟器,如同操作普通窗口一样。

可以模拟慢速动画

旧的 Xcode 版本使用新版本的模拟器

其实只要有新版本模拟器的 runtime 就好了

传输内容到模拟器上

可以通过拖拽方式,直接把以下五种类型的数据转移到模拟器上。

  • App bundles
  • Locations: 需要在模拟器和电脑上同时打开 Map
  • Photo/image files
  • Video files
  • URLs: 需要在模拟器和电脑上同时打开 Safari

其他操作

  • 可以模拟位置和运动速度
  • 可以模拟电话进来
  • 可以模拟有外接屏幕
  • 可以设置墙纸
  • 支持语音输入
  • 可以设置键盘,也支持滑动输入
  • 支持 dark mode
  • 可以支持 Siri
  • 可以支持 tvOS

simctl

simtl,其实就是 simulator control,是一个命令行工具,可以用来操作模拟器。

help 命令

可以输入xcrun simctl help 来获取所有帮助信息,也可以输入xcrun simctl help <subcommand> 来获取制定子命令的详细信息,如xcrun simctl help list

list 命令获取列表

输入xcrun simctl list,获取所有模拟器信息,会按照Device TypesRuntimesDevices 来展示所有设备。
list 后可以输入条件来过滤,例子如下

xcrun simctl list devices 'iPhone 8'
== Devices ==
-- iOS 12.2 --
    iPhone 8 (70E73274-90B7-474E-A2C3-A490BE004EEC) (Shutdown)
    iPhone 8 Plus (1C31EE65-6B40-418A-BF83-899AE4F83BCD) (Booted)
-- tvOS 12.2 --
-- watchOS 5.2 --

通过 create 命令创建模拟器

create <name> <device type> <runtime>

通过 lanuch 来启动模拟器上的一个应用

launch <device> <bundle> <arguments>

和用手点击模拟器的图标效果一样

启动和关闭模拟器

分别对应 bootshutdown 命令

clone 模拟器

可以 clone 模拟器中的 App、UserDefaults 等信息。

安装应用到模拟器上

install <device> <example.app>

一些 alias

模拟器的命令,有些需要输入设备名字。有一些别名可以简化这个操作

  • booted 已经被启动的模拟器
  • all 所有模拟器
  • unavailable 对应的运行时已经被删除了的模拟器

一个Demo

Jietu20190613-234707@2x

Metal 和模拟器

新的 macOS 系统上运行的新模拟器支持 Metal 了,这有两层含义:

  1. 模拟器运行在 Metal 上,速度更快了
  2. 在模拟器上可以运行 Metal API了,不必在真机上调试

目前模拟器上 UIKitSpriteKitSceneKitCoreAnimationCoreImageMapKit 都是基于 Metal 的。
Session 里通过几个例子来对比了前后的运行速度,确实快了很多很多。
至于在模拟器上运行 Metal,这个我暂时不会。

导图

Getting the Most Out of Simulato

参考

posted on 2019-06-14 09:13  花老🐯  阅读(585)  评论(0编辑  收藏  举报

导航