Как JetBrains AppCode запускает iOS Simulator?
Я просто посмотрел на IDE JetBrains App Code и, похоже, смог запустить iOS Simulator и запустить приложения в нем.
Когда мне пришлось автоматизировать развертывание моих проектов, мне пришлось прибегать к автоматизации Applescript и GUI.
Кажется, что они используют закрытый инструмент под названием "simlauncher". Интересно, что это за магия.
Обновление:
- При взгляде на Activity Monitor я вижу, что osascript запускается с simlauncher до запуска симулятора. Может ли это быть снова в Applescript? Я думал, что iOS Simulator.app не был доступен для сценариев.
- iOS Simulator, похоже, запускается при запуске, поэтому simlauncher определенно не запускает его сам по себе. Кроме того, simlauncher остается только до тех пор, пока фактическое приложение не будет запущено в симуляторе. Они могут опросить его?
- Для сборки устройств они используют AMDeviceService, что, вероятно, является версией службы Apple Mobile Device. Является ли это техникой из тюрьмы, разбитой 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 и их выполнения.: -)
Есть проблема. Все эти двоичные файлы относятся к dylib, присутствующим в корне платформы платформы. Когда я запускаю их напрямую, они ищут те, которые находятся в '/'.
Есть ли способ установить путь для dylib перед запуском команды? Это выглядит многообещающим: http://sacredsoftware.net/svn/misc/StemLibProjects/eaglshell/tags/2.1.0/Makefile
https://github.com/BlueFrogGaming/icuke также имеет хорошую информацию.
Ответы
Ответ 1
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, если только реверсирование Apple не будет закрыто/не документировано API... например, люди Jetbrains, мне нравятся их инструменты, они являются топ-пушками, не могут подождите, пока appcode станет золотым, он будет работать на нем каждый день:)
EDIT: см. ответ ниже от сотрудника JetBrains... @JetBrains, было бы здорово иметь какой-то AMDeviceService
, документированный для автоматизации некоторых вещей...;)
Ответ 2
Что именно вы хотите автоматизировать? Установка приложения и запуск его в симуляторе или устройстве?
О "3":
AMDeviceService
- это всего лишь некоторый демон, который отвечает за любое взаимодействие с устройством. Он использует только библиотеку /System/Library/PrivateFrameworks/MobileDevice
.framework(она закрыта). Он не знает о каких-либо материалах /Developer
(конечно, если вы не собираетесь отлаживать устройство).
Эта служба развертывает приложение на устройстве, монтирует изображение разработчика, просматривает приложения на устройстве и запускает debugserver.
Он использует протокол протокола протоколов Google Protocol для связи с AppCode. Не Apple-материал.
Ответ 3
Не на 100% уверен, что это ваш вопрос, но я могу запустить произвольное приложение, скомпилированное с помощью Simulator, чью папку у меня на рабочем столе (например) в Simulator со следующей строкой в терминале ( вся одна строка, подставляя соответствующие значения для вашей системы):
/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.
Ответ 4
Проект iphonesim дает вам запуск командной строки для приложений iOS. Я считаю, что он упаковывает то, что вам нужно.
Ответ 5
Я думаю, что я где-то читал, что они полагаются на Xcode, чтобы делать для них такую вещь. Но это было не очень специфично, и я не знаю, где я его читал. Может быть, они запускают Xcode для запуска и развертывания вместо симулятора напрямую?
Ответ 6
Подобный проект по разрыву телефона находится в https://github.com/phonegap/ios-sim.