О патчах

Патчи в APK Editor Pro поддерживаются начиная с версии 1.6.0. В общем, патч представляет собой zip-архив, который содержит patch.txt и другие необходимые файлы. Patch.txt внутри zip-архива определяет правила патча, а другие файлы предоставляют ресурсы.

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

Также есть редактор патчей (проект с открытым исходным кодом): https://github.com/SnowVolf/PCompiler

Формат патча

Патч состоит в основном из правил. На текущий момент поддерживается 9 правил:

ADD_FILES

REMOVE_FILES

MATCH_REPLACE

MATCH_ASSIGN

MATCH_GOTO

GOTO

MERGE

EXECUTE_DEX

DUMMY

Внутри правила каждая строка, начинающаяся с символа # означает, что это комментарий. Каждый параметр начинается с новой строки.

Пожалуйста, изучите следующие примеры, чтобы понять, как создавать patch.txt. Также имеются примеры патчей, которые вы можете сохранить и изучить.

[ADD_FILES] (Добавление файлов)

Используется для добавления файлов в приложение.

NAME: определяет имя правила.

SOURCE: определяет имя файла внутри архива, который будет скопирован в приложение.

TARGET: определяет путь назначения внутри приложения.

[REMOVE_FILES] (Удаление файлов)

Используется для удаления файлов или папок из приложения.

NAME: определяет имя правила.

TARGET: определяет абсолютное имя файла, который будет удалён из приложения. Если необходимо удалить сразу несколько файлов, то нужно прописать имена всех файлов или папок, причём каждое имя должно начинаться с новой строки.

Например:

[REMOVE_FILES]

TARGET:

res/values-ru

res/values-hz

res/values​​/strings.xml

[/REMOVE_FILES]

[MATCH_REPLACE] (Поиск и замена)

Используется для поиска и замены найденного результата.

NAME: определяет имя правила. (Можно оставить его пустым, но если вы хотите перейти к этому правилу из других мест, указание имени обязательно.)

TARGET: определяет путь к файлу для выполнения операции сопоставления.

MATCH: определяет текст, который нужно найти.

REGEX: true или false. «True» означает, что строка поиска является регулярным выражением.

REPLACE: определяет текст, который заменит найденный результат. (Пустое поле означает удаление найденного результата)

[MATCH_ASSIGN] (Определение переменных)

Используется для определения переменных.

NAME: определяет имя правила. (Можно оставить его пустым, но если вы хотите перейти к этому правилу из других мест, указание имени обязательно.)

TARGET: определяет путь к файлу для выполнения операции сопоставления.

MATCH: определяет текст, который нужно найти.

REGEX: true или false. «True» означает, что строка поиска является регулярным выражением.

ASSIGN: определяет имя и значение переменной. (Например: p1 = $ {GROUP1}.) Если переменных больше одной, то каждая последующая переменная должна располагаться на новой строке.

[MATCH_GOTO] (Если да, то…)

Используется для поиска текста в файле и в случае обнаружения будет выполнено правило, прописанное в поле «GOTO».

Если же текст не найден, то выполняется правило, прописанное сразу после него.

NAME: указывает имя правила.

TARGET: определяет путь к файлу для выполнения операции сопоставления.

MATCH: определяет текст, который нужно найти.

REGEX: true или false. «True» означает, что строка поиска является регулярным выражением.

GOTO: определяет имя следующего правила. Если искомый текст найден, то произойдёт выполнение этого правила.

[GOTO] (Перенаправление к какому-либо правилу)

Используется для перехода к другому правилу.

GOTO: определяет имя следующего правила.

[MERGE] (Объединение ресурсов)

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

NAME: определяет имя правила.

SOURCE: определяет имя архива с файлами для слияния, уже разложенными по нужным папкам.

[EXECUTE_DEX] (Выполнение dex-скрипта)

Правило используется для выполнения специального скрипта.

SCRIPT: определяет файл скрипта внутри zip-архива для выполнения. Это должен быть dex-файл, который может быть создан с помощью следующих команд:

javac -source 1.7 -target 1.7 test/AddDebugInfo.java

dx --dex --output=script.dex test/AddDebugInfo.class

SMALI_NEEDED: определяет, требуется ли скрипту smali-код или нет. Если требуется («true»), а smali-код ещё не создан, то при выполнении правила в качестве первого шага он будет сгенерирован.

MAIN_CLASS: путь к классу, который содержит вход

ENTRANCE: выбор способа выполнения. Он должен принять 4 строковых параметра.

PARAM: передаётся в качестве последнего параметра для выбранного способа.

[DUMMY] (Пустое правило)

Пустое правило. Оно больше похоже на метку, которая содержит только поле «NAME» (имя). К нему можно перейти из правил «MATCH_GOTO» или «GOTO».

Несколько примеров:

# Требуемая минимальная версия приложения 1.6.8 и движка патчей 2

[MIN_ENGINE_VER]

1

# Автор данного патча

[AUTHOR]

apkeditor

# Для какого имени пакета

[PACKAGE]

*

# Добавить файлы в папку назначения

[ADD_FILES]

SOURCE:

layout.zip

TARGET:

res/layout

EXTRACT:

true

[/ADD_FILES]

# Удаление файлов

# Могут быть определены несколько файлов назначения

[REMOVE_FILES]

TARGET:

res/values-xx

res/values-yy

[/REMOVE_FILES]

# Замена совпадающего содержимого внутри файла назначения; будьте осторожны при REGEX=true

# Будут заменены все совпадения

# Если REGEX=true, содержание MATCH должно быть в одну строку

# Посмотрите пример удаления разрешения internet в приложении

[MATCH_REPLACE]

TARGET:

AndroidManifest.xml

MATCH:

<uses-permission android:name="android.permission.INTERNET" />

REGEX:

false

REPLACE:

[/MATCH_REPLACE]

# MERGE предназначен для объединения ресурсов и кода из других apk-файлов

#

# Объедините ресурсы и smali-файлы внутри extra.zip

# res/values/public.xml должен быть определён внутри extra.zip

# Движок патча будет пытаться перебрать все добавленные идентификаторы

# Учтите, что добавляемые идентификаторы должны отличаться от уже существующих

[MERGE]

SOURCE:

extra.zip

[/MERGE]

Справка по написанию патчей

Начало патча

[MIN_ENGINE_VER]
Минимальная версия движка патей
[AUTHOR]
Псевдоним/имя автора патча.
[PACKAGE]
Имя пакета приложения, для которого написан патч. Можно указать *, если патч универсальный.

Правила патча

[MATCH_GOTO] (Если нашли, то...)
Используется для поиска части текста и в случае удачного поиска будет выполнено правило, прописанное в поле GOTO
Если же текст не найден, то выполняется правило, находящееся ниже данного.
NAME
Необязательное поле. Указывается имя правила.
TARGET
Указывается абсолютный путь к файлу, в котором выполняется поиск.
MATCH
Значение для поиска. Возможно использовать регулярные выражения, если в поле REGEX прописано true.
REGEX
Использование регулярных выражений.
true - использовать, false - не использовать
GOTO
Указывается имя правила, находящегося ниже, в которое нужно перейти при успешном поиске.
[MATCH_ASSIGN] (Определение переменных)
Используется для определения переменных.
Например, напишем регулярное выражение: 12(\d)45(\d)78.
В переменные ${GROUP1} и ${GROUP2} попадут следующие значения: 12 3 45 6 78, т.к. они искались в скобках.
Правило [MATCH_ASSIGN] позволяет нам найти эти значения, занести их в переменные с более понятными для нас именами и позже, по этим именам, использовать данные значения в других правилах.
NAME
Необязательное поле. Указывается имя правила.
TARGET
Указывается абсолютный путь к файлу, в котором выполняется поиск.
MATCH
Значение для поиска. Возможно использовать регулярные выражения, если в поле REGEX прописано true.
REGEX
Использование регулярных выражений.
true - использовать, false - не использовать
ASSIGN
Позволяет сохранить найденные значения и дать переменным более логичные имена. Если переменных несколько, то каждая новая переменная пишется с новой строки. Например:
Three = ${GROUP1} (значение "3")
Six = ${GROUP2} (значение "6")
[MATCH_REPLACE] (Найти и заменить)
Используется для поиска какого-то текста и последующей его замены. Возможно использовать регулярные выражения, если в поле REGEX прописано true.
NAME
Необязательное поле. Указывается имя правила.
TARGET
Указывается абсолютный путь к файлу, в котором выполняется поиск.
MATCH
Значение для поиска. Возможно использовать регулярные выражения, если в поле REGEX прописано true.
REGEX
Использование регулярных выражений.
true - использовать, false - не использовать
REPLACE
Текст, на который будут заменены все значения, найденные в поле MATCH
[GOTO] (Переадресация)
Используется для "прыжка" на правило с именем, указанным в поле GOTO. Все правила, находящиеся между [GOTO] и правилом с указанным именем будут пропущены.
NAME
Необязательное поле. Указывается имя правила.
GOTO
Указывается имя правила, находящегося ниже, в которое нужно перейти при успешном поиске.
[ADD_FILES] (Добавление файлов)
Используется для добавления файлов в приложение. Если нужно добавить несколько файлов/папок, то нужные файлы/папки требуется расположить в необходимой структуре, добавить в архив, поместить его рядом с patch.txt (должен получиться архив в архиве), а в поле EXTRACT прописать значение true.
Если файлы, которые Вы добавляете, уже присутствуют в приложении, то сначала нужно удалить их в правиле [REMOVE_FILES] и только после этого добавлять свои
NAME
Необязательное поле. Указывается имя правила.
SOURCE
Указывается путь к файлам в архиве с патчем, которые нужно добавить.
TARGET
Указывается абсолютный путь, куда должны поместиться файлы. При добавлении архива нужно указать либо res/,либо smali/, в зависимости от того, какие и куда файлы нужно распаковать.
EXTRACT
Указывается, нужно ли распаковывать Ваши новые файлы.
true - файлы будут распакованы, false - файлы не будут распакованы.
[REMOVE_FILES] (Удаление файлов)
Используется для удаления файлов из приложения.
NAME
Необязательное поле. Указывается имя правила.
TARGET
Указывается абсолютный путь к файлу, который нужно удалить. Если требуется удалить несколько файлов, то каждый новый путь нужно писать с новой строки.
Можно указать только путь до папки и она будет удалена.
[MERGE] (Объединение (слияние) файлов)
Это правило похоже на [ADD_FILES], только здесь используется слияние. Т.е. при совпадении имён файлов - все строки из новых файлов будут автоматически добавлены в уже существующие файлы, поэтому в архиве с файлами должен быть public.xml.
NAME
Необязательное поле. Указывается имя правила.
SOURCE
Указывается путь к архиву в архиве с патчем, в котором файлы уже разложены в нужной структуре.
[DUMMY] ("Заглушка")
Используется для прекращения выполнения патча. Попав на это правило, движок завершает свою работу.
NAME
В данном правиле это единственное и обязательное поле. Указывается имя правила.

В данной справке были использованы материалы с ресурса 4pda.ru, такие как справка по правилам из приложения для создания патчей и разъяснения htc 600 о работе некоторых правил.
Множество готовых патчей можно найти в теме Apk Editor'а на 4pda.