2010-03-18 29 views
5

我已經在Android本機庫中進行了更改,並安裝了一個新的system.img文件,但現在在啓動時出現無關的錯誤。我可以通過吞嚥錯誤來消除它,但我想知道是否有人可以解釋問題所在。類初始化問題在Android中加載java.util.logging.LogManager Dalvik VM

The Android implementation of Logger.java claims它強制LogManager被初始化,因爲它的類的init代碼執行必要的一次性設置。但是這個強制初始化會導致NoClassDefFoundError。我認爲這與尚未被Zygote預先加載的班級有關,但我們不熟悉整個班級裝載機和虛擬機業務。

如果有人有一些洞察力,它將不勝感激。謝謝。


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) 

+0

+1因爲你在SO上而你在該跟蹤中有一個* StackOverflowError *) – SyntaxT3rr0r 2010-03-18 18:11:09

回答

0

嘗試從frameworks/base/preloaded-classes中刪除違規類,然後重新構建框架並刷新設備。如果您從android.net.http中刪除所有日誌記錄類和類,您將有最佳成功機會。

這可能會產生微小的性能影響,因爲已刪除的類將不會在應用程序之間共享。

1

我認爲關鍵實際上是這一行:

W/dalvikvm(1253):異常Ljava /郎/的StackOverflowError;在Ljava/util/logging/LogManager中拋出;

我的猜測是在該行末尾有一個<clinit>,HTML轉換被吞噬了。該消息說,在LogManager類的類初始化期間,出現了StackOverflowError。這導致類不可用。稍後,當Logger.initHandler()被調用時,系統返回NoClassDefFoundError。

因此,要弄清楚發生了什麼,你需要得到一個StackOverflowError的句柄。

+0

當文本被粘貼到stackoverflow.com時發生HTML轉換。異常消息始終是class.method,其中類位於VM內部的「Lclassname」中。形成。它說「LogManager」的事實。而不是「LogManager。」表示方法名稱已被吞噬。 我的意思是clinit,而不是init。 – fadden 2010-03-19 19:45:08

+0

我看到你的意思是HTML轉換的stackoverflow文本;我的錯。 – 2010-03-21 06:04:58

0

正如fadden指出的,在LogManager的類初始化過程中,類加載器運行了一些其他具有stackoverflow的代碼,因此LogManager的類初始化失敗。

我不知道你有在Android的調試環境中使用什麼樣的工具,但我想:

  1. 設置的「java -verbose」相當於(是的,我知道dalvikvm是不是「真的「java。 - 但它可能具有相同類型的標誌)您正在尋找其他類作爲LogManager clinit的一部分加載的內容。
  2. 在LogManager類加載上設置一個斷點並遍歷代碼。
  3. 在StackOverflowError上設置斷點。日食有這種能力。在斷點視圖上尋找一個[J!] - 再一次不知道android調試環境是否具有這種能力,但它似乎相當基本。
  4. 查看logging.properties文件中列出的類 - 問題可能出現在其中一個類的clinit
  5. 嘗試一個空的logging.properties文件。
  6. 在LogManager.readConfiguration()中設置斷點以查看你是否得到了那麼多。
+0

不幸的是,在這裏不可能設置斷點 - 這是在虛擬機處於特殊的單線程模式時,在「zygote」初始化過程中發生的。這意味着調試器支持線程沒有運行,因此無法連接。 我曾經通過搞亂Harmony錯誤消息翻譯工具來解決這個問題。它進入了一個無限循環,試圖報告無法報告錯誤的錯誤。 理想情況下,StackOverflowError將成爲NoClassDefFoundError的原因,但NCDFE不會採取「原因」。 – fadden 2010-03-26 17:49:47

+0

看着蹤跡 - 我瘋狂的猜測是在Logging配置中引用了一個不存在的類。 但看着堆棧跟蹤,我看到「org.apache.harmony.luni.util.MsgHelp.loadBundle(MsgHelp.java:61)」的引用「 – Pat 2010-03-26 19:35:43