您可以使用 OSGi 做到这一点。在这种情况下,作为目标的 Android 和 JDK 6 不是问题,在 Android 上运行 OSGi 框架 -> 例如参见mBedded Server for Android。您可以从该链接下载免费的非商业版本。
您有多种选择如何在 OSGi 中执行此操作,具体取决于您想要实现的目标。
选项 1(推荐):您可以将包 A 和 B 放在同一个包 AB 中,并使用 Export-Package 仅导出此包清单中的包 B。包/应用程序 C 或任何其他“用户”应用程序可以导入包 B 并使用它。它不能使用,甚至看不到包 A,因为它是包 AB 的内部。您不需要任何 Java 级别的特殊声明或依赖项;这适用于任何 Jva 版本,因为模块化和单独的捆绑空间是 OSGi 基础的一部分,并且不依赖于最新的 Java 版本或其他东西。
选项 2:如果出于某种原因您希望将包 A 和 B 分隔在不同的包中,您可以让它们如此,您将在清单中导出和导入包,然后使用权限控制哪个包有权导入哪个包(请参阅 OSGi 权限和条件权限服务)。然而,这实现起来比较复杂。
选项 3:您也可以将包 A 放在 Fragment 包中,并允许它附加到包含 B 的包。这样 B 将可以访问包 A,但同时您可以单独更新包 A如果需要,在运行时。由于片段中的包被视为主机包的私有包(在这种情况下,主机是包含包 B 的包),包 C 不会看到 A。它只会看到包 B 导出的内容。
由于您对 OSGi 不太熟悉,因此我建议您先使用选项 1,然后如果需要,您可以稍后将您的方法升级到选项 3。
@Edwin Dalorzo:OSGi 中的规则可以通过反射来破坏,这绝对不是真的。Bundle 在 OSGi 中有单独的类加载器。您可以从 Bundle C 中尽可能多地反映 A 类,而您唯一会得到的是 ClassNotFound 异常 - 相信我,我已经看过很多次了;)