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 шт):

Автор решения: woesss

Декомпилятор использует модуль деобфускации (переименования) классов и их членов чтобы минимизировать путаницу в сигнатурах. Поэтому имена в JAR и в полученных "исходниках" не совпадают. Вам нужно отдельно заранее переименовать всё в JAR-е, чтобы декомпилятор просто генерировал код не меняя сигнатуры. А когда используются адекватные имена, нужно просто добавить соответствующие зависимости как обычно в любом проекте

→ Ссылка