О патчах
Патчи в 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} попадут следующие значения: 12345678, т.к. они искались в скобках.
Правило [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.