如果SDK中缺少导入的类,Android项目如何编译?

时间:2016-03-15 07:06:47

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

好吧,也许这很简单,但我现在无法理解。

我在Android Studio 1.5.1中导入了Google示例项目Card Reader,它在compileSdkVerison 23上编译,它可以在我的手机上运行。

然后,当我找到android.nfc.tech.BasicTagTechnology的源代码时,我走过SDK,发现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在我们的代码中,我当时迷失了。

1 个答案:

答案 0 :(得分:7)

@hide意味着它不包含在描述here的文档中,并且它也会从你编译的android.jar中的类中删除。 但是这些在运行时可用。

<强>更新 要深入了解您的IDE,当您深入了解SDK类时,您可能会看到无法解析的隐藏成员的引用。这没关系,只要它们在SDK类中而不在您的代码中,它仍然可以编译。

如果您想使用这些隐藏的类/方法/字段,您有两个主要选项:

1)获取完整版的android-framework.jar并能够编译。然而,这有一个缺点,即编译后的代码可能无法在其他Android版本中运行,因为Class或方法可能不存在。 例如,BasicTagTechnology实际上是私有包,因此无论如何都无法访问它

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});

这是一个更好的选择,因为它更灵活,您可以检查类/方法是否存在以初始化/调用它们,捕获异常等。