plugin Используется в проектах Android Gradle для поддержки смешанной разработки на языках Smali и Java.
Использование
buildscript {
repositories {
maven { url 'https://jitpack.io' }
}
}
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
buildscript {
repositories {
maven { url 'https://jitpack.io' }
}
dependencies {
// 自己的com.android.tools.build:gradle插件,支持3.4.0+
// classpath "com.android.tools.build:gradle:3.4.0"
// Android-SmaliPlugin
classpath 'com.github.Mosect:Android-SmaliPlugin:1.2.0-b1'
}
}
// Android插件
//apply plugin: 'com.android.application'
// После Android плагина включите Android-SmaliPlugin
apply plugin: 'com.mosect.smali.plugin.SmaliPlugin'
a. Конфигурация нескольких вкусов кода Smali в исходной папке: По умолчанию папка с кодом Smali находится в src/main/smali/classes. Если вы используете productFlavors, то можете создать папку smali/classes внутри каждой из них. Расположение исходного кода будет аналогично Java. Например:
b. Конфигурация мультидекса: После компиляции исходный код Smali помещается в classes.dex. Для размещения в других файлах dex можно поместить код Smali в папку smali/${dex_name}, где допустимые значения dex_name: classes, classes2, classes3 ... classes99.
c. Настройка пользовательской папки с кодом Smali: В файле build.gradle модуля приложения:
android {
sourceSets {
main {
smali {
// Полностью использовать пользовательскую папку
setDirs([file('my-smali/a'), file('my-smali/b')])
// Добавить пользовательскую папку
addDir(file('my-smali/a'))
// Добавить несколько папок
addDirs(file('my-smali/a'), file('my-smali/b'))
}
}
}
}
Для других sourceSet используется тот же принцип.
d. Указание уровня API для Smali: Уровень API Smali по умолчанию равен 15. Обычно этот параметр не требуется настраивать.
android {
sourceSets {
main {
smali {
apiLevel = 16
}
}
}
}
e. Дополнительные правила: перемещение классов в указанный dex: class-position.txt Если необходимо переместить большое количество классов или неудобно изменять структуру папок с кодом Smali, можно использовать файл class-position.txt для определения правил размещения классов:
Существует два способа:
android {
sourceSets {
main {
smali {
// Использовать пользовательский файл
setPositionFiles([file('my/class-position.txt')])
// Добавить отдельный файл
addPositionFile(file('my/class-position.txt'))
// Добавить несколько файлов
addPositionFiles(file('my/class-position.txt'), file('my2/class-position.txt'))
}
}
}
}
Файл примера и правила:
# #Начало комментария
# Перемещение класса в последний dex
move 0:com.mosect.Test end
# Перемещение класса в новый dex
move 1:com.mosect.* new
# Перемещение класса во второй dex, т.е. classes2.dex
move 2:com.mosect.** 2
# Перемещение класса в основной dex, т. е. classes.dex
move 0:com.mosect.Test main
# Удаление класса
delete 2:com.mosect.MyTest
В файле build.gradle модуля приложения укажите ссылку на SDK:
dependencies {
implementation 'com.github.Mosect:Android-SmaliSdk:1.2.0'
}
В пакете com.mosect.smali.annotation предоставляются различные аннотации, которые не включаются в dex и обрабатываются Android-SmaliPlugin. Ниже приведены аннотации (в порядке приоритета обработки):
Копирует метод в метод с указанным именем, поддерживает совместное использование с другими аннотациями, эта аннотация применяется только к методам.
Удаляет классы, методы или поля в Smali и исходном коде Java.
Использует классы, методы и поля в Smali, игнорируя классы, методы и поля Java.
Заменяет классы, методы или поля Smali на классы, методы или поля Java.
Объединяет классы Java и Smali.
Игнорирует классы, методы или поля Java, классы, методы или поля Java не будут включены в dex.
Чтобы вызвать Java из Smali, создайте соответствующий класс в Java, а затем используйте аннотацию @Ignore. Эти аннотации могут быть объединены для создания требуемой функциональности разработки.
Помимо использования аннотаций, вы также можете использовать файл class-operation.txt, чтобы указать правила объединения. Его конфигурация аналогична class-position.txt.
Есть два способа:
Создайте файл class-operation.txt в каталоге модуля приложения или в каком-либо каталоге sourceSet, например, src/main/class-operation.txt. Можно настроить несколько sourceSet, и их правила будут накладываться друг на друга.
В файле build.gradle модуля приложения Android:
android {
sourceSets {
main {
smali {
// Полностью использовать собственные файлы
setOperationFiles([file('my/class-operation.txt')])
// Добавить один файл
addOperationFile(file('my/class-operation.txt'))
// Добавить несколько файлов
addOperationFiles(file('my/class-operation.txt'), file('my2/class-operation.txt'))
}
}
}
}
Пример файла и правила:
# #Начало комментария
ignore com.mosect.Test
delete com.mosect.*
original com.mosect.**
replace com.mosect.*
merge com.mosect.Test
ignore field1
delete *
replace field4
ignore method1()
delete method2(String,int)
original method3(java.land.Date,Integer)
Правила команд: ignore|delete|original|merge|replace class_path. Они соответствуют командам и аннотациям.
Поля и методы объединяются после команды merge и начинаются с пробела (рекомендуется использовать \t).
Для полей достаточно указать имя поля, поддерживаются * и **. Для методов необходимо указать имя метода и сигнатуру параметров, например: met(Ljava.land.String).
Формат пути к классу: class_path. Путь к классу может содержать * или ** для соответствия нескольким классам, используется формат класса Java.
История версий
Добавлена поддержка аннотации Copy
Ссылка на версию: 1.1.2-b2
1. Исправлена проблема с ошибкой повторяющихся классов
2. Оптимизирован процесс генерации dex
1. Совместимость с AGP 3.3.0–7.2
2. Совместимость с MultiDex и R8
Бета-версия
1. Реализована базовая разработка на smali и java
Обратная связь
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )