Как уменьшить размер моего пользовательского фреймворка iOS?

Я создал собственный фреймворк в iOS с swift4 в Xcode 9.2. Фреймворк содержит 9 файлов .swift, когда я попытался заархивировать и создать файл .framework, результат показал размер 5 МБ. Однако файлы 9swift имеют общий размер всего 72 КБ. Заархивированный файл .framework имеет слишком большой размер (5 МБ), с чем мой клиент не согласен.

Я попытался удалить нежелательный код, но размер остался прежним, они хотят, чтобы я сделал его похожим на платформу Android, размер которой составляет всего 34 КБ. Это первый раз, когда я создаю фреймворк, и у меня нет решений. Может ли кто-нибудь помочь мне уменьшить размер фреймворка без уменьшения файлов?

Я взглянул на Размер рамки и Понимание размера фреймворка iOS, и мне просто интересно, есть ли у вас просто несколько двоичных файлов, включенных в структуру - насколько я понимаю, вам не нужно удалять их или иным образом делать что-либо, как это делает Apple со своей стороны - но я мог ошибаться

MadProgrammer 02.05.2018 07:24

Да, у меня есть связанный файл .framework, который будет работать с симулятором и с реальным устройством, надеюсь, вы имеете в виду это под термином двоичные файлы, исправьте меня, если я ошибаюсь, также предложите свой ответ, чтобы помочь мне уменьшить размер?

swiftDevStart 02.05.2018 08:36

Да, я имею в виду двоичные файлы. Лично я считаю, что вашему клиенту не следует беспокоиться об этом, существует значительная разница в способах работы двоичных файлов для iOS и Android - но это только мое мнение.

MadProgrammer 02.05.2018 08:39

Я должен четко знать, нет ли возможности уменьшить размер, прежде чем сообщать им об этом, поэтому я пытаюсь выяснить, есть ли что-то, что я пропустил.

swiftDevStart 02.05.2018 11:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
4
3 431
1

Ответы 1

Я пробовал две вещи, и они у меня сработали. Может быть, это также может быть полезно для вас.

По умолчанию компоновщик экспортирует все символы. Вы можете ограничить это с помощью некоторых обсуждаемых методов в этой статье о видимости символов. Кроме того, в компоновщике есть приятная функция, которая позволяет указать, должны ли символы экспортироваться или не экспортироваться. Экспорт только символов интерфейса может помочь вам уменьшить размер, а ваш клиент не тратит впустую память.

Итак, на практике:

  1. Учитывая, что мой архив фреймворка - MyFramework.framework.

  2. Я перечислил все символы MyFramework.framework/MyFramework, запустив $ nm -g MyFramework.framework/MyFramework, и выбрал символы, которые мой двоичный файл необходимо экспортировать (символы, к которым мой клиент должен будет получить доступ).

  3. Все выбранные символы были сохранены в текстовом файле. Итак, предполагая, что среди всех перечисленных символов вам нужно сохранить в текстовый файл только те, которые вам нужны (нужны вашему клиенту).

  4. Откройте проект MyFramework и установите Build Settings -> Exported Symbols File так, чтобы он указывал на только что созданный текстовый файл.

  5. Имея двоичный код в руках, вы можете вырезать некоторые символы с помощью strip -N MyFramework.framework/MyFramework.

В моем случае я мог бы добиться чего-то хорошего, но думаю, что это может меняться от проекта к проекту. Кроме того, я имел дело с Objective-C. Я сделал образец Swift-проекта с достигнутыми результатами. Вы можете проверить это на https://github.com/gbazilio/ios-framework-size.

Надеюсь, это поможет вам, как и мне.

Не могли бы вы объяснить мне процесс по шагам, как вы этого добились. с начала создания универсальной мишени.

AppleBee 08.11.2018 09:23

(1) Вы получаете оригинальный .framework, как указано в шаге №1. (2) Вы запускаете nm -g ABC.framework/ABCBinary, чтобы получить все экспортированные символы. (3) Вы удаляете ненужные символы. Вы должны выбрать только те, с которыми будет взаимодействовать ваш клиент. (4) Вы сохраняете это в текстовом файле и устанавливаете путь к нему в Build Settings -> Exported Symbols File. (5) Вы перестраиваете свой .framework. Затем вы можете снова запустить nm -g ABC.framework/ABCBinary, чтобы проверить, изменились ли экспортированные символы соответствующим образом. (6) Затем вы выполняете шаг полосы, упомянутый в исходном ответе.

gbazilio 15.11.2018 20:30

Можете ли вы подробнее рассказать о шагах 1 и 2?

ak_tyagi 01.09.2020 19:41

Другие вопросы по теме