brendon
(面包)
1
如何在Xcode模拟器中测试Tweak (2)
- 上一篇简单演示了如何使用simject加载Tweak也就是dylib至模拟器中,本篇将介绍我个人对Library和各种Bundle(Preferences Bundle, Control Center Module, Framework, …)的处理方式
踩坑记录
-
太长不看
- 很大一部分Tweak都配有Preferences Bundle以供用户进行偏好设置。Preference Bundle 能显示在Preferences.app中是因为有PreferenceLoader这个Tweak去加载第三方Preference Bundle。simject的贡献者之一PoomSmart也很贴心地为我们提供了PreferenceLoader的模拟器版本fork。
那么有了PreferenceLoader-sim,是不是直接make setup PL_SIMULATOR_VERSION=XXX
安装即可呢?
- 不,细心之人会发现这里多了一个PL_SIMULATOR_VERSION,没错,从这里开始便麻烦不断了
- 不同iOS版本的模拟器具有不同的binary,也就是不同的
RuntimeRoot
,如果我们需要安装library到模拟器中,似乎不能像Tweak一样统一安装到/opt/simject里,因此需要指定一个iOS版本
- 坑点1
- Xcode 9之后,自带模拟器和额外下载模拟器的路径不一样
- 这会导致,如果你使用目前最新commit的PreferenceLoader-sim,你将无法安装至Xcode自带模拟器中。
- 坑点2
- Xcode 11之后,自带模拟器的路径由
/Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/...
变成了/Contents/Developer/Platforms/iPhoneOS.platform/Library/Developer/...
- 这会导致,即使你使用倒数第二新commit的PreferenceLoader-sim,你也无法安装至Xcode11之后的自带模拟器中
- 坑点3
- 除了PreferenceLoader的library需要安装至多个模拟器中,我们自己的Preference Bundle也需要安装至多个模拟器中
- 我们测试Tweak的目的往往是在多个模拟器中测试,完全没有必要一一安装
- 坑点4
- 带有Bundle的项目的Makefile都需要引入locatesim.mk或路径相关的内容以及一大堆setup::命令
- 如果你对以上坑并没有感到畏惧,那么可以自行操作了…
针对以上问题的个人解决办法
- 将安装操作整合进theos中
- 在每个项目的MakeFile中都加入一大堆setup::的命令实在蛋疼
- 将/opt/simject作为RuntimeRoot并改动代码内相关路径至/opt/simject
- 一次安装所有模拟器以及之后新安装的模拟器都可生效。
- 同时有利于将安装操作整合进theos
- 对于Library可在/usr/lib创建软连接,因为除了RuntimeRoot/usr/lib,根目录的/usr/lib也是模拟器可自动链接的目录。
个人fork的theos
-
theos
- 使用此fork或pick相应的commit,一般项目仅需在Makefile中设定或shell中export
TARGET := simulator:clang::11.0
即可直接make setup SIMULATOR=1
进行安装,
- Framework、Library类项目可能需要添加一些创建目录、软连接的命令,可以参照以下我fork的常用依赖
改动之处
- target模拟器时,自动设定Tweak的INSTALL_PATH为
/
。这样保证下一步能正确地拷贝至对应路径
- 新增target
setup::
将编译产物目录内容拷贝至/opt/simject
中
- 新增target
remove::
用于卸载
个人fork的常用依赖
改动之处
- Preferences Bundle, ControlCenter Module等的相关路径设定为/opt/simject/…
- 由于
setup::
只能将lib、framework等拷贝至/opt/simject因此需要在各project的Makefile中补充增加相应的命令创建/usr/lib和/Library/Frameworks位置的软链接
- Catalina 和以下系统仅需开启根目录写权限后
make setup SIMULATOR=1
即可安装,Big sur得手动操作一下
- 还补充了一些创建必要目录/var/mobile、/User的命令,这些目录可能不能自动创建
7 个赞
Zhang
2