it-roy-ru.com

Xcode 5 и iOS 7: архитектура и допустимые архитектуры

Я начинаю новый проект в Xcode 5. Я хочу разработать приложение, используя iOS SDK 7, но с целью развертывания iOS 5.0. Как только я создаю новый проект в XCode и пытаюсь изменить цель развертывания на 5.0, я получаю это сообщение:

Applications including an arm64 slice are not compatible with versions of iOS
prior to 6.0
Adjust your Architectures build setting to not include arm64 in order to deploy
to releases prior to iOS 6.0.

Таким образом, архитектура изменилась на Standard (без 64-битной версии). Я компилирую, запускаю, но я не очень понимаю, что случилось.

В чем разница между настройками Architectures и Valid architectures в настройках сборки проекта Xcode?
Если я установлю Architectures, чтобы исключить 64-разрядную версию, что произойдет, когда я запусту свое приложение на 64-разрядной модели iPhone или iOS-симуляторе (я знаю, что это работает, мне просто интересно, что происходит под ней)?
Можете ли вы объяснить большой беспорядок с новой 64-битной архитектурой?

enter image description here

80
Crazy Yoghurt

Установите архитектуру в настройках сборки на Стандартные архитектуры (armv7, armv7s)

enter image description here

iPhone 5S оснащен 64-битным процессором A7. От Apple Docs

Xcode может создать ваше приложение с включенными как 32-битными, так и 64-битными бинарными файлами. Этот комбинированный двоичный файл требует минимальной цели развертывания iOS 7 или более поздней версии.

Примечание: будущая версия Xcode позволит вам создать одно приложение, которое поддерживает 32-разрядную среду выполнения на iOS 6 и более поздних версиях, а также 64-разрядную среду выполнения на iOS 7.

Из документации я понял

  • Xcode может создавать оба 64-битных 32-битных бинарных файла для одного приложения, но целью развертывания должна быть iOS7. Говорят, в будущем это будет iOS 6.0
  • 32-разрядный двоичный файл будет отлично работать в iPhone 5S (64-разрядный процессор).

Обновление (Xcode 5.0.1)
В Xcode 5.0.1 они добавили поддержку для создания 64-битного двоичного файла для iOS 5.1.1 и выше.

Xcode 5.0.1 может создавать ваше приложение как с 32-битными, так и с 64-битными бинарными файлами. Этот комбинированный двоичный файл требует минимальной цели развертывания iOS 5.1.1 или новее. 64-разрядный двоичный файл работает только на 64-разрядных устройствах под управлением iOS 7.0.3 и более поздних версий.

Обновление (Xcode 5.1)
Xcode 5.1 внес значительные изменения в раздел архитектуры. Это ответ будет продолжением для вас. Проверьте это

121
Anil Varghese

Когда вы устанавливаете 64-бит, получающийся двоичный файл представляет собой "толстый" двоичный файл, который содержит все три изображения Mach-O, связанные с тонким толстым заголовком. Вы можете увидеть это, используя otool или jtool. Вы можете проверить некоторые толстые двоичные файлы, включенные как часть iOS 7.0 SDK, например, AVFoundation Framework, например:

% cd  /Developer/Platforms/iPhoneOS.platform/DeviceSupport/7.0\ \(11A465\)/Symbols/System/Library/Frameworks/AVFoundation.framework/

%otool -V -f AVFoundation                                                                     9:36
Fat headers
fat_magic FAT_MAGIC
nfat_Arch 3
architecture arm64     # The 64-bit version (A7)
    cputype CPU_TYPE_ARM64
    cpusubtype CPU_SUBTYPE_ARM64_ALL
    capabilities 0x0
    offset 16384
    size 2329888
    align 2^14 (16384)
architecture armv7        # A5X - packaged after the arm64version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7
    capabilities 0x0
    offset 2359296
    size 2046336
    align 2^14 (16384)
architecture armv7s       # A6 - packaged after the armv7 version
    cputype CPU_TYPE_ARM
    cpusubtype CPU_SUBTYPE_ARM_V7S
    capabilities 0x0
    offset 4407296
    size 2046176
    align 2^14 (16384)

Что касается самого двоичного файла, он использует набор битовых инструкций ARM64, который (в основном совместим с 32-битными, но) является совершенно другим набором инструкций. Это особенно важно для графической программы (с использованием инструкций и регистров NEON). Аналогично, процессор имеет больше регистров, что сильно влияет на скорость работы программы. Интересное обсуждение есть в http://blogs.barrons.com/techtraderdaily/2013/09/19/Apple-the-64-bit-question/?mod=yahoobarrons о том, имеет ли это значение; бенчмаркинг-тесты до сих пор ясно показали, что это так.

Использование otool -tV выгрузит сборку (если у вас XCode 5 и более поздние версии), а затем вы сможете увидеть различия в наборе команд для себя. Большинство (но не все) разработчики будут оставаться независимыми от изменений, поскольку по большей части они напрямую не влияют на Obj-C (несмотря на API CG *) и должны делать больше с обработкой указателей низкого уровня. Компилятор поработает со своей магией и оптимизацией.

7
Technologeeks

Мое понимание от Apple Документов.

  • Что такое Architectures (ARCHS) в настройках сборки Xcode?
    • Определяет архитектуру (ы), для которых исполняется двоичный файл TARGET. Когда указано более одной архитектуры, сгенерированный двоичный файл может содержать объектный код для каждой из указанных архитектур.
  • Что такое Valid Architectures (VALID_ARCHS) в настройках сборки Xcode?

    • Определяет архитектуру/ы, для которых двоичный файл может быть BUILD.
    • В процессе сборки этот список пересекается с ARCHS, и результирующий список определяет архитектуры, на которых может работать двоичный файл.
  • Пример: - Один проект iOS имеет следующие настройки сборки в Xcode.

    • ARCHS = armv7 armv7s
    • VALID_ARCHS = armv7 armv7s arm64
    • В этом случае двоичный файл будет создан для архитектур armv7 armv7s arm64. Но тот же двоичный файл будет работать только на ARCHS = armv7 armv7s.
7
engineer

Вам не нужно ограничивать ваш компилятор только armv7 и armv7s, удаляя параметр arm64 из поддерживаемых архитектур. Вам просто нужно установить цель развертывания значение 5.1.1

Важное примечание: вы не можете установить для целевого объекта Deployment значение 5.1.1 в разделе Build Settings, так как он имеет раскрывающийся список только с фиксированными значениями. Но вы можете легко установить его на 5.1.1 в General разделе настроек приложения, просто набрав значение в текстовом поле.

6
Kibernetik

Простое исправление:

Цели -> Настройки сборки -> Параметры сборки -> Включить битовый код -> Нет

Работает на устройстве с iOS 9.3.3

5
Maselko

Ни один из ответов не сработал, и тогда я забыл установить минимальную цель развертывания, которую можно найти в проекте -> Общие -> Информация о развертывании -> Цель развертывания -> 8,0

Example

4
tsuz