Android的反编译.class文件没有显示对应.java文件的所有方法

Android's decompiled .class file don't show all methods of the corresponding .java file

所以,我正在构建一个应用程序来将我的所有消息(和彩信,带附件)从 iOS(iTunes 备份)复制到 Android Pie(OxygenOS)。

我查看了 Android 的 SmsManager.java 文件,发现了两种方法:

他们似乎是我要找的人,但是:

所以,问题。为什么它们出现在 SmsManager.java 而不是 SmsManager.class (jetbrains 反编译器)?为什么没有记录它们?我该如何使用这些方法?

编辑:我在我的 OnePlus 6T 上成功恢复了我的备份。如果您想要一个工作项目,请参阅此处 https://github.com/let-aurn/iosmessagetoandroid.

  1. @hide javadoc 注释应该只隐藏 javadoc 中的方法。但是,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 的访问可能会被各种方式阻止。

    来源:Restrictions on non-SDK interfaces

  2. 可能是通过修改构建“.class”文件的源代码或在编译后通过一些字节码操作删除了这些方法。这样做是为了防止您意外地编写依赖于内部 API 方法的代码。

  3. 如果您编译所针对的接口中不存在这些方法(无论出于何种原因),您不应该尝试其他访问方式。即使您成功了,这也可能会在将来导致可移植性问题。

用@hide 注释的方法不是 public Android API 的一部分,也不是为开发人员使用而设计的。它们通常仅在 class 内部,并且可能会在 Android 版本中发生变化。

您可以通过反射调用这些方法,但请谨慎操作,因为它们可能会更改或被删除。您应该始终检查该方法何时出现在 .java 文件中,何时签名更改以及 if/when 它被删除。然后将您的代码包装在 Android 需要的版本检查中。