好吧,也许这很简单,但我现在就是想不通。
我已经导入了谷歌示例项目 Card Reader在 Android Studio 1.5.1 中,它在 compileSdkVerison 23 编译,它在我的手机上运行。
然后我浏览了 SDK,同时来到了源代码 android.nfc.tech.BasicTagTechnology
,我找到了TransceiveResult
里面android.nfc.tech.BasicTagTechnology#transceive
无法解决然后我找到了类 TransceiveResult
在我的 D:\Android\sdk\platforms\android-23\android.jar
中丢失了, 但在此处显示在 Android 源代码中 D:\Android\sdk\sources\android-23\android\nfc\TransceiveResult.java
然后我意识到它可以对公众隐藏,而不是导出,实际上它是
/**
* Class used to pipe transceive result from the NFC service.
*
* @hide
*/
public final class TransceiveResult implements Parcelable
然后我做了一些随机的事情,在我同步项目后,清理并重建,使缓存无效/重新启动,仍然无法解决TransceiveResult
对了,我在想,既然SDK中已经丢失了这个符号,那么这个工程如何才能顺利编译呢?
编辑我终于啊哈
我们调用android.nfc.tech.BasicTagTechnology#transceive
在我们的代码中而不是 TransceiveResult
, 在编译时我们不需要解析 TransceiveResult
,我们只需要解决android.nfc.tech.BasicTagTechnology#transceive
在我们的代码中引用了它,那一刻我迷路了。
最佳答案
@hide 表示它不包含在文档中,如 here 所述并且它也从编译中使用的 android.jar 中的类中删除。 然而,这些在运行时可用。
更新: 为了在您的 IDE 中澄清,当您深入研究 SDK 类时,您可能会看到对无法解析的隐藏成员的引用。这没关系,只要它们在 SDK 类中而不是在您的代码中,它仍然会编译。
如果你想使用那些隐藏的类/方法/字段,你有两个主要选择:
1) 获取完整版本的 android-framework.jar 并能够编译。然而,这有一个缺点,即编译后的代码可能无法在其他 Android 版本中运行,因为类或方法可能甚至不存在。 并且例如 BasicTagTechnology 实际上是包私有(private)的,因此您无论如何都无法访问它
2)使用反射:
Class tr = Class.forName("android.nfc.TransceiveResult");
Constructor constructor =
tr.getConstructor(new Class[]{int.class, byte[].class});
Object trObj = constructor.newInstance(1, new byte[]{1,2});
这是一个更好的选择,因为它更灵活,您可以检查类/方法是否存在以初始化/调用它们、捕获异常等。
关于android - SDK 中缺少导入类时,Android 项目如何编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36004651/