Проблемы с инициализацией класса при загрузке java.util.logging.LogManager в Android Dalvik VM - PullRequest
5 голосов
/ 18 марта 2010

Я внес изменения в собственную библиотеку Android и установил новый файл system.img, но теперь получаю несвязанную ошибку при запуске.Я могу обойти это, проглотив ошибку, но я хотел знать, может ли кто-нибудь объяснить, в чем проблема.

Реализация Android в Logger.java утверждает , что она заставляет LogManagerбыть инициализированным, так как его код инициализации класса выполняет необходимую однократную настройку.Но эта принудительная инициализация приводит к 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)

Ответы [ 3 ]

1 голос
/ 19 марта 2010

Я думаю, что ключ на самом деле эта строка:

W / dalvikvm (1253): Exception Ljava / lang / StackOverflowError;брошенный во время Ljava / util / logging / LogManager;.

Я предполагаю, что в конце этой строки есть <clinit>, который преобразуется в HTML-преобразование.В сообщении говорится, что во время инициализации класса LogManager возникла ошибка StackOverflowError.Это сделало класс недоступным.Позже, когда был вызван Logger.initHandler (), система возвратила NoClassDefFoundError.

Итак, чтобы выяснить, что происходит, вам нужно получить указатель на этот StackOverflowError.

0 голосов
/ 26 марта 2010

Как указывал Фадден, во время инициализации класса LogManager загрузчик классов запустил некоторый другой код, который имел стекопоток, и, следовательно, инициализация класса LogManager завершилась неудачно.

Я не знаю, какие инструменты у вас есть в среде отладки Android, но я бы:

  1. установить эквивалент «java -verbose» (да, я знаю, что dalvikvm не «действительно» java. Но, вероятно, он имеет такой же тип флага). Вы ищете, какие другие классы загружаются как часть Клиника LogManager.
  2. установить точку останова при загрузке классов LogManager и выполнить пошаговое выполнение кода.
  3. установить точку останова на StackOverflowError. затмение имеет эту способность. Ищите [J!] В представлении точки останова - еще раз не знаю, есть ли у среды отладки Android эта возможность, но она кажется довольно простой.
  4. Посмотрите на классы, перечисленные в файле logging.properties - проблема может быть в одном из этих классов
  5. попробуйте пустой файл logging.properties.
  6. установить точку останова в LogManager.readConfiguration (), чтобы проверить, насколько это далеко.
0 голосов
/ 19 марта 2010

Попробуйте удалить нарушающие классы из frameworks / base / preloaded-classes, затем пересоберите фреймворк и прошейте свое устройство. У вас будет больше шансов на успех, если вы удалите все классы журналирования и классы из android.net.http.

Это может оказать незначительное влияние на производительность, поскольку удаленные классы не будут распределены между приложениями.

...