views:

667

answers:

5

I've done changes in an Android native library and installed a new system.img file but am now getting an unrelated Error on startup. I can get past it by swallowing the error but I wanted to know if anyone can explain what the issue is.

The Android implementation of Logger.java claims that it is Forcing the LogManager to be initialized since its class init code performs necessary one-time setup. But this forced initialization results in a NoClassDefFoundError. I'm thinking that it has something to do with the class not having been preloaded by Zygote yet but am not that familiar with the whole class loaders and VM business.

If anyone has some insight it would be greatly appreciated. Thanks.


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)

A: 

Try removing the offending classes from frameworks/base/preloaded-classes, then rebuild the framework, and flash your device. You'll have the best chance at success if you remove all logging classes and classes from android.net.http.

This may have a tiny performance impact because the removed classes will not be shared between applications.

Jesse Wilson
+1  A: 

I think the key is actually this line:

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

My guess is there's a <clinit> at the end of that line that the HTML conversion swallowed up. The message is saying that, during class initialization of the LogManager class, there was a StackOverflowError. This caused the class to be unavailable. Later on, when Logger.initHandler() got called, the system returned NoClassDefFoundError.

So to figure out what's going on, you need to get a handle on that StackOverflowError.

fadden
The HTML conversion happened when the text was pasted into stackoverflow.com. The exception message is always class.method, where the class is in the VM-internal "Lclassname;" form. The fact that it says "LogManager." rather than "LogManager.<clinit>" indicates that the method name was gobbled up.I did mean clinit, not init.
fadden
I see you meant the stackoverflow text to html conversion; my mistake.
Pierre-Antoine LaFayette
A: 

As fadden was indicating, during the class initialization of LogManager, the class loader ran some other code that had a stackoverflow and thus the class initialization of LogManager failed.

I don't know what tools you have available in the android debug environment, but I would:

  1. set the equivalent of "java -verbose" (yes I know that dalvikvm isn't "really" java. - but it probably has the same sort of flag ) You are looking for what other classes get loaded as part of the LogManager clinit.
  2. set a breakpoint on LogManager classloading and step through the code.
  3. set a breakpoint on StackOverflowError. eclipse has this ability. Look for a [J!] on the breakpoint view - once again don't know if android debug environment has this capability, but it seems rather basic.
  4. Look at the classes listed in the logging.properties file - problem might be in one of those classes' clinit
  5. try an empty logging.properties file.
  6. set breakpoint in LogManager.readConfiguration() to see if you get that far.
Pat
Unfortunately, setting a breakpoint isn't possible here -- this is happening during "zygote" initialization, when the VM is in a special single-threaded mode. This means the debugger support thread isn't running, so there's no way to connect in.I once got into this situation by screwing up the Harmony error message translation facility. It went into an infinite loop trying to report an error about being unable to report an error.Ideally the StackOverflowError would be in the cause for the NoClassDefFoundError, but NCDFE doesn't take a "cause".
fadden
Well looking at the trace - my wild ass guess is that there is a class referenced in the Logging configuration that does not exist.But looking at the stack trace I do see a reference to "org.apache.harmony.luni.util.MsgHelp.loadBundle(MsgHelp.java:61)"
Pat
A: 

I am seeing a similar issue on Eclair build were you able to resolve this issue... I am suspecting build environment issue while building system.img. Can you kindly share your insights.

Thanks in Advance! Chetan

Chetan
I don't see this issue anymore but at the time I simply added a try and catch to swallow the error in LogManager.
Pierre-Antoine LaFayette
A: 

Hi all many thanks for inputs on this issue. I see that on build with this issue logger.properties and other .properties files are missing from javalib.jar file in /out/target/common/obj/JAVA_LIBRARIES/core_intermediates/javalib.jar.

does this ring any bells :(

Chetan
one of the other files missing is org/apache/harmony/xnet/internal/nls/messages.properties
Chetan