Уметь создавать твики для iOS-устройств не менее важно, чем уметь разрабатывать приложения для App Store. Сегодня многие миллионы и десятки миллионов пользователей Apple уже сделали джейлбрейк, и каждый стремится подобрать оптимальные твики для изменения интерфейса или улучшения системы.

Сборка твиков, их модификация, создание простейших твиков, наряду со знанием Objective-C, — первые шаги в разработке. В этой статье я расскажу, как установить необходимое ПО для разработки и как устроена файловая структура твика, покажу создание наипростейшего твика, а также опишу сборку имеющихся Open Source твиков. Отдельным пунктом вынесено исправление ошибок, которых при разработке ты наверняка встретишь немало.

 

Что такое Theos и как его установить

Разработка твиков — несамостоятельный процесс, и по замыслу он должен быть похож на разработку обычных iOS-приложений. Именно поэтому отдельной программы для разработки как таковой нет, вместо нее используются некоторые элементы Xcode (но при этом не сама программа), а также общедоступные UNIX-команды. Соответственно, Theos — не компилятор или интерпретатор, а лишь удобный набор ПО (шаблонов, библиотек, команд). Он включает систему NIC, позволяющую создавать твики по заданному шаблону, утилиту для сборки твика и некоторые другие элементы.

При этом сам Theos не будет работать без установки других важных утилит (Cydia Substrate, 1did, Xcode Command Line Tools, iOS SDK, входящего в комплект Xcode). Theos можно установить и на Linux, и даже на саму iOS, однако в этой статье мы рассмотрим самый удобный вариант — разработку в среде OS X (Yosemite). Здесь он, как правило, устанавливается в каталог /opt/.

Перед установкой необходимо проверить наличие некоторых команд и программ. В первую очередь установим Xcode Command Line Tools для расширения набора команд терминала. Введи

$ xcode-select -install

Если ты получил примерно такой ответ, значит, утилита уже установлена:

Usage: xcode-select [options]

Print or change the path to the active developer directory. This directory
controls which tools are used for the Xcode command line tools (for example,
xcodebuild) as well as the BSD development commands (such as cc and make).

    Options:
      -h, --help                  print this help message and exit
      -p, --print-path            print the path of the active developer directory
      -s <path>, --switch <path>  set the path for the active developer directory
      --install                   open a dialog for installation of the command line developer tools
      -v, --version               print the xcode-select version
      -r, --reset                 reset to the default command line tools path

В противном случае тебе предложат установить XCLT (автоматически).

Для создания и распаковки deb-пакетов (о них ниже) потребуется команда dpkg. Для ее установки необходимо подключить команду brew. Введи в терминале:

$ ruby -e "$(curl -fsSL https://goo.gl/PNKdg9)"

После успешной установки введи команду для установки dpkg:

$ brew install dpkg

Следующим шагом установим Cydia Substrate (тот самый фреймворк, позволяющий изменять поведение и внешний вид системы):

$ curl -O http://apt.saurik.com/debs/mobilesubstrate_0.9.5101_iphoneos-arm.deb
$ mkdir substrate
$ dpkg-deb -x mobilesubstrate_0.9.5101_iphoneos-arm.deb substrate
$ sudo mv substrate/Library/Frameworks/CydiaSubstrate.framework /Library/Frameworks/CydiaSubstrate.framework
$ sudo mv substrate/Library/MobileSubstrate /Library/MobileSubstrate
$ sudo mv substrate/usr/lib/* /usr/lib/

Подготовка к установке завершена, осталось только скачать Theos по данной ссылке, разархивировать и скопировать по пути /opt/. Об ошибках при выполнении инструкции написано ниже.

Итак, Theos и все вспомогательные утилиты установлены, ознакомимся с устройством папки по пути /opt/. Папок и файлов здесь очень много, потому опишу только наиважнейшие:

  • /makefiles/ — папка, содержащая мейкфайлы для сборки твика. В ней, в частности, содержится файл common.mk, отвечающий за сборку твика;
  • /bin/ — в данной папке находятся системы NIC и Logos, необходимые для создания твиков;
  • /include/ — все хидеры iOS, необходимые для сборки;
  • /template/iphone/ — здесь хранятся все шаблоны NIC для быстрого создания базового набора файлов программы: шаблоны утилит, твиков, пакетов .ipa или библиотек.
 

Как устроен твик, его файловая структура

Твики имеют достаточно сложную файловую структуру, которая в большей степени зависит от воображения его создателя. Однако в твике должны присутствовать и некоторые стандартные, обязательные элементы. Tweak.xm — основной исходник твика, где хранится код на языке Objective-C. Тут может быть абсолютно все, что ты пожелаешь. Makefile — файл для управления процессом сборки исходника в deb-пакет. В нем указывается, для какой архитектуры создается твик, версия iOS SDK на компьютере, происходит обращение к некоторым файлам и процессам Theos. В файле control содержится вся информация о твике. Вот его обязательные поля:

  • Package — название будущего deb-пакета;
  • Name — название твика для отображения на устройстве;
  • Version — текущая версия твика;
  • Architecture — iphoneos-arm (архитектура процессора, здесь ничего менять не надо);
  • Description — описание твика;
  • Author — автор твика;
  • Section — категория, в которую будет помещен твик после попадания в Cydia. По умолчанию — Tweaks;
  • Icon — путь к иконке твика для отображения на рабочем столе iOS-устройства. Начинается с file:///.

Возможны и другие поля в данном файле, как то:

  • Depiction — сайт с дополнительной информацией о твике;
  • Maintainer — сборщик deb-пакета;
  • Depends — здесь прописываются все необходимые зависимости, которые будут установлены твиком;
  • Homepage — домашняя страница разработчика твика;
  • Pre-Depends — обязательные зависимости при установке пакета.
Правильно заполненный файл control
Правильно заполненный файл control

При заполнении файла не забывай, что в конце каждой строки должен стоять пробел, а в конце файла — пустая строка.

Структура твика перед сборкой
Структура твика перед сборкой

Впрочем, наилучший метод описать файловую структуру твика — создать его. Начнем с простейшего твика, который ничего не будет делать, но сможет быть установленным на iOS-устройство.

Запускаем NIC следующей командой:

$ /opt/theos/bin/nic.pl

После вывода «шапки» тебе будет задано несколько вопросов:

Choose a Template (required):

Theos содержит несколько шаблонов (типов твиков), применяющихся для облегчения разработки. Как и писалось выше, здесь есть шаблоны и для обычных iOS-приложений, шаблону твика соответствует цифра 5:

Project Name (required): MyFirstTweak.

Имя проекта, которое будет отображаться в Cydia, соответствует полю в файле control.

Package Name [com.mycompany.myfirsttweak]:

Далее необходимо указать название будущего deb-пакета (оставляем значение по умолчанию) и имя автора твика. На экран выведется сообщение Done, а сгенерированные утилитой файлы появятся в папке /Users/Имя пользователя/idid. Здесь уже будут Makefile, Tweak.xm и обширная папка theos, в которой хранятся все файлы, необходимые для работы твика.

Структура простейшего твика
Структура простейшего твика

Но вот скомпилировать такой пакет не удастся — отсутствует файл control. Создаем его и заполняем по приведенному выше образцу. Не забывай при этом, что данные в файле должны соответствовать данным, введенным при создании папки твика (и не забывай убрать расширение файла!). Теперь осталось только запустить команду

$ make package
Процесс сборки твика
Процесс сборки твика

И пакет с твиком появится в текущей папке. Установить такой твик можно будет, как и любой другой, при помощи терминала на iOS-устройстве. Единственная проблема данного твика в том, что он ничего не умеет делать. Если ты откроешь файл Tweak.xm (основной файл твика), то найдешь закомментированный текст вроде этого:

Содержимое файла Tweak.xm
Содержимое файла Tweak.xm

Поэтому изменим наш файл Tweak.xm так, чтобы он делал хоть что-то.

 

Создаем собственный твик

Для программирования твиков используются хуки. Хуки — это специальные функции, позволяющие внедрить собственный код в классы системы и других приложений, не меняя последние. Рассмотрим пример очень простого твика, который изменяет название оператора в верхней строке меню:

%hook SBTelephonyManage
- (void)_reallySetOperatorName:(id)arg1
{
      arg1 = @'MyText';
      %orig(arg1);
}
%end

В начале пишем %hook, в конце — %end. После %hook — название класса, который необходимо изменить. Далее перечисляем методы, которые собираемся менять (имена классов и методов можно найти в хидерах, устанавливаемых вместе с Theos). Далее можем писать наш код, который заменит код оригинального метода. В данном случае мы просто изменяем первый аргумент на нужный нам текст. В конце не забываем указать название измененного аргумента с помощью %orig.

Далее твик можно собрать, как было описано в предыдущем разделе. Однако, как ты сам видишь, он довольно примитивен и большой пользы не несет. Понять, как создать твики с более серьезной функциональностью, проще всего на примерах. Множество твиков с открытыми исходниками можно найти по ссылке, приведенной в начале статьи. Также рекомендую изучить исходники небезызвестного Райна Петрича, опубликованные в рамках проекта TweakWeak. Ну и напоследок репозиторий с несколькими примерами для начинающих.

INFO


При помощи Theos можно создавать не только твики, но и обычные приложения App Store, в таком случае при создании необходимо выбирать шаблон 1.

В папке /theos/lib/ хранятся динамические библиотеки, которые можно перенести из папки /usr/lib/ на iOS-устройстве.

Deb-пакеты используются не только в iOS, но и во многих дистрибутивах Linux. Именно поэтому указывается архитектура iphone-arm.

При создании твика в среде Theos в Makefile желательно прописать параметры версии iOS SDK и архитектуры, которые отсутствуют по умолчанию.

 

Исправляем ошибки

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

Если возникает ошибка Your curren SYSROOT ... appearence to be missing, значит, версия системы в файле control не соответствует номеру версии iOS SDK, который установлен на компьютере. Для того чтобы узнать правильный номер iOS SDK (который хранится в Xcode), нажимаем правой кнопкой мыши на Xcode и выбираем опцию «Показать содержимое пакета». Здесь в папке /Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs находится папка iPhoneOSX.X.sdk. Запоминаем номер версии и переходим в файл Makefile. Открываем его в TextEdit и изменяем соответствующий параметр:

export TARGET = iphone:X.X.

После данной операции ошибка, скорее всего, исправится, однако могут появиться другие.

Очень часто в пакете или в той или иной сборке Theos отсутствуют некоторые хидеры iOS. Это может привести к ошибке fatal error: file YYY/XXX.h is not found. Решить проблему просто: необходимо добавить такие файлы в Theos. Находятся данные файлы по пути /opt/theos/include/. Далее идет папка YYY, а в ней — файл XXX. Вбиваем название пропавшего файла в поиск и находим сам файл или его содержимое на сайте GitHub. Создай текстовый файл с данным содержимым и необходимым названием, а затем просто смени его расширение на .h и перемести его в данную папку. Ошибка должна пропасть.

Вполне возможно, какие-то папки, в которые при сборке необходимо будет записывать информацию, будут защищенными от записи. В таком случае вероятна ошибка file XXX is not writable... просто выполни команду sudo chmod -R 777 /путь/к/пакету, и после подтверждения пароля ошибка должна исчезнуть.

Вероятна также критическая ошибка architecture is not support. Это значит, что в твике отсутствует поддержка 32-битной или 64-битной архитектуры. Первым делом открой Makefile и посмотри, правильно ли указана архитектура:

export ARCHS = armv7 arm64

Если arm64 не хватает — допиши. Затем перейди в /opt/theos/lib/ и замени файл libsubstrate.dylib на данный файл. Если не поможет и это — очевидно, сам твик не оптимизирован и требует доработки.

Наконец, при установке пакета на устройство может возникнуть такая ошибка:

dpkg-deb: file `package.deb' contains ununderstood data member data.tar.xz, giving up
dpkg: error processing package.deb (--install):
 subprocess dpkg-deb --fsys-tarfile returned error exit status 2
Errors were encountered while processing:
 package.deb
Ошибка при инсталляции твика
Ошибка при инсталляции твика

Данная ошибка происходит из-за несовместимости смартфонной и компьютерной версии команд dpkg-deb. Для решения проблемы открой файл /opt/theos/makefiles/deb.mk. Найди строчку $(FAKEROOT) -r dpkg-deb -b и измени ее на $(FAKEROOT) -r dpkg-deb -Zlzma -b. После этого файл должен установиться корректно.

Файл deb.mk
Файл deb.mk

Разумеется, это не все возможные ошибки, и многие получится устранить только при хорошем знании Objective-C. Здесь описаны те, с которыми столкнулся (и которые устранил) автор материала.

 

Заключение

В данной статье рассмотрен лишь начальный этап изучения разработки твиков, первые шаги в программировании под iOS. Дальнейшая работа — создание функциональных твиков и серьезная модификация имеющихся — требует основательных знаний в Objective-C и объектно-ориентированного программирования. Тем не менее теперь ты знаешь общие этапы разработки, пути решения самых распространенных проблем на ключевых стадиях создания твиков, а дальше уже все зависит лишь от воли разработчика.

Оставить мнение