SIGSEGV将HTML + Flash加载到WebView中

时间:2011-03-20 23:53:10

标签: android flash webview

当我尝试使用带有loadDataWithBaseURL且PluginState设置为PluginState.ON的嵌入式Flash插件(主要是youtube)将HTML加载到WebView中时,我收到了SIGSEGV信号。我能用一个简单的测试用例重现错误。请参阅以下代码:

package ians.android2;

import android.app.Activity;
import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebSettings;

public class TestAndroid extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    WebView wv = (WebView)findViewById(R.id.webview);
    wv.getSettings().setPluginState(WebSettings.PluginState.ON);

    String html = "";
    html += "<object width=\"620\" height=\"376\">";
    html += "<param name=\"movie\" value=\"http://www.youtube.com/v/C4KdcRHoXOA?fs=1&amp;hl=en_US&amp;rel=0\"></param>";
    html += "<param name=\"allowFullScreen\" value=\"true\"></param>";
    html += "<param name=\"allowscriptaccess\" value=\"always\"></param>";
    html += "<embed src=\"http://www.youtube.com/v/C4KdcRHoXOA?fs=1&amp;hl=en_US&amp;rel=0\" type=\"application/x-shockwave-flash\" allowscriptaccess=\"always\" allowfullscreen=\"true\" width=\"620\" height=\"376\"></embed>";
    html += "</object>";

    wv.loadDataWithBaseURL("notreal/", html, "text/html", "utf-8", null);
    }
}

1 个答案:

答案 0 :(得分:5)

当进程尝试引用已分配给进程的内存段之外的内存时,会发生SIGSEGV信号或分段错误。这可以防止进程破坏手机上运行的其他进程以及Android本身。

我没有尝试自己重现问题,我建议您的代码可能会暴露HTC上运行的Dalvik JVM中的缺陷。

分段错误的一个很酷的事情是,您应该能够获得一个核心文件,该文件描述了故障发生时内存中进程的状态。

GNU调试器gdb可以读取核心文件,并将调用堆栈跟踪提供到发生分段错误的位置。因此,如果您可以找到相应的核心文件,那么向Android开发人员提交错误请求会很有用。一些研究应该揭示你是否可以从HTC的进程崩溃中获取核心文件。

从使代码工作的角度来看,我建议尝试不那么复杂的HTML,看看是否有效,然后逐步添加所需的html,以查看HTML中的特定更改是否暴露了缺陷。这对于Android开发人员在您提交给他们的任何错误报告中都很有用。