- 浏览: 926490 次
- 性别:
- 来自: 上海
最新评论
-
liu149339750:
我勒个去,搜到你的博客了,关注!
Android make脚本简记 -
ihopethatwell:
楼主,这个修改时间有个问题,退出修改界面就不保存设置的时间了, ...
Android中如何修改系统时间(应用程序获得系统权限) -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
flyar520:
你好...我也遇到屏幕半屏刷成黑屏的问题...但是我的时在开机 ...
Android横屏状态下返回到壁纸界面屏幕刷新问题 -
taowayi:
推荐android一键反编译神器 apkdec
Android apk反编译
前不久发现android默认没有放开对wml的支持,这样就导致某些网站无法访 问,从网上搜索到的文档都说只要ENABLE_WML=1就可以支持,但是我把ENABLE_WML设置成1之后,就出现了编译通不过的情况,经过一番调 试,最终可以编译并且实现了对wml的支持。
2. Windows
必备条件把Webkit编译通过了,具体参考webkit.org上的说明,把必须的SDK,patch都安装了。
VC2005和VC Express 2005都能编过,安装VC的几个patch能大大提升编译速度,磨刀不误砍柴功。
编译成功后默认wml是关闭的,修改如下几个文件,把wml相关配置(ENABLE_WML)打开
FeatureDefines.xcconfig
GNUmakefile.am
configure.ac
features.pri
FeatureDefines.vsprops
这时开始编译,必然会失败,停在webcore编译上,提示如下:
WMLElementFactory.cpp 中ConstructorFunction重定义
然后关键的两步:
1.找到DerivedSources.cpp,注释掉如下两行
//#include "WMLElementFactory.cpp"
//#include "WMLNames.cpp"
2. 修改webcore.vcproj,把上面两个文件参与编译(关闭“从生成中排除”)。
这样就能编译成功了。
下面主要纪录一下如何编译通过,编译不通过一开始都是说找不到WMLNames.h之类的错误,所以我们需要在脚本里面添加上生成该文件的语句,并且把wml里面的头文件都include进来。
首先在external/webkit下的Android.mk 中添加
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) /
$(LOCAL_PATH)/WebCore/wml
D:\Webkit\WebCore\Android.derived.mk
然后在Android.derived.mk中添加wml的user agent style sheets
style_sheets := $(style_sheets) $(LOCAL_PATH)/css/wml.css
参考XMLNames.cpp的生成方式,生成wml对应的WMLNames.cpp .h等
ifeq ($(ENABLE_WML), true)
GEN:=
$(intermediates)/WMLNames.cpp $(intermediates)/WMLNames.h
$(intermediates)/WMLElementFactory.cpp
$(intermediates)/WMLElementFactory.h
$(GEN): PRIVATE_PATH := $(LOCAL_PATH)
$(GEN):
PRIVATE_CUSTOM_TOOL = perl -I $(PRIVATE_PATH)/bindings/scripts $<
--tags $(wml_tag) --attrs $(wml_attrs) --factory --wrapperFactory
--output $(dir $@)
$(GEN): wml_tag := $(LOCAL_PATH)/wml/WMLTagNames.in
$(GEN): wml_attrs := $(LOCAL_PATH)/wml/WMLAttributeNames.in
$(GEN): $(LOCAL_PATH)/dom/make_names.pl $(wml_tag) $(wml_attrs)
$(transform-generated-source)
LOCAL_GENERATED_SOURCES += $(GEN)
endif
这样在out目录下就会生成WMLNames.cpp等文件
当然同样需要把webkit/webcore/wml下的文件都添加的Android.mk中来编译。
要让android支持wml,还需要进行一些代码方面的修改
对于移动终端,有时候服务器返回的是WML格式的页面。 比如说中国移动的一些需要使用cmwap接入点的业务页面(DCD, 移动梦网…),
这就要求终端浏览器必须能够支持对WML格式页面的解析和显示。
Android原始代码里的webkit层虽然提供了WML相关的解析类,但是并没有很好地支持,所以在页面上无法正确显示。 我们需要做以下一些修改:
1. 打开对WML格式解析的通道
修改源码的\external\webkit\WebCore\dom\DOMImplementation.cpp
获取到服务器返回的数据中的content-type字段值后,会调用这个类里面的isXMLMIMEType()方法来判断是否按照XML格式来解析。
我们看这个方法:
java代码:
- bool DOMImplementation::isXMLMIMEType(const String& mimeType)
- {
- if (mimeType == "text/xml" || mimeType == "application/xml" || mimeType == "text/xsl")
- return true;
- static const char* const validChars = "[0-9a-zA-Z_\\-+~!$\\^{}|.%'`#&*]"; // per RFCs: 3023, 2045
- DEFINE_STATIC_LOCAL(RegularExpression, xmlTypeRegExp, (String("^") + validChars + "+/" + validChars + "+\\+xml$", TextCaseSensitive));
- return xmlTypeRegExp.match(mimeType) > -1;
- }
复制代码
这里只包含了text/xml, application/xml, text/xls. 我们需要把WML相应的MiMeType类型加进去
If(mimeType == “text/vnd.wap.wml”) return true;
修改framework/base/core/java/android/webkit/LoadListener.java, 源码如下:
java代码:
- // Does the header parsing work on the WebCore thread.
- private void handleHeaders(Headers headers) {
- …
- } else if (mMimeType.equals("text/vnd.wap.wml")) {
- // As we don't support wml, render it as plain text
- mMimeType = "text/plain";
- }
复制代码
我们可以看到, 原来是不支持wml格式的, 都当做text/plain来处理了,这样显然是不能正确显示的。 所以这一行mMimeType = "text/plain";需要注释掉,打开给外围。
2. 对WML中的超链接元素(WMLAElement和WMLAnchorElement)中href属性值里面的变量替换。
笔
者发现,在一个WML的登陆页面上,填入用户名和密码后,点击登陆,附加到url后面的用户名和密码是$(username) 和$(password)
,有web开发经验的XDJM都知道,这是没有将变量替换为页面上相应值。我们看WMLAElement.cpp中处理点击事件的方法:
java代码:
- void WMLAElement::defaultEventHandler(Event* event)
- {
- if (isLink() && (event->type() == eventNames().clickEvent || (event->type() == eventNames().keydownEvent && focused()))) {
- MouseEvent* e = 0;
- if (event->type() == eventNames().clickEvent && event->isMouseEvent())
- e = static_cast<MouseEvent*>(event);
- KeyboardEvent* k = 0;
- if (event->type() == eventNames().keydownEvent && event->isKeyboardEvent())
- k = static_cast<KeyboardEvent*>(event);
- if (e && e->button() == RightButton) {
- WMLElement::defaultEventHandler(event);
- return;
- }
- if (k) {
- if (k->keyIdentifier() != "Enter") {
- WMLElement::defaultEventHandler(event);
- return;
- }
- event->setDefaultHandled();
- dispatchSimulatedClick(event);
- return;
- }
- if (!event->defaultPrevented() && document()->frame()) {
- String url = document()->completeURL(deprecatedParseURL(getAttribute(HTMLNames::hrefAttr)));
- document()->frame()->loader()->urlSelected(url, target(), event, false, false, true, SendReferrer);
- }
- event->setDefaultHandled();
- }
- WMLElement::defaultEventHandler(event);
复制代码
通过打印Log发现,getAttribute(HTMLNames::hrefAttr)获取的只是href后面的字符串,包含变量$().
我们需要对其中的变量进行转化。还好WMLVariables里面已经提供了相应的方法substituteVariableReferences,不需
要我们再去写一个了。修改如下
java代码:
- #include "WMLVariables.h"
- if (!event->defaultPrevented() && document()->frame()) {
- // Substitute variables within target url attribute value. String href = getAttribute(HTMLNames::hrefAttr);
- href = substituteVariableReferences(href, document(), WMLVariableEscapingEscape);
- String url = document()->completeURL(deprecatedParseURL(href));
- document()->frame()->loader()->urlSelected(url, target(), event, false, false, true, SendReferrer);
- }
复制代码
别忘了,WMLAnchorElement.cpp中相应的地方也要同样改掉。
3. 在页面上长按链接时弹出选项点击失效
这是由于点击时是从webkit层去获取这个链接的地址和标题的, 而源码中只考虑了HTML格式的页面, WML页面被忽略了。 返回的href为null.
首先要在WMLAElement.cpp中提供接口, 返回链接。
java代码:
- KURL WMLAElement::href() const
- {
- // Substitute variables within target url attribute value.
- String href = substituteVariableReferences(getAttribute(HTMLNames::hrefAttr),
- document(), WMLVariableEscapingEscape);
- return document()->completeURL(href);
- }
复制代码
由于WMLAnchorElement继承了WMLAElement, 就不需要再添加这个方法了。 然后修改WebViewCore.cpp, 原来获取href的方法是这样的:
java代码:
- WebCore::String WebViewCore::retrieveHref(WebCore::Frame* frame, WebCore::Node* node)
- {
- WebCore::HTMLAnchorElement* anchor = retrieveAnchorElement(frame, node);
- return anchor ? anchor->href() : WebCore::String();
- }
复制代码
在这里增加WML的支持, 修改如下:
java代码:
- #if ENABLE(WML)
- WebCore::WMLAnchorElement* WebViewCore::retrieveWMLAElement(WebCore::Frame* frame, WebCore::Node* node)
- {
- if (!CacheBuilder::validNode(m_mainFrame, frame, node))
- return 0;
- if (!node->hasTagName(WebCore::WMLNames::aTag))
- return 0;
- return static_cast<WebCore::WMLAnchorElement*>(node);
- }
- #endif
- /**add WML anchor support 20110224, end**/
- WebCore::String WebViewCore::retrieveHref(WebCore::Frame* frame, WebCore::Node* node)
- {
- /**retrieve WMLAnchor element. 20110224, begin**/
- #if ENABLE(WML)
- if (node->isWMLElement()) {
- WebCore::WMLAnchorElement* anchor = retrieveWMLAElement(frame, node);
- return anchor ? anchor->href() : WebCore::String();
- }
- #endif
- /**retrieve WMLAnchor element. 20110224, end**/
- WebCore::HTMLAnchorElement* anchor = retrieveAnchorElement(frame, node);
- return anchor ? anchor->href() : WebCore::String();
- }
复制代码
还有获取链接标题的方法,修改如下:
java代码:
- WebCore::String WebViewCore::retrieveAnchorText(WebCore::Frame* frame, WebCore::Node* node)
- {
- /**retrieve WMLAnchor element. 20110224, begin**/
- #if ENABLE(WML)
- if (node->isWMLElement()) {
- WebCore::WMLAnchorElement* anchor = retrieveWMLAElement(frame, node);
- return anchor ? anchor->title() : WebCore::String();
- }
- #endif
- /**retrieve WMLAnchor element. 20110224, end**/
- WebCore::HTMLAnchorElement* anchor = retrieveAnchorElement(frame, node);
- return anchor ? anchor->text() : WebCore::String();
- }
复制代码
4. 移动梦网无法正确显示,解析出错。
移动梦网返回的数据格式为application/vnd.wap.xhtml+xml,
包含了xhtml和xml两种格式。而CMCC的数据本身又不是严格按照W3C标准来的, 导致在解析的时候出现了语法错误提示。
对于这种情况,我们显然无法去要求CMCC改变数据, 只能把这种格式当做普通的html来显示, html没有那么严格的语法检查,
可以正常显示。修改framework/base/core/java/android/webkit/LoadListener.java:
java代码:
- private void handleHeaders(Headers headers) {
- 。。。
- String contentType = headers.getContentType();
- if (contentType != null) {
- parseContentTypeHeader(contentType);
- // If we have one of "generic" MIME types, try to deduce
- // the right MIME type from the file extension (if any):
- if (mMimeType.equals("text/plain") ||
- mMimeType.equals("application/octet-stream")) {
- // for attachment, use the filename in the Content-Disposition
- // to guess the mimetype
- String contentDisposition = headers.getContentDisposition();
- String url = null;
- if (contentDisposition != null) {
- url = URLUtil.parseContentDisposition(contentDisposition);
- }
- if (url == null) {
- url = mUrl;
- }
- String newMimeType = guessMimeTypeFromExtension(url);
- if (newMimeType != null) {
- mMimeType = newMimeType;
- }
- } else if (mMimeType.equals("text/vnd.wap.wml")) {
- // As we don't support wml, render it as plain text
- // mMimeType = "text/plain";
- } else {
- // It seems that xhtml+xml and vnd.wap.xhtml+xml mime
- // subtypes are used interchangeably. So treat them the same.
- //if (mMimeType.equals("application/vnd.wap.xhtml+xml")) {
- // mMimeType = "application/xhtml+xml";
- //}
- /* Webkit used libxml2 as the xml parser, but the CMCC's WAP sites
- written in WML or XHTML do not meet W3C's specification well,
- and libxml2 will throw a lot of grammatical errors when it parses
- the document which has the mime type is "application/xhtml+xml" or
- "application/vnd.wap.xhtml+xml". When i opened the macro named
- "XHTMLMP" in config.h in webcore and tested, i found some bugs,
- i believed that Google did not do detail test works for this macro.
- So i could handle "XHTML" mime type as "HTML" only in order to
- open CMCC's WAP sites in browser.
- */
- if (mMimeType.equals("application/vnd.wap.xhtml+xml") ||
- mMimeType.equals("application/xhtml+xml"))
- {
- mMimeType = "text/html";
- }
复制代码
WebKit支持WML,可现在这句话需要打个折扣了,变成“WebKit曾经支持WML”。
一直以来,WebKit的ENABLE(WML)开关默认是关闭的,需要在编译时打开才能提供WML的支持。苹果在iPhone的Safari上一直都不支持WML,谷歌在Android的Chrome Lite也是不支持WML的。
如 果你去查看WebKit的最新源代码,你会发现原来的wml目录没有了,不管是源码的wml还是测试用例的wml,都没有了。查询WebKit的开发日 志,可以在2011年4月28日的记录上看到相关信息,Remove WML在这之后的版本提交中多次被写到开发日志中。其中有一段是这样的:
2011-04-28 Adam Barth < abarth@webkit.org >
Reviewed by Eric Seidel.
Remove WML
https://bugs.webkit.org/show_bug.cgi?id=59678This patch removes WML from WebCore. After removing WML, there’s a
bunch of twisted code that could be untwisted, but this patch contains
only the purely mechanical part of removing the feature.There’s been a lot of discussion on webkit-dev about whether we should
remove WML. In addition to those threads, we’ve had an informal poll
of the reviewers as well as an in-person discussion at the WebKit
contributor’s meeting. Removing any feature is likely to make some
folks unhappy, but, on balance, removing WML appears to be the right
thing for the project to do at this time.
这次的代码提交对应的版本号是85256,移除了WebCore下的WML支持。
2.3.5
_____________________________________________________________________________________________
使用VS2005编译库:
1. 下载Qt源码并解压(qt-win-opensource-src-4.5.3.zip);
2. 安装vs2005,win7自动更新到最新补丁!!!
3. 启动vs2005,选中“工具”,“visual studio 命令提示”
3. 进入解压目录,键入
configure -platform win32-msvc2005 -opensource -nomake examples -nomake demos
4. 编译成功后,在vs2005中打开解压目录下的 project.sln。设置 browser 为启动项目,编译真个工程即可。
如果运行时没找到dll。只要拷贝到同一个目录下执行。
支持wml版本:
1,打开E:\projects\webkit\src\src\3rdparty\webkit\WebCore\WebCore.pro
(最终生成E:\projects\webkit\src\src\3rdparty\webkit\WebCore\QtWebKit.vcproj)
将 !contains(DEFINES, ENABLE_WML=.): DEFINES += ENABLE_WML=0
由0改为1.
2, 用
configure -platform win32-msvc2005 -opensource -nomake examples -nomake demos
编译。
3,
注意使用的编译器是哪个版本的:
E:\projects\webkit\src> configure -platform win32-msvc2005 -opensource -nomake e
xamples -nomake demos
Found more than one known compiler! Using "Microsoft (R) 32-bit C/C++ Optimizing
Compiler.NET 2005 (8.0)"
This is the Qt for Windows Open Source Edition.
You are licensed to use this software under the terms of
the GNU General Public License (GPL) version 3
or the GNU Lesser General Public License (LGPL) version 2.1.
Type '3' to view the GNU General Public License version 3 (GPLv3).
Type 'L' to view the Lesser GNU General Public License version 2.1 (LGPLv2.1).
Type 'y' to accept this license offer.
Type 'n' to decline this license offer.
发表评论
-
Android systrace
2018-09-12 11:13 1045Understanding Systrace Caution: ... -
Android simpleperf
2018-09-12 11:02 1967Introduction of simpleperf What ... -
Android selinux安全策略
2016-06-21 17:16 4121基础知识 SEAndroid在架构和机制上与SELinux完 ... -
Android wifi captive portal 验证
2016-02-23 20:38 5213只要是国内的用户,基本上刷完5.0版本后如果没挂上V P N, ... -
Android CTS windows环境下测试
2015-09-08 11:36 6465Windows下CTS测试步骤 1.获 ... -
Android 之 日期时间 时区同步
2015-05-13 15:47 6382系统设置--日期和时间-- ... -
虚拟按键 振动效果
2015-05-12 11:50 2133[DESCRIPTION] Setting->情景模式- ... -
Android 签名信息读取
2014-08-22 17:32 1390public void getSingInfo() { ... -
Android UiAutomator 自动化测试
2014-07-04 17:39 10035一、一个BUG引发的问题 ... -
Android 多语言 多地区对应表
2014-05-13 17:09 2155Arabic, Egypt (ar_EG) Arabic, ... -
Android emulated sdcard
2013-08-12 21:46 6176如果要添加 emulated sdcard ,需要一下几个 ... -
#if、#ifdef、#if defined之间的区别
2013-05-17 15:19 58484#if的使用说明 #if的后面接的是表达式 #if ( ... -
Android 动态库死机调试方法
2013-03-05 13:54 4886android系统中调试Java非常容易,一般遇到错误都在 ... -
Android sqlite3 详解
2012-09-13 22:13 2428SQLite库包含一个名字叫做sqlite3的命令行,它可以让 ... -
Android 多语言开发
2012-08-16 18:37 2420第一部分 多语言定制的机制 1、ICU4C简介 ICU4 ... -
Android 添加底层核心服务
2012-06-04 10:52 5831为 Android添加底层核 ... -
Android 之响应的系统设置的事件
2012-05-24 18:17 19851、Configuration类专门用于描述手机设备上的配置信 ... -
Android CRT Screen 电视效果
2012-05-17 11:12 2327Android 2.3 对关屏进行了优化,增加了一种类似于 ... -
android编译dex-preopt
2012-05-11 18:48 5454对于android2.3编译时候选择下面的情况,既可以对dex ... -
Android 移动终端camera 防偷*拍设置
2012-04-26 10:35 1903目前市面上的所有移动终端几乎都有camera应用,但andro ...
相关推荐
WML是专门为无线设备如早期的手机设计的一种标记语言,它简化了网页内容,使其能够在低带宽和有限显示空间的设备上浏览。 描述中提到的“支持WML1.0和WML1.1协议”,意味着这款浏览器兼容这两种WML版本,这在早期...
总之,WML语言是移动互联网早期的重要工具,尽管现在已经被更先进的技术所替代,但理解其基本概念有助于我们理解移动设备上的网页开发历史,以及当前流行的移动优化技术的演变。通过深入学习和实践,初学者可以迅速...
WML程序本质上是纯文本文件,遵循XML的结构。下面是一个简单的WML程序示例: ```xml <!DOCTYPE wml PUBLIC "-//WAPFORUM//DTD WML 1.1//EN" "http://www.wapforum.org/DTD/wml_1.1.xml"> <wml> <p>Hello World!...
在这款手机中,固件特别支持了WML(Wireless Markup Language)网页格式,这是一种专为低带宽无线通信设计的标记语言,使得用户可以在手机上浏览简化的网页内容。 **WML简介** WML是XML的子集,主要针对早期的移动...
WML遵循XML的字符集,即ISO/IEC-10646(Unicode 2.0),并支持其子集,如US-ASCII、ISO-8859-1或UTF-8。在WML中,大小写是敏感的,所有标签、属性和枚举属性必须使用小写字母。参数名称和值也区分大小写,例如,`...
《Learning WML & WML Script》是一本由Martin Frost编写的书籍,专注于介绍无线标记语言(WML)和WML脚本,适用于那些希望在移动通信领域开发内容的开发者。WML是Wireless Markup Language的缩写,是为无线应用平台...
6. **导出和上传**:Waptor23.exe可能支持直接导出WML文件,并提供上传至服务器的功能,简化了发布流程。 **文件使用说明.url** 这个文件名暗示它是一个URL快捷方式,很可能指向一个在线的使用指南或者开发者文档,...
一个基本的WML文件包括文件声明、元素、属性和注释。文件声明通常以`<?xml version="1.0"?>`和DOCTYPE声明开始,定义WML的版本和使用的DTD。元素是WML的构建块,可以是带有内容的开始和结束标签,如`<tag>content...
4. 压缩内容:考虑到无线网络的带宽限制,WML页面通常需要进行压缩,去除不必要的空格和注释,减小文件大小。 5. 测试与调试:转换完成后,需要在实际的无线设备或模拟器上测试,确保页面能正常显示并具有良好的...
在`wml补充.txt`、`wml下.txt`、`wml中.txt`和`wml上.txt`这四个文件中,可能包含了各种WML实践案例,比如基本的卡片布局、表单处理、动态内容生成等。通过逐个阅读这些案例,你可以更深入地理解WML的实际应用。 **...
每个WML文档都是一个.xml文件,扩展名为.wml。 2. **WML标签**:WML标签分为元素标签(Element)和属性标签(Attribute)。例如,`<card>`定义了一个卡片,`<p>`用于创建段落,`<go>`用于链接,`<input>`用于用户...
在提供的文件中,"1in256b5hwc5.doc"可能是包含WML理论或实践教程的Word文档,而"WML.exe"可能是一个模拟WAP环境的执行文件,用于实践操作和测试WML代码。通过学习这两个文件,你可以深入理解WML的语法、结构和在...
4. **表单处理**:WML支持简单的表单元素,如`<input>`、`<select>`、`<option>`等,用于用户输入和数据提交。 5. **变量与脚本**:WML1.1通过`<var>`元素可以创建变量,但不支持复杂的脚本语言,通常配合WAP网关的...
在压缩包文件`wmltest`中,可能包含了一个或多个WML文件和相应的XSLT样式表,用于演示或练习这个转换过程。通过解压并应用上述方法,可以观察转换前后文件的差异,加深对WML到HTML转换的理解。 总之,XSLT是一种...
函数 语句 一个WMLScript 函数作为一个WMLScript 编译单元(编译单元通常是一个WMLScript文件)的一部分,通过名字来标识,可以被其他函数调用而进行一系列的操作,并返回一个值。下面如何声明并调用函数...
首先,WML的文件大小较小,所需带宽少,这对于无线网络尤为重要,因为在很长一段时间内,无线网络的带宽相对有限。其次,WML对处理器的要求较低,这有助于节省电池寿命,考虑到移动设备的能源供应有限,这一点至关...
在“wml.rar_WML”这个压缩包中,包含了一个名为“wml.wml”的文件,展示了WML的基本结构和功能,以及两种列表和后退、提交功能的应用。 WML的核心是Deck,一个Deck由一个或多个卡片(Card)组成,就像传统的网页由...
- **WML Deck文件**:通常以`.wml`扩展名存储,包含一个或多个WML卡片。 **WML语法特点:** 1. **元素与属性**:WML元素使用尖括号`< >`包围,如`<card>`。每个元素都有开始标签和结束标签,如`<card>...</card>`。...
1. **编写WML脚本**:使用任何文本编辑器,如Notepad或更高级的代码编辑器,开始编写WML文件。例如,下面的代码展示了简单的WML页面结构: ```xml <!DOCTYPE wml PUBLIC "-//PHONE.COM//DTD WML 1.1//EN" ...