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

Итак, я создаю приложение для копирования всех моих сообщений (И ммс, С вложениями) из 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.

В порядке. Я только что заметил, что у этих методов есть атрибут @hide в java-doc. Могу я еще как-нибудь их использовать?

David 18.11.2018 02:22

«Когда я все еще пытаюсь его использовать, компилятор жалуется» - Что там написано?

Stephen C 18.11.2018 03:49

@StephenC, компилятор говорит, что методов не существует

David 18.11.2018 11:36
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
431
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

  1. Аннотация javadoc @hide должна скрывать метод только от javadocs. Однако в документации Android указано следующее:

    In general, apps should only use the officially documented parts of the classes in the SDK. In particular, this means that you should not plan to access methods or fields that are not listed in the SDK when you interact with a class via semantics such as reflection.

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

    Источник: Ограничения на интерфейсы, не относящиеся к SDK

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

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

Ответ принят как подходящий

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

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

Другие вопросы по теме