【问题标题】:Adding standard java classes that are missing in Android添加 Android 中缺少的标准 java 类
【发布时间】:2020-08-19 13:29:10
【问题描述】:

我正在使用从 javax.security.auth.login 包中抛出 FailedLoginException 的 Java 安全提供程序。 当我在我的 Android 应用程序中使用这些提供程序时,我遇到了 Android 的 javax.security.auth.login 包没有这样的类的问题,它只有 LoginException,它是其他类的基类。因此,每当抛出 FailedLoginException 时,我的应用程序都会抛出 NoClassDefFound。

有没有办法将这个缺少的标准 Java 类添加到我的 Android 应用程序中,或者解决该错误?

感谢任何帮助!

【问题讨论】:

标签: java android security


【解决方案1】:

有没有办法将这个缺少的标准 Java 类添加到我的 Android 应用程序中,或者解决该错误?

AFAIK,不,不。

我怀疑我们能给你的最好建议是:

不要以这种方式进行用户身份验证!

Android 不支持所有的javax.security.**,尤其是它不支持 JAAS 身份验证和授权框架,这显然是您正在尝试使用的。

见:

虽然(理论上)可以将 JAAS 移植到 Android,但我还没有发现任何证据表明有人成功地做到了这一点。

【讨论】:

    【解决方案2】:

    Java 中的 NoClassDefFoundError 与 ClassNotFoundException 不同,当 Java 虚拟机无法在运行时找到在编译时可用的特定类时出现。见:3 ways to solve java.lang.NoClassDefFoundError in Java J2EE

    在您的 Android Studio 项目资源管理器中检查 rt.jarExternal Libraries -> -> rt.jar -> javax -> security -> auth-> login -> 。可以看到 FailedLoginException 存在。

    现在检查 External Libraries -> -> android.jar -> javax -> security -> auth-> login -> 。可以看到 FailedLoginException 不存在。

    这意味着您的库由 rt.jar 编译,现在与 android.jar 一起使用。在另一边, 您不能将 rt.jar 与 Android 应用程序一起使用(并且与 android.jar 有些重叠)。因为它是桌面 JRE 的运行时库,而不是 Android。见:Android Studio - android.jar and rt.jar conflicts

    现在要解决您的问题,您可以将源代码获取到外部库并重写它。见How to use classes from rt.jar in an android application?

    我建议用一些调试功能自己实现该类,以避免其他依赖类的实现。

    另一种不推荐的方式是从here 下载一个jar 并将其添加到您的项目中。

    【讨论】:

    • I suggest to implement that class yourself with some debug function to avoid other dependent class implementation. 在标准命名空间中实现某些东西时我会非常小心。不是从技术角度,而是从法律角度。请记住,这些 JAR 附带您同意的许可协议。
    • 对不起!你说得对。我完全忘记了许可证问题。我会编辑它。谢谢。
    【解决方案3】:

    在开发任何新的 Android 操作系统时,都会附带一堆 Java 类,这些类为需要这些类才能运行的应用程序提供支持。让我们考虑一下这种情况下的 Time API。它已添加到 Android API 级别 26,因此,使用此库的应用程序将在较低的 API 级别上崩溃,例如 Marshmallow (API 23)。

    这是脱糖出现的时候。它允许较低的 API 级别使用新的 Java 库。我们将看看它是如何做到的,但在此之前,让我们启动 Android Studio 进行快速演示以使事情更清楚。

    要解决此问题,我们需要使用以下步骤在我们的项目中启用脱糖功能。

    1. 将 Android gradle 插件设置为 4.0 或更高版本。
    2. 在编译选项中,启用 coreLibraryDesugaringEnabled 标志并将 Java 目标和源兼容性设置为 Java 8。
    3. 在编译选项中,启用 coreLibraryDesugaringEnabled 标志并将 Java 目标和源兼容性设置为 Java 8。
    4. 启用 multidex(适用于支持 API 级别 20 或以下的项目)
    5. 添加脱糖依赖项。
       coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.5'
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-04
    • 2018-04-22
    • 1970-01-01
    • 2011-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多