Android Studio не находит классы в библиотеке .jar
Необходимо внести изменения в готовый .apk файл.
С помощью dex2jar были получен jar архив с файлами .class, а с помощью java-decompiler.jar (встроен в Android Studio) - получен .jar архив с условно "исходным текстом" на java.
Далее файлы были импортированы в новый проект Android Studio.
Собственно программную часть я исправил, в ней ошибок компиляции не происходит.
Однако программа использует значительное количество библиотек. Библиотеки также получились в виде исходных кодов на java но в них имеются ошибки (результат декомпмпиляции).
Но те же самые библиотеки ещё имеются в виде готовых файлов .class (после dex2jar). Возникла идея добавить в проект эти файлы .class библиотек, упакованные в .jar, чтоб программа использовала их в готовом виде и избежать повторной их перекомпиляции.
Файлы распакованного каталога библиотеки (это только одна из нескольких) упаковал командой
jar -cf lifecycle.jar
Создал папку app/libs, скопировал .jar в неё.
В файле app/build.gradle добавил:
dependencies {
implementation fileTree(dir: 'libs', include: ['*.aar', '*.jar'], exclude: [])
}
Результат - в исходных текстах программы строка импорта:
import androidx.lifecycle.Lifecycle;
ранее отображалась красным, теперь стала как все другие, чёрным.
Но в самом тексте программы любые упоминания классов, методов из них являются ошибкой типа неизвестный класс, неизвестный метод. Например, здесь:
if (var1 || this.getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
компилятор ругается на getLifecycle(), Lifecycle.
Вопрос.
Как правильно добавлять библиотеки .jar (содержащие .class файлы) в Android Studio, чтоб она находила классы в них? И возможно ли такое вообще?
Ответы (1 шт):
Декомпилятор использует модуль деобфускации (переименования) классов и их членов чтобы минимизировать путаницу в сигнатурах. Поэтому имена в JAR и в полученных "исходниках" не совпадают. Вам нужно отдельно заранее переименовать всё в JAR-е, чтобы декомпилятор просто генерировал код не меняя сигнатуры. А когда используются адекватные имена, нужно просто добавить соответствующие зависимости как обычно в любом проекте