当我尝试使用带有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&hl=en_US&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&hl=en_US&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);
}
}
答案 0 :(得分:5)
当进程尝试引用已分配给进程的内存段之外的内存时,会发生SIGSEGV信号或分段错误。这可以防止进程破坏手机上运行的其他进程以及Android本身。
我没有尝试自己重现问题,我建议您的代码可能会暴露HTC上运行的Dalvik JVM中的缺陷。
分段错误的一个很酷的事情是,您应该能够获得一个核心文件,该文件描述了故障发生时内存中进程的状态。
GNU调试器gdb可以读取核心文件,并将调用堆栈跟踪提供到发生分段错误的位置。因此,如果您可以找到相应的核心文件,那么向Android开发人员提交错误请求会很有用。一些研究应该揭示你是否可以从HTC的进程崩溃中获取核心文件。
从使代码工作的角度来看,我建议尝试不那么复杂的HTML,看看是否有效,然后逐步添加所需的html,以查看HTML中的特定更改是否暴露了缺陷。这对于Android开发人员在您提交给他们的任何错误报告中都很有用。