Как JetBrains AppCode запускает симулятор iOS?

Я просто посмотрел на IDE кода приложения JetBrains, и, похоже, он может запускать симулятор iOS и запускать приложения в нем.

когда мне пришлось автоматизировать развертывание моих проектов, мне пришлось прибегнуть к автоматизации Applescript и GUI.

они, похоже, используют закрытый инструмент под названием "simlauncher". Интересно, что за магия скрывается за этим?

обновление:

  1. глядя на монитор активности, я вижу, что osascript запускается из simlauncher перед запуском симулятора. Может быть, это снова Applescript? Я думал, iOS Simulator.приложение не было сценарием.
  2. iOS Simulator, похоже, запускается launchd, поэтому simlauncher определенно не запускает его сам по себе. Кроме того, simlauncher остается только до тех пор, пока фактическое приложение не будет запущено в симуляторе. Они опрос это возможно?
  3. для сборки устройств они используют 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.