1. 程式人生 > >Android6.0 WebView播放視訊原始碼分析

Android6.0 WebView播放視訊原始碼分析

        最近因為專案的需要研究一下WebView播放視訊的呼叫過程。同時也對研究問題的方法有了新的認識,研究問題應該先有自己的研究主題,應該從易到難,由表及裡(好像初中、還是高中政治中說過這個,最近才明白,哈哈),不能違背這個定律,要不然自己會越研究越糊塗,也會很有挫敗感。這篇部落格就想從簡單的問題和現象開始然後通過日誌來證明自己的判斷。

        問題: WebView播放視訊是呼叫自帶的播放器還是呼叫Android的系統的播放器?

        方法:

                    1、先從WebView開始,具體如下圖:

                        

                          1)  WebViewFactory是對WebViewFactoryProvider的工廠類,是WebView主要的實現類。

                          2)  NullWebViewFactoryProvider什麼都沒有做,應該是預留的吧。

                          3)  WebViewChromiumFactoryProvider是呼叫Chromium。通過這個可以看出來,Android6.0已經切到Chrome核心了。

                        注意:WebViewChromiumFactoryProvider類在Andrid6.0中是找不到原始碼的,費了九牛二虎之力終於在external/chrome-weview 查詢到webview.apk。通過反編譯看到Chromium相關的程式碼。

                          以上是webView簡單的流程,是通過研究程式碼可以得到的。

             2. Chromium原始碼內呼叫視訊的個過程, 日誌如下:

                09-25 14:28:28.119 1821-2699/ D/MediaResourceGetter: ethernet/wifi connection detected
                09-25 14:28:28.206 1821-2699/ E/MediaResourceGetter: Error configuring data source: setDataSource failed: status = 0x80000000
                09-25 14:28:28.206 1821-2699/ E/MediaResourceGetter: Unable to configure metadata extractor  

                通過日誌可以發現呼叫Chromium中的MediaResourceGetter類。通過原始碼搜尋只能找到第一處日誌的列印程式碼,其他兩處都找不到。該問題的分析不能進行下。

            3. 最後通過檢視日誌發現webView最後的呼叫MediaPlayer,日誌如下:

                 09-11 14:34:24.334 13625-13625/com.smartcar.nightmode.browser W/MediaPlayer: Couldn't open file on client side; trying server side:           java.io.FileNotFoundException: No content provider: http://img0.singulato.com/video/goods.mp4
                 09-11 14:34:25.584 13625-13625/com.smartcar.nightmode.browser D/MediaPlayer: setSubtitleAnchor in MediaPlayer
                 09-11 14:34:25.593 13625-13625/com.smartcar.nightmode.browser D/MediaPlayer: getMetadata
                 09-11 14:34:25.835 13625-13770/com.smartcar.nightmode.browser W/MediaPlayer: info/warning (3, 0)

                 同時通過程式碼簡單實現VideoView播放本地視訊,抓取日誌如下:

                  09-11 14:32:05.980 12855-12919/com.test I/OpenGLRenderer: Initialized EGL, version 1.4
                  09-11 14:32:05.981 12855-12919/com.test W/OpenGLRenderer: Failed to choose config with EGL_SWAP_BEHAVIOR_PRESERVED, retrying without...
                  09-11 14:32:06.064 12855-12855/com.test W/MediaPlayer: Couldn't open file on client side; trying server side: java.io.FileNotFoundException: No content provider: http://img0.singulato.com/video/goods.mp4
                  09-11 14:32:09.197 12855-12855/com.test D/MediaPlayer: getMetadata
                  09-11 14:32:09.448 12855-12867/com.test W/MediaPlayer: info/warning (3, 0)
  

                 通過以上日誌對比基本上可以斷定:webview播放視訊最後呼叫的是Android本身的播放器。