实际上,更准确的说法是:



我正在尝试实现一个基于WebView的浏览器,主要是出于学习目的(市场上太多了,为什么要添加一个?),而我能以多快的速度开发出基本的浏览器,给我留下了深刻的印象。我在Samsung Continuum手机上的许多站点上对其进行了测试,除了 m.allrecipes.com之外,它们都可以正常工作,

每当我尝试加载该网页时,都会收到以下NullPointerException:

E/AndroidRuntime(3147): FATAL EXCEPTION: http10
E/AndroidRuntime(3147): java.lang.NullPointerException
E/AndroidRuntime(3147):     at android.net.http.CertificateChainValidator.doHandshakeAndValidateServerCertificates(CertificateChainValidator.java:194)
E/AndroidRuntime(3147):     at android.net.http.HttpsConnection.openConnection(HttpsConnection.java:308)
E/AndroidRuntime(3147):     at android.net.http.Connection.openHttpConnection(Connection.java:358)
E/AndroidRuntime(3147):     at android.net.http.Connection.processRequests(Connection.java:219)
E/AndroidRuntime(3147):     at android.net.http.ConnectionThread.run(ConnectionThread.java:113)

在我的代码中找不到对此的解释,我试图查看其他浏览器在Samsung Continuum上访问m.allrecipes.com时的行为:

这些发现非常有趣:Dolphin,Opera,iBrowser和其他人的没问题,但却没有问题。

但是Free Private BrowserVoice BrowserEasy Browser都在使用完全相同的堆栈跟踪访问m.allrecipes.com时立即崩溃。

因此,如果您可以将手放在Samsung Continuum SCH-i400单元上,则很容易重现此问题。

我知道解决此问题的最快,最简单的方法是使用其他浏览器或摆脱手机。但是我希望了解的问题根源,因为它可能指出在使用WebKit时可能会出现的潜在问题,可能还会在其他手机上使用。

所以我的问题基本上是:
  • m.allrecipes.com中有什么特别之处,它会触发此WebKit+Continuum错误?
  • Samsung Continuum SCH-i400中有什么特别之处,以至于它仅在此网站上并且仅在基于WebKit的浏览器上失败?
  • WebKit中有什么特别之处,以至于它不喜欢Continuum+allrecipes.com的组合。
  • 是否有其他网站会触发此行为?

  • 根据@sarnold的建议从Free Private Browser添加日志:
    :13.195: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans, style = 0, uniqueID = 1
    :13.199: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans, style = 1, uniqueID = 2
    :13.199: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Serif, style = 0, uniqueID = 3
    :13.207: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Serif, style = 1, uniqueID = 4
    :13.207: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Serif, style = 2, uniqueID = 5
    :13.207: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Serif, style = 3, uniqueID = 6
    :13.207: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans Mono, style = 0, uniqueID = 7
    :13.211: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans Arabic, style = 0, uniqueID = 8
    :13.211: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans Hebrew, style = 0, uniqueID = 9
    :13.211: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans Thai, style = 0, uniqueID = 10
    :13.211: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans, style = 0, uniqueID = 11
    :13.215: D/SKIA_FONT(5973): load_system_fonts(), name = Droid Sans Fallback, style = 0, uniqueID = 12
    :13.215: D/SKIA_FONT(5973): load_system_fonts(), oldSansUID = 0, newSansUID = 1
    :13.215: D/SKIA_FONT(5973): load_system_fonts(), oldSansBoldUID = 0, newSansBoldUID = 2
    :13.308: D/dalvikvm(5973): GC_EXTERNAL_ALLOC freed 3163 objects / 205880 bytes in 13ms
    :13.566: I/Ads(5973): To get test ads on this device, call adRequest.addTestDevice("BE8FFE83C668E44B60E7CBD947D7D226");
    :13.590: D/dalvikvm(5973): GC_FOR_MALLOC freed 7592 objects / 361280 bytes in 11ms
    :13.597: I/Ads(5973): adRequestUrlHtml: <html><head><script src="http://media.admob.com/sdk-core-v40.js"></script><script>AFMA_buildAdURL({"preqs":0,"u_sd":1.375,"slotname":"a14c2366fe4baa1","u_w":349,"msid":"com.JamesBecwar.FreePrivateBrowser","cap":"m","js":"afma-sdk-a-v4.3.1","mv":"8013013.com.android.vending","isu":"BE8FFE83C668E44B60E7CBD947D7D226","cipa":0,"format":"320x50_mb","net":"wi","app_name":"28.android.com.JamesBecwar.FreePrivateBrowser","hl":"en","u_h":581,"u_audio":1});</script></head><body></body></html>
    :14.211: W/webcore(5973): Can't get the viewWidth after the first layout
    :14.640: I/Ads(5973): Received ad url: <"url": "http://googleads.g.doubleclick.net:80/mads/gma?preqs=0&u_sd=1.375&slotname=a14c2366fe4baa1&u_w=349&msid=com.JamesBecwar.FreePrivateBrowser&cap=m&js=afma-sdk-a-v4.3.1&mv=8013013.com.android.vending&isu=BE8FFE83C668E44B60E7CBD947D7D226&cipa=0&format=320x50_mb&net=wi&app_name=28.android.com.JamesBecwar.FreePrivateBrowser&hl=en&u_h=581&u_audio=1&u_so=p&output=html&region=mobile_app&u_tz=300&ex=1&client_sdk=1&pto=0&caps=interactiveVideo_clickTracking_sdkAdmobApiForAds&jsv=27", "afmaNotifyDt": "null">
    :14.769: W/Ads(5973): IOException connecting to ad url.
    :14.769: W/Ads(5973): java.net.ConnectException: googleads.g.doubleclick.net/127.0.0.1:80 - Connection refused
    :14.769: W/Ads(5973):   at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:254)
    :14.769: W/Ads(5973):   at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
    :14.769: W/Ads(5973):   at java.net.Socket.connect(Socket.java:1074)
    :14.769: W/Ads(5973):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
    :14.769: W/Ads(5973):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
    :14.769: W/Ads(5973):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
    :14.769: W/Ads(5973):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
    :14.769: W/Ads(5973):   at com.google.ads.b.run(SourceFile:280)
    :14.769: W/Ads(5973):   at java.lang.Thread.run(Thread.java:1096)
    :14.812: D/webviewglue(5973): nativeDestroy view: 0x324d00
    :14.816: I/Ads(5973): onFailedToReceiveAd(A network error occurred.)
    :15.574: D/dalvikvm(5973): GC_FOR_MALLOC freed 5178 objects / 598576 bytes in 25ms
    :15.578: D/webviewglue(5973): nativeDestroy view: 0x2634a0
    :17.351: I/Database(5973): sqlite returned: error code = 14, msg = cannot open file at source line 25467
    :17.359: E/geolocationService(5973): Caught security exception registering for location updates from system. This should only happen in DumpRenderTree.
    :41.011: D/dalvikvm(5973): GC_FOR_MALLOC freed 5959 objects / 981064 bytes in 15ms
    :42.015: I/Web Console(5973): Omniture: s.t, instance: 1 at http://images.media-allrecipes.com/js/omni/ar_s_code.js?v=5:23
    :42.015: I/Web Console(5973): [object Object] at http://images.media-allrecipes.com/js/omni/ar_s_code.js?v=5:24
    :42.699: W/dalvikvm(5973): threadid=12: thread exiting with uncaught exception (group=0x4001d7f0)
    :42.703: E/AndroidRuntime(5973): FATAL EXCEPTION: http1
    :42.703: E/AndroidRuntime(5973): java.lang.NullPointerException
    :42.703: E/AndroidRuntime(5973):    at android.net.http.CertificateChainValidator.doHandshakeAndValidateServerCertificates(CertificateChainValidator.java:194)
    :42.703: E/AndroidRuntime(5973):    at android.net.http.HttpsConnection.openConnection(HttpsConnection.java:308)
    :42.703: E/AndroidRuntime(5973):    at android.net.http.Connection.openHttpConnection(Connection.java:358)
    :42.703: E/AndroidRuntime(5973):    at android.net.http.Connection.processRequests(Connection.java:219)
    :42.703: E/AndroidRuntime(5973):    at android.net.http.ConnectionThread.run(ConnectionThread.java:113)
    :42.773: W/dalvikvm(5973): threadid=22: thread exiting with uncaught exception (group=0x4001d7f0)
    :42.781: I/Process(5973): Sending signal. PID: 5973 SIG: 9
    

    还有Voice Browser的日志:
    :44.226: I/dalvikvm(6273): Jit: resizing JitTable from 4096 to 8192
    :44.226: D/dalvikvm(6273): GC_FOR_MALLOC freed 13956 objects / 744856 bytes in 29ms
    :45.730: I/Web Console(6273): Omniture: s.t, instance: 1 at http://images.media-allrecipes.com/js/omni/ar_s_code.js?v=5:23
    :45.734: I/Web Console(6273): [object Object] at http://images.media-allrecipes.com/js/omni/ar_s_code.js?v=5:24
    :46.707: W/dalvikvm(6273): threadid=14: thread exiting with uncaught exception (group=0x4001d7f0)
    :46.718: E/AndroidRuntime(6273): FATAL EXCEPTION: http2
    :46.718: E/AndroidRuntime(6273): java.lang.NullPointerException
    :46.718: E/AndroidRuntime(6273):    at android.net.http.CertificateChainValidator.doHandshakeAndValidateServerCertificates(CertificateChainValidator.java:194)
    :46.718: E/AndroidRuntime(6273):    at android.net.http.HttpsConnection.openConnection(HttpsConnection.java:308)
    :46.718: E/AndroidRuntime(6273):    at android.net.http.Connection.openHttpConnection(Connection.java:358)
    :46.718: E/AndroidRuntime(6273):    at android.net.http.Connection.processRequests(Connection.java:219)
    :46.718: E/AndroidRuntime(6273):    at android.net.http.ConnectionThread.run(ConnectionThread.java:113)
    :46.718: W/dalvikvm(6273): threadid=15: thread exiting with uncaught exception (group=0x4001d7f0)
    

    Easy Browser:
    :11.597: D/dalvikvm(6557): GC_FOR_MALLOC freed 10496 objects / 629992 bytes in 57ms
    :11.605: D/webviewglue(6557): nativeDestroy view: 0x25c8e8
    :11.609: W/IInputConnectionWrapper(6557): getCursorCapsMode on inactive InputConnection
    :11.640: I/Ads(6557): adRequestUrlHtml: <html><head><script src="http://www.gstatic.com/afma/sdk-core-v40.js"></script><script>AFMA_buildAdURL({"preqs":1,"u_sd":1.375,"slotname":"a14f3f6bc126143","u_w":349,"msid":"easy.browser","cap":"m","js":"afma-sdk-a-v4.1.1","isu":"BE8FFE83C668E44B60E7CBD947D7D226","format":"320x50_mb","net":"wi","app_name":"23.android.easy.browser","hl":"en","u_h":581,"u_audio":1});</script></head><body></body></html>
    :11.664: W/IInputConnectionWrapper(6557): getCursorCapsMode on inactive InputConnection
    :11.730: W/IInputConnectionWrapper(6557): finishComposingText on inactive InputConnection
    :11.867: W/webcore(6557): Can't get the viewWidth after the first layout
    :12.051: I/Ads(6557): Received ad url: <"url": "http://googleads.g.doubleclick.net:80/mads/gma?preqs=1&u_sd=1.375&slotname=a14f3f6bc126143&u_w=349&msid=easy.browser&cap=m&js=afma-sdk-a-v4.1.1&isu=BE8FFE83C668E44B60E7CBD947D7D226&format=320x50_mb&net=wi&app_name=23.android.easy.browser&hl=en&u_h=581&u_audio=1&u_so=p&output=html&region=mobile_app&u_tz=300&ex=1&client_sdk=1&askip=1&caps=clickTracking_sdkAdmobApiForAds&jsv=27", "afmaNotifyDt": "null">
    :12.086: W/Ads(6557): IOException connecting to ad url.
    :12.086: W/Ads(6557): java.net.ConnectException: googleads.g.doubleclick.net/127.0.0.1:80 - Connection refused
    :12.086: W/Ads(6557):   at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:254)
    :12.086: W/Ads(6557):   at org.apache.harmony.luni.net.PlainSocketImpl.connect(PlainSocketImpl.java:533)
    :12.086: W/Ads(6557):   at java.net.Socket.connect(Socket.java:1074)
    :12.086: W/Ads(6557):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnection.<init>(HttpConnection.java:62)
    :12.086: W/Ads(6557):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpConnectionPool.get(HttpConnectionPool.java:88)
    :12.086: W/Ads(6557):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.getHTTPConnection(HttpURLConnectionImpl.java:927)
    :12.086: W/Ads(6557):   at org.apache.harmony.luni.internal.net.www.protocol.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:909)
    :12.086: W/Ads(6557):   at b.run(Unknown Source)
    :12.086: W/Ads(6557):   at java.lang.Thread.run(Thread.java:1096)
    :12.086: D/webviewglue(6557): nativeDestroy view: 0x382ff0
    :12.086: I/Ads(6557): onFailedToReceiveAd(A network error occurred.)
    :13.890: I/Web Console(6557): Omniture: s.t, instance: 1 at http://images.media-allrecipes.com/js/omni/ar_s_code.js?v=5:23
    :13.894: I/Web Console(6557): [object Object] at http://images.media-allrecipes.com/js/omni/ar_s_code.js?v=5:24
    :14.687: W/dalvikvm(6557): threadid=21: thread exiting with uncaught exception (group=0x4001d7f0)
    :14.687: W/System.err(6557): java.lang.NullPointerException
    :14.687: W/System.err(6557):    at android.net.http.CertificateChainValidator.doHandshakeAndValidateServerCertificates(CertificateChainValidator.java:194)
    :14.687: W/System.err(6557):    at android.net.http.HttpsConnection.openConnection(HttpsConnection.java:308)
    :14.687: W/System.err(6557):    at android.net.http.Connection.openHttpConnection(Connection.java:358)
    :14.687: W/System.err(6557):    at android.net.http.Connection.processRequests(Connection.java:219)
    :14.687: W/System.err(6557):    at android.net.http.ConnectionThread.run(ConnectionThread.java:113)
    

    最佳答案

    顺便说一句,我想您的Continuum仍在运行Android 2.1。



    在Android 2.1模拟器中,出现“此证书不是来自受信任的授权机构”对话框,但不会崩溃。 Android 2.1可能不支持StartCom的根证书(如果我正确阅读此证书,则是有问题的授权机构)。

    According to this issue是StartCom的根证书,已在Android 2.2中添加,并且在4.0.3仿真器中进行的快速测试不会引发错误对话框。



    三星可能在android.net包中进行了一些调整,并破坏了它,也许专门与粗略的SSL证书相关联。任何基于WebView的浏览器都将通过相同的代码路径运行;拥有自己的HTML渲染器的每个人都可能没有,如果他们自己处理SSL证书等。



    从技术上讲,什么都不做,基于堆栈跟踪。您会注意到其中没有特定于WebKit的内容。这最多是一个WebKit-on-Android问题。而且,如上所述,它可能是三星所特有的。



    也许可以从较小的证书颁发机构那里找到其他带有证书的证书。

    10-05 22:43
    查看更多