1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mosect-Android-SmaliPlugin

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
В этом репозитории не указан файл с открытой лицензией (LICENSE). При использовании обратитесь к конкретному описанию проекта и его зависимостям в коде.
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

plugin Используется в проектах Android Gradle для поддержки смешанной разработки на языках Smali и Java.

Использование

  1. Добавьте Jitpack: В файле build.gradle корневого проекта добавьте репозиторий:
buildscript {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
  1. Добавьте classpath: В файл build.gradle корневого проекта добавьте classpath:
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'
    }
}
  1. Включите плагин: В build.gradle модуля приложения Android включите плагин:
// Android插件
//apply plugin: 'com.android.application'
// После Android плагина включите Android-SmaliPlugin
apply plugin: 'com.mosect.smali.plugin.SmaliPlugin'
  1. Добавьте код Smali: Создайте папку src/main/smali/classes в каталоге модуля приложения Android и поместите туда файлы Smali. Это позволит создавать APK и AAB, содержащие код на Java и Smali.

a. Конфигурация нескольких вкусов кода Smali в исходной папке: По умолчанию папка с кодом Smali находится в src/main/smali/classes. Если вы используете productFlavors, то можете создать папку smali/classes внутри каждой из них. Расположение исходного кода будет аналогично Java. Например:

  • Папка с исходным кодом по умолчанию: src/main/smali/classes
  • Папка с исходным кодом debug: src/debug/smali/classes
  • Папка с исходным кодом release: src/release/smali/classes
  • Папка с исходным кодом beta (productFlavors): src/beta/smali/classes

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 для определения правил размещения классов:

Существует два способа:

  1. Создайте файл class-position.txt в каталоге модуля приложения или в одном из каталогов sourceSet, например, src/main/class-position.txt. Правила будут применяться ко всем sourceSet.
  2. В файле build.gradle модуля:
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
  • Инструкция: move|delete class_path target, move перемещает класс, delete удаляет класс, delete не имеет параметра target. Путь к классу: ${dex_index}:${class_path}, допустимый индекс dex: 0–99; 0 означает отсутствие указания dex, что означает указание соответствующего действия для всех dex. class_path может содержать * или ** для соответствия нескольким классам, используя формат класса java.

Программирование на Java + Smali

В файле build.gradle модуля приложения укажите ссылку на SDK:

dependencies {
    implementation 'com.github.Mosect:Android-SmaliSdk:1.2.0'
}

В пакете com.mosect.smali.annotation предоставляются различные аннотации, которые не включаются в dex и обрабатываются Android-SmaliPlugin. Ниже приведены аннотации (в порядке приоритета обработки):

Copy аннотация

Копирует метод в метод с указанным именем, поддерживает совместное использование с другими аннотациями, эта аннотация применяется только к методам.

Delete аннотация

Удаляет классы, методы или поля в Smali и исходном коде Java.

Original аннотация

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

Replace аннотация

Заменяет классы, методы или поля Smali на классы, методы или поля Java.

Merge аннотация

Объединяет классы Java и Smali.

Ignore аннотация

Игнорирует классы, методы или поля Java, классы, методы или поля Java не будут включены в dex.

Чтобы вызвать Java из Smali, создайте соответствующий класс в Java, а затем используйте аннотацию @Ignore. Эти аннотации могут быть объединены для создания требуемой функциональности разработки.

Использование class-operation.txt для изменения правил объединения Java и Smali

Помимо использования аннотаций, вы также можете использовать файл class-operation.txt, чтобы указать правила объединения. Его конфигурация аналогична class-position.txt.

Есть два способа:

  1. В Android Модуль приложения: создание файла class-operation.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.

История версий

1.2.0-b1

Добавлена поддержка аннотации Copy

1.1.2 (стабильная)

Ссылка на версию: 1.1.2-b2

1.1.2-b2

1. Исправлена проблема с ошибкой повторяющихся классов
2. Оптимизирован процесс генерации dex

1.1.1-b10

1. Совместимость с AGP 3.3.0–7.2
2. Совместимость с MultiDex и R8

1.1.1-b1

Бета-версия
1. Реализована базовая разработка на smali и java

Обратная связь

  • Создайте issue.
  • Присоединяйтесь к группе QQ: 624420724.
  • Посетите личную страницу: http://mosect.com.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Плагин smali для Gradle на Android. Развернуть Свернуть
Java и 2 других языков
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mosect-Android-SmaliPlugin.git
git@api.gitlife.ru:oschina-mirror/mosect-Android-SmaliPlugin.git
oschina-mirror
mosect-Android-SmaliPlugin
mosect-Android-SmaliPlugin
main