5

Android ネイティブ ライブラリに変更を加え、新しい system.img ファイルをインストールしましたが、起動時に関係のないエラーが発生しています。エラーを飲み込むことでそれを乗り越えることができますが、誰かが問題を説明できるかどうか知りたかったのです。

Logger.java の Android 実装は、そのクラスの初期化コードが必要な 1 回限りのセットアップを実行するため、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)

4

3 に答える 3

1

キーは実際にはこの行だと思います:

W/dalvikvm (1253): 例外 Ljava/lang/StackOverflowError; Ljava/util/logging/LogManager; 中にスローされます。

私の推測では<clinit>、その行の最後に、HTML 変換が飲み込んだ があります。このメッセージは、LogManager クラスのクラス初期化中に StackOverflowError が発生したことを示しています。これにより、クラスが利用できなくなりました。その後、Logger.initHandler() が呼び出されると、システムは NoClassDefFoundError を返しました。

そのため、何が起こっているのかを把握するには、その StackOverflowError のハンドルを取得する必要があります。

于 2010-03-19T17:46:57.180 に答える
0

Frameworks/base/preloaded-classes から問題のあるクラスを削除してから、フレームワークを再構築し、デバイスをフラッシュしてみてください。android.net.http からすべてのロギング クラスとクラスを削除すると、成功する可能性が最も高くなります。

削除されたクラスはアプリケーション間で共有されないため、これはパフォーマンスにわずかな影響を与える可能性があります。

于 2010-03-19T01:34:37.493 に答える