Как JetBrains AppCode запускает симулятор iOS?
Я просто посмотрел на IDE кода приложения JetBrains, и, похоже, он может запускать симулятор iOS и запускать приложения в нем.
когда мне пришлось автоматизировать развертывание моих проектов, мне пришлось прибегнуть к автоматизации Applescript и GUI.
они, похоже, используют закрытый инструмент под названием "simlauncher". Интересно, что за магия скрывается за этим?
обновление:
- глядя на монитор активности, я вижу, что osascript запускается из simlauncher перед запуском симулятора. Может быть, это снова Applescript? Я думал, iOS Simulator.приложение не было сценарием.
- iOS Simulator, похоже, запускается launchd, поэтому simlauncher определенно не запускает его сам по себе. Кроме того, simlauncher остается только до тех пор, пока фактическое приложение не будет запущено в симуляторе. Они опрос это возможно?
- для сборки устройств они используют AMDeviceService, который, вероятно, является версией службы мобильных устройств Apple. Есть это техника из тюрьмы сломанной SDK?
немного больше информации о симуляторе с выхода "ps":
plumenator 26404 12.9 1.3 290172 52772 ?? SX 8:56PM 0:03.62 /Users/plumenator/Library/Application Support/iPhone Simulator/4.3.2/Applications/817A280D-1F74-4755-B848-B04EC8A24ADA/xxx.app/xxx
plumenator 26395 2.3 0.3 444208 13560 ?? S 8:56PM 0:00.72 /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/iPhone Simulator -SessionOnLaunch NO
plumenator 26402 1.4 0.8 318320 33052 ?? Us 8:56PM 0:00.86 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/CoreServices/SpringBoard.app/SpringBoard -SBDisableAutoDim YES -SBAutoLockTime -1 -SBAutoDimTime -1 -SBDontLockAfterCrash YES -SBDidShowReorderText YES -SBFakeBars YES -SBDontAnimateAppleDown YES -SBEnableDoubleHeightToggling YES
plumenator 26406 0.0 0.4 2466496 15792 ?? Ss 8:56PM 0:00.16 /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/libexec/gdb/gdb-i386-apple-darwin --arch i386 --interp=mi1 -q
plumenator 26401 0.0 0.1 106584 5688 ?? S 8:56PM 0:00.30 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/libexec/lsd
plumenator 26400 0.0 0.1 105228 4204 ?? S 8:56PM 0:00.13 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/libexec/installd -t 30
plumenator 26399 0.0 0.3 223488 11464 ?? Ss 8:56PM 0:00.15 /Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone Simulator.app/Contents/MacOS/SimulatorBridge 26395
теперь я полагаю, что это просто вопрос сортировки команд в соответствии с pid и их выполнения. :-)
однако есть проблема. Все эти двоичные файлы относятся к dylibs, присутствующим в корне платформы симулятора. Когда я запускаю их напрямую, они ищут их в '/'.
есть ли способ установить путь для dylibs перед выполнением команды? Это выглядит многообещающим: http://sacredsoftware.net/svn/misc/StemLibProjects/eaglshell/tags/2.1.0/Makefile
https://github.com/BlueFrogGaming/icuke имеет хорошую информацию тоже.
6 ответов
AppCode используйте для этого специальную оболочку, которую вы заметили в своей консоли:
/Applications/AppCode-108.379.app/bin/simlauncher 4.3 debug iphone <PATH_TO_APP> <STDOUT> <STDERR>
simlauncher
является не документированным / не дружественным двоичным файлом mach-o... Но вот краткий анализ:--12-->
-
для запуска симулятора он использует частный фреймворк Apple (
otool -L simlauncher
):/Applications/AppCode-108.379.app/bin/simlauncher: @rpath/iPhoneSimulatorRemoteClient.framework/Versions/A/iPhoneSimulatorRemoteClient (compatibility version 1.0.0, current version 12.0.0)
-
эта структура в комплекте с Xcode:
<XCODE_PATH>/Platforms/iPhoneSimulator.platform/Developer/Library/PrivateFrameworks/iPhoneSimulatorRemoteClient.framework
-
и используется так (
class-dump simlauncher
) (DTiPhoneSimulator*
от Apple Framework):@protocol DTiPhoneSimulatorSessionDelegate - (void)session:(id)arg1 didEndWithError:(id)arg2; - (void)session:(id)arg1 didStart:(BOOL)arg2 withError:(id)arg3; @end @interface Launcher : NSObject <DTiPhoneSimulatorSessionDelegate> { DTiPhoneSimulatorSession *mySession; } - (int)launch:(id)arg1 sdkVersion:(id)arg2 wait:(BOOL)arg3 device:(int)arg4 sout:(id)arg5 eout:(id)arg6 argument:(id)arg7 env:(id)arg8; - (void)session:(id)arg1 didEndWithError:(id)arg2; - (void)session:(id)arg1 didStart:(BOOL)arg2 withError:(id)arg3; @end
о другом двоичном AMDeviceService
Я просто могу сказать, что он использует ProtocolBuffers кроме того, я думаю, чтобы общаться с MobileDevice
сервис... Еще раз, недокументированные вещи...
быстрый вывод, извините, нет простого способа запустить iPhoneSimulator с помощью способа JetBrains, если не обратить вспять Apple privates / не документированные API... как и Jetbrains, я люблю их инструменты, они лучшие пушки, не могу подождите appcode, чтобы быть золотом, уже работает над ним каждый день:)
EDIT: см. ответ ниже от сотрудника JetBrains... @JetBrains, было бы здорово иметь какой-то AMDeviceService
документировано для автоматизации некоторых вещей... ;)
что именно вы хотите автоматизировать? Установка приложения и запуск его в симуляторе или устройстве?
о "3":
AMDeviceService
Это просто какой-то демон, который отвечает за любое взаимодействие с устройством. Он использует только /System/Library/PrivateFrameworks/MobileDevice
.библиотека фреймворка (частная). Он не знает ни о каком /Developer
вещи (конечно, если вы не собираетесь отлаживать на устройстве).
эта служба развертывает приложение на устройстве, монтирует образ разработчика, просматривает приложения на устройстве и запускается debugserver.
Он использует протокол буферов на основе протокола Google для связи с AppCode. Не Apple-вещи.
не на 100% уверен, что это то, о чем ваш вопрос, но я могу запустить произвольное приложение, скомпилированное симулятором, папка которого у меня на рабочем столе( например) в симуляторе со следующей строкой в терминале (все одна строка, заменяющая соответствующие значения для вашей системы):
/Developer/Platforms/iPhoneSimulator.platform/Developer/Applications/iPhone\ Simulator.app/Contents/MacOS/iPhone\ Simulator -SimulateApplication /Users/myusername/Desktop/[the alphanumeric app directory name]/MyCompiledAppProject.app/MyCompiledAppProject
где этот последний файл " MyCompiledAppProject "является фактическим двоичным файлом, который находится внутри пакета, который заканчивается.app (вы должны будете контролировать-нажмите на .app файл и выберите " Показать Содержимое упаковки", чтобы увидеть его). Это запустит симулятор, если он еще не открыт. Он может быть легко упакован в AppleScript, который принимает недавно скомпилированное местоположение приложения в качестве аргумента файла и не требует, чтобы Xcode был открыт или xcodebuild использовался.
на iphonesim проект дает вам запуск командной строки для приложений iOS. Я считаю, что это упаковывает то, что вы хотите.
Я думаю, что где-то читал, что они полагаются на Xcode, чтобы делать такие вещи для них. Но это было не очень конкретно, и я не знаю, где я это прочитал. Может быть, они пишут Xcode для запуска и развертывания вместо симулятора напрямую?
аналогичный проект по телефону gap находится в https://github.com/phonegap/ios-sim.