java - 在 Android Dalvik VM 中加载 java.util.logging.LogManager 的类初始化问题

标签 java android jvm noclassdeffounderror dalvik

我已经在 Android native 库中进行了更改并安装了一个新的 system.img 文件,但现在在启动时出现了一个不相关的错误。我可以通过吞下错误来克服它,但我想知道是否有人可以解释问题所在。

The Android implementation of Logger.java claims因为它的类初始化代码执行必要的一次性设置,所以它正在强制初始化 LogManager。但是这种强制初始化会导致 NoClassDefFoundError。我认为这与 Zygote 尚未预加载的类有关,但对整个类加载器和 VM 业务并不熟悉。

如果有人有一些见解,将不胜感激。谢谢。


I/Zygote  ( 1253): Preloading classes...

D/skia    ( 1253): ------ build_power_table 1.4

D/skia    ( 1253): ------ build_power_table 0.714286

W/dalvikvm( 1253): Exception Ljava/lang/StackOverflowError; thrown during Ljava/util/logging/LogManager;.<clinit>

W/dalvikvm( 1253): Exception Ljava/lang/NoClassDefFoundError; thrown during Ljava/security/Security;.<clinit>

W/dalvikvm( 1253): Exception Ljava/lang/ExceptionInInitializerError; thrown during Landroid/net/http/HttpsConnection;.<clinit>

E/Zygote  ( 1253): Error preloading android.net.http.HttpsConnection.

E/Zygote  ( 1253): java.lang.ExceptionInInitializerError

E/Zygote  ( 1253): at java.lang.Class.classForName(Native Method)

E/Zygote  ( 1253): at java.lang.Class.forName(Class.java:237)

E/Zygote  ( 1253): at java.lang.Class.forName(Class.java:183)

E/Zygote  ( 1253): at com.android.internal.os.ZygoteInit.preloadClasses(ZygoteInit.java:295)

E/Zygote  ( 1253): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)

E/Zygote  ( 1253): at dalvik.system.NativeStart.main(Native Method)

E/Zygote  ( 1253): Caused by: java.lang.ExceptionInInitializerError

E/Zygote  ( 1253): at javax.net.ssl.KeyManagerFactory$1.run(KeyManagerFactory.java:57)

E/Zygote  ( 1253): at javax.net.ssl.KeyManagerFactory$1.run(KeyManagerFactory.java:56)

E/Zygote  ( 1253): at java.security.AccessController.doPrivilegedImpl(AccessController.java:264)

E/Zygote  ( 1253): at java.security.AccessController.doPrivileged(AccessController.java:84)

E/Zygote  ( 1253): at javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm(KeyManagerFactory.java:55)

E/Zygote  ( 1253): at org.apache.harmony.xnet.provider.jsse.SSLParameters.(SSLParameters.java:142)

E/Zygote  ( 1253): at org.apache.harmony.xnet.provider.jsse.SSLContextImpl.engineInit(SSLContextImpl.java:82)

E/Zygote  ( 1253): at android.net.http.HttpsConnection.initializeEngine(HttpsConnection.java:101)

E/Zygote  ( 1253): at android.net.http.HttpsConnection.(HttpsConnection.java:65)

E/Zygote  ( 1253): ... 6 more

E/Zygote  ( 1253): Caused by: java.lang.NoClassDefFoundError: java.util.logging.LogManager

E/Zygote  ( 1253): at java.util.logging.Logger.initHandler(Logger.java:419)

E/Zygote  ( 1253): at java.util.logging.Logger.log(Logger.java:1094)

E/Zygote  ( 1253): at java.util.logging.Logger.warning(Logger.java:906)

E/Zygote  ( 1253): at org.apache.harmony.luni.util.MsgHelp.loadBundle(MsgHelp.java:61)

E/Zygote  ( 1253): at org.apache.harmony.luni.util.Msg.getString(Msg.java:60)

E/Zygote  ( 1253): at java.io.BufferedInputStream.read(BufferedInputStream.java:316)

E/Zygote  ( 1253): at java.io.FilterInputStream.read(FilterInputStream.java:138)

E/Zygote  ( 1253): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:157)

E/Zygote  ( 1253): at java.io.BufferedInputStream.read(BufferedInputStream.java:243)

E/Zygote  ( 1253): at java.util.Properties.load(Properties.java:302)

E/Zygote  ( 1253): at java.security.Security$1.run(Security.java:80)

E/Zygote  ( 1253): at java.security.Security$1.run(Security.java:67)

E/Zygote  ( 1253): at java.security.AccessController.doPrivilegedImpl(AccessController.java:264)

E/Zygote  ( 1253): at java.security.AccessController.doPrivileged(AccessController.java:84)

E/Zygote  ( 1253): at java.security.Security.(Security.java:66)

E/Zygote  ( 1253): ... 15 more

W/dalvikvm( 1253): threadid=3: thread exiting with uncaught exception (group=0x2aac6170)

最佳答案

我认为关键实际上是这一行:

W/dalvikvm(1253):异常 Ljava/lang/StackOverflowError;在 Ljava/util/logging/LogManager 期间抛出;。

我的猜测是有一个 <clinit>在 HTML 转换吞噬的那一行的末尾。该消息是说,在 LogManager 类的类初始化期间,出现了 StackOverflowError。这导致该类不可用。后来,当 Logger.initHandler() 被调用时,系统返回 NoClassDefFoundError。

所以要弄清楚发生了什么,你需要处理那个 StackOverflowError。

关于java - 在 Android Dalvik VM 中加载 java.util.logging.LogManager 的类初始化问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2472289/

相关文章:

jvm - 运行 StarTeam 2008 Release 2 客户端时出现 “Could not create the Java virtual machine” 错误

Java 8 中的 Java 内存区域

java - 使用 Spring Framework 3 将文件上传到服务器并将文件存储到磁盘

java - Java中的二项式检验

java - MongoDb如何获取缺少属性的行

java - 连续运行shell脚本时JVM进入休眠状态

java - 哪些用例使临时 JMS 队列比持久队列更好?

Android Retrofit 预期 BEGIN_OBJECT 但在第 1 行第 1 列路径 $

android - 在 ndk 应用程序中访问 android 上下文

java - 如何先更新变量,然后在java中执行其余代码