Декомпилированный файл Android .class не отображает все методы соответствующего файла .java - PullRequest
0 голосов
/ 18 ноября 2018

Итак, я создаю приложение для копирования всех моих сообщений (и ммс, с вложениями) из iOS (резервное копирование iTunes) в Android Pie (OxygenOS).

Я просмотрел файл Android SmsManager.java и заметил два метода:

  • importTextMessage(...)
  • importMultimediaMessage(...)

Кажется, это те, кого я ищу, но:

  • Они не отображаются в декомпилированном SmsManager.class файле
  • Когда я все еще пытаюсь его использовать, компилятор жалуется
  • И, наконец, они не задокументированы.

Итак, вопросы. Почему они появляются в SmsManager.java, а не в SmsManager.class (декомпилятор jetbrains)? Почему они не зарегистрированы? Как я могу использовать эти методы?

РЕДАКТИРОВАТЬ: я успешно восстановил свою резервную копию на OnePlus 6T. Если вы хотите рабочий проект, см. Здесь https://github.com/let-aurn/iosmessagetoandroid.

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Методы, помеченные @hide, не являются частью общедоступного API Android и не предназначены для использования разработчиками.Они часто являются внутренними только для класса и могут изменяться во всех версиях Android.

Вы можете вызывать эти методы с помощью отражения, но делайте это с осторожностью, так как они могут измениться или быть удалены.Вы всегда должны проверять, когда метод появился в файле .java, когда изменилась подпись и был ли удален метод.Затем поместите ваш код в проверки версий Android, где это необходимо.

0 голосов
/ 18 ноября 2018
  1. Аннотация @hide javadoc должна скрывать метод только от javadocs.Однако документация Android гласит:

    В общем, приложения должны использовать только официально документированные части классов в SDK.В частности, это означает, что вы не должны планировать доступ к методам или полям, которые не перечислены в SDK, когда вы взаимодействуете с классом с помощью семантики, такой как рефлексия.

    Далее следует объяснить, чтоотражающий и другой доступ к внутренним API может быть заблокирован различными способами.

    Источник: Ограничения для интерфейсов не SDK

  2. Возможно, чтометоды были удалены либо путем изменения исходного кода, из которого были созданы файлы «.class», либо путем некоторых манипуляций с байт-кодом после компиляции.Это было бы сделано для предотвращения случайного написания кода, который зависел от внутренних методов API.

  3. Если методы отсутствуют (по какой-либо причине) в интерфейсах, с которыми вы скомпилировалиВы не должны пытаться найти другие способы доступа.Даже если вам это удастся, это может вызвать проблемы с переносимостью в будущем.

...