繁体   English   中英

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

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

因此,我正在构建一个应用程序,用于将所有消息(AND彩信,带有附件)从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

  1. @hide javadoc批注应仅对javadocs隐藏该方法。 但是,Android文档指出:

    通常,应用程序应仅使用SDK中类的正式记录部分。 特别是,这意味着当您通过诸如反射之类的语义与类进行交互时,您不应该计划访问SDK中未列出的方法或字段。

    然后继续说明可能通过各种方式阻止对内部API的反射访问和其他访问。

    资料来源: 对非SDK接口的限制

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

  3. 如果在您针对其进行编译的接口中没有该方法(出于某种原因),则您不应尝试其他访问方式。 即使您成功了,这也有可能在将来引起可移植性问题。

用@hide注释的方法不属于公共Android API的一部分,也不适合开发人员使用。 它们通常仅是该类的内部对象,并且会在Android版本之间进行更改。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM