Как JetBrains AppCode запускает симулятор iOS? - PullRequest
17 голосов
/ 30 мая 2011

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

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

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

Обновление:

  1. При просмотре Activity Monitor я вижу, что osascript запускается из simlauncher до запуска симулятора. Это может быть снова Applescript? Я думал, что iOS Simulator.app не поддерживает скрипты.
  2. iOS Simulator запускается с помощью launchd, поэтому simlauncher определенно не запускает его сам по себе. Кроме того, simlauncher остается только до тех пор, пока само приложение не будет запущено в симуляторе. Возможно, они голосуют за это?
  3. Для сборок устройств они используют AMDeviceService, которая, вероятно, является версией Apple Mobile Device Service. Это техника из сломанного тюрьмы 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 ]

25 голосов
/ 10 июня 2011

AppCode использует специальную оболочку для этого, что вы заметили в консоли:

/Applications/AppCode-108.379.app/bin/simlauncher 4.3 debug iphone <PATH_TO_APP> <STDOUT> <STDERR>

simlauncher - это недокументированный / не дружественный бинарный файл mach-o ... Но вот быстрыйанализ этого:

  • Для запуска симулятора используется частный каркас 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, если не поменять местами приватные / недокументированные API Apple ... как это сделали ребята из Jetbrains, мне нравятся их инструменты, они лучшие игроки, не могут ждать appcodeбыть золотом, уже работая над этим каждый день:)

РЕДАКТИРОВАТЬ: см. ответ ниже от JetBrainsсотрудник ... @JetBrains, было бы здорово иметь документацию AMDeviceService для автоматизации некоторых вещей ...;)

11 голосов
/ 10 июня 2011

Что именно вы хотите автоматизировать? Установить приложение и запустить его на симуляторе или устройстве?

О "3":

AMDeviceService - это просто какой-то демон, который отвечает за любое взаимодействие с устройством. Он использует только библиотеку /System/Library/PrivateFrameworks/MobileDevice .framework (она приватная). Он не знает ни о каких /Developer вещах (конечно, если вы не собираетесь отлаживать на устройстве).

Эта служба развертывает приложение на устройстве, монтирует образ разработчика, просматривает приложения на устройстве и запускает отладочный сервер.

Он использует протокол на основе буферов протокола Google для связи с AppCode. Не Apple-вещи.

4 голосов
/ 07 февраля 2012

Проект iphonesim предоставляет вам средство запуска командной строки для приложений iOS. Я считаю, что это упаковывает то, что вы хотите.

4 голосов
/ 10 июня 2011

Не уверен на 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.

0 голосов
/ 12 июня 2013

Аналогичный проект по телефонному разрыву в https://github.com/phonegap/ios-sim.

0 голосов
/ 30 мая 2011

Мне кажется, я где-то читал, что они полагаются на Xcode, чтобы делать такие вещи для них.Но это было не очень конкретно, и я не знаю, где я это читал.Может быть, они запускают и разворачивают сценарий XCode вместо симулятора напрямую?

...