android - SDK 中缺少导入类时,Android 项目如何编译?

标签 android android-studio android-sdk-tools android-build android-studio-import

好吧,也许这很简单,但我现在就是想不通。

我已经导入了谷歌示例项目 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/

相关文章:

android - 无法使用 Superpowered 库为 arm64-v8a 创建 so 文件

java - 在屏幕处于 sleep 状态时运行命令 firebase

android-studio - 如何在 Android Studio 中启动 Dart 项目?

android - 创建 Android 项目抛出错误 "The tools must be updated via SDK manager"

android - PANIC : Cannot find AVD system path. 请定义 ANDROID_SDK_ROOT

docker 上的 Android SDK

android - 从 AsyncTask 调用 AsyncTask

android - 有人可以澄清 Android 上下文引用吗?

android - 如何在 Android Studio 中更改布局(无需编码)

android - 单击时更新按钮的不透明度? flutter