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

类初始化问题在Android Dalvik VM中加载java.util.logging.LogManager,java,android,jvm,noclassdeffounderror,dalvik,Java,Android,Jvm,Noclassdeffounderror,Dalvik,我已经在Android本机库中进行了更改,并安装了一个新的system.img文件,但现在在启动时出现了一个不相关的错误。我可以通过接受错误来克服它,但我想知道是否有人可以解释问题是什么 它强制LogManager初始化,因为它的类初始化代码执行必要的一次性设置。但这种强制初始化会导致NoClassDefFoundError。我认为这与类还没有被Zygote预加载有关,但我对整个类装入器和VM业务还不太熟悉 如果有人有一些见解,我们将不胜感激。谢谢 I/Zygote ( 1253): Pre

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

它强制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)


I/合子(1253):预加载类。。。
D/skia(1253):----建筑动力表1.4
D/skia(1253):----建造动力表0.714286
W/dalvikvm(1253):异常Ljava/lang/StackOverflowerr;在Ljava/util/logging/LogManager;期间引发;。
W/dalvikvm(1253):异常Ljava/lang/NoClassDefFoundError;在Ljava/security/security;期间引发;。
W/dalvikvm(1253):异常Ljava/lang/exceptionininitializerror;在Landroid/net/http/HttpsConnection;期间引发;。
E/Zygote(1253):预加载android.net.http.HttpsConnection时出错。
E/zyote(1253):java.lang.ExceptionInInitializeError
E/Zygote(1253):位于java.lang.Class.classForName(本机方法)
E/zyote(1253):位于java.lang.Class.forName(Class.java:237)
E/zyote(1253):位于java.lang.Class.forName(Class.java:183)
E/Zygote(1253):位于com.android.internal.os.ZygoteInit.preloadClasses(ZygoteInit.java:295)
E/Zygote(1253):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:590)
E/合子(1253):在dalvik.system.NativeStart.main(本地方法)
E/合子(1253):由以下原因引起:java.lang.ExceptionInInitializerError
E/Zygote(1253):位于javax.net.ssl.KeyManagerFactory$1.run(KeyManagerFactory.java:57)
E/Zygote(1253):位于javax.net.ssl.KeyManagerFactory$1.run(KeyManagerFactory.java:56)
E/Zygote(1253):位于java.security.AccessController.doPrivilegedImpl(AccessController.java:264)
E/Zygote(1253):位于java.security.AccessController.doPrivileged(AccessController.java:84)
E/Zygote(1253):位于javax.net.ssl.KeyManagerFactory.getDefaultAlgorithm(KeyManagerFactory.java:55)
E/Zygote(1253):位于org.apache.harmony.xnet.provider.jsse.SSLParameters(SSLParameters.java:142)
E/Zygote(1253):位于org.apache.harmony.xnet.provider.jsse.SSLContextImpl.engineInit(SSLContextImpl.java:82)
E/zyote(1253):位于android.net.http.HttpsConnection.initializeEngine(HttpsConnection.java:101)
E/zyote(1253):位于android.net.http.HttpsConnection(HttpsConnection.java:65)
E/合子(1253):。。。还有6个
E/Zygote(1253):由以下原因引起:java.lang.NoClassDefFoundError:java.util.logging.LogManager
E/Zygote(1253):位于java.util.logging.Logger.initHandler(Logger.java:419)
E/Zygote(1253):位于java.util.logging.Logger.log(Logger.java:1094)
E/Zygote(1253):位于java.util.logging.Logger.warning(Logger.java:906)
E/Zygote(1253):位于org.apache.harmony.luni.util.MsgHelp.loadBundle(MsgHelp.java:61)
E/Zygote(1253):位于org.apache.harmony.luni.util.Msg.getString(Msg.java:60)
E/zyote(1253):在java.io.BufferedInputStream.read(BufferedInputStream.java:316)处
E/Zygote(1253):位于java.io.filternputstream.read(filternputstream.java:138)
E/zyote(1253):位于java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:157)
E/zyote(1253):位于java.io.BufferedInputStream.read(BufferedInputStream.java:243)
E/Zygote(1253):位于java.util.Properties.load(Properties.java:302)
E/Zygote(1253):java.security.security$1.run(security.java:80)
E/Zygote(1253):java.security.security$1.run(security.java:67)
E/Zygote(1253):位于java.security.AccessController.doPrivilegedImpl(AccessController.java:264)
E/Zygote(1253):位于java.security.AccessController.doPrivileged(AccessController.java:84)
E/Zygote(1253):at java.security.security.(security.java:66)
E/合子(1253):。。。还有15个
W/dalvikvm(1253):threadid=3:线程退出时出现未捕获异常(组=0x2aac6170)

尝试从框架/基本/预加载的类中删除有问题的类,然后重建框架,并刷新设备。如果从android.net.http中删除所有日志类和类,您将有最大的成功机会


这可能会对性能产生微小的影响,因为删除的类不会在应用程序之间共享。

我认为关键在于这一行:

W/dalvikvm(1253):异常Ljava/lang/StackOverflowerr;在Ljava/util/logging/LogManager;期间引发

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


因此,为了弄清楚发生了什么,您需要获得StackOverflower错误的句柄。

正如fadden所指出的,在LogManager的类初始化期间,类装入器运行了其他一些具有stackoverflow的代码,因此LogManager的类初始化失败

我不知道android调试环境中有哪些可用工具,但我会:

  • 设置相当于“java-verbose”(是的,我知道dalvikvm不是“真正的”java。-但它可能具有相同的标志)您正在查找作为LogManager clinit的一部分加载的其他类
  • 在LogManager类加载上设置一个断点并单步执行代码
  • 在StackOverflowerError上设置断点。eclipse具有这种能力。在breakpoint视图中查找[J!],再次不知道android调试环境是否具有此功能,但它似乎相当基本
  • 查看logging.properties文件中列出的类-问题可能是