Восстановить исходный код из apk
Когда я декомпилировал свой.apk, я увидел несколько дополнительных файлов, таких как MainActivity$1.java, MainActivity$1$1.java и т. Д. На самом деле некоторые из них пусты. Кроме того, есть некоторые фрагменты кода, которые встречаются много раз, такие как
this$0 = MainActivity.this;
super();
или же
this$1 = _cls1.this;
super();
где я могу прочитать больше об этом? и есть ли способ восстановить мой исходный код?
1 ответ
Этот код происходит от того, как внутренние классы компилируются в Java.
Нет прямой поддержки внутренних классов на уровне байт-кода. Вместо этого каждый создаваемый вами внутренний класс компилируется в отдельный файл классов с генерируемым компилятором кодом моста, чтобы обеспечить соответствующий доступ.
MainActivity $ 1 - это просто анонимный класс, определенный в MainActivity. MainActivity$1$1 будет анонимным внутренним классом, определенным внутри этого внутреннего класса.
Вторая часть - еще одна деталь реализации внутренних классов. Экземпляр внутреннего класса нуждается в ссылке на включающий экземпляр, чтобы иметь возможность получить к нему доступ (поскольку это просто обычные классы на уровне байт-кода). Для этого компилятор генерирует скрытое поле во внутреннем классе и вставляет код для его инициализации перед вызовом конструктора суперкласса (что разрешено в байт-коде, но не в Java).
Очевидно, ваш декомпилятор попытался декомпилировать эти части, но не смог волшебным образом преобразовать их обратно во внутренние классы в стиле Java.
Вы пробовали Procyon? Я не слишком знаком с его точными возможностями, но держу пари, что он может реконструировать внутренние классы.