当前位置: 代码迷 >> Android >> android2.3怎么加入对wml的支持
  详细解决方案

android2.3怎么加入对wml的支持

热度:70   发布时间:2016-05-01 20:46:32.0
【原创】android2.3如何加入对wml的支持
其实就是改makefile文件:
1,开启宏定义:
在external/webkit/Android.mk中开启宏:
ifeq ($(ENABLE_WML), )???? ENABLE_WML := trueendif

意思是:如果ENABLE_WML环境值没有被定义过,则定义它为true。
然后在同一个文件下加入:
ifeq ($(ENABLE_WML), true)???? LOCAL_CFLAGS += -DENABLE_WML=1endif

这里的-D编译选项是用来定义代码中的宏的,即设置c/c++中的DENABLE_WML宏的值为1,这就相当于在代码中#define?ENABLE_WML 1。
小提示:JavaScriptCore/wtf/Platform.h这里有很多#defineENABLE_XXX的宏,可以修改一些宏的值来配置。这里看一下有没有ENABLE_WML,如果没有,就加
#define ENABLE_WML ? 1;
2,包含头文件
在external/webkit/Android.mk文件中,你可以看到很多LOCAL_C_INCLUDES变量。
在两个地方加入对wml头文件的引用:
LOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \???? $(base_intermediates)/WebCore/ \???? $(base_intermediates)/WebCore/css \???? $(base_intermediates)/WebCore/html \???? $(base_intermediates)/WebCore/platform \?????$(base_intermediates)/WebCore/wmlLOCAL_C_INCLUDES := $(LOCAL_C_INCLUDES) \?????$(LOCAL_PATH)/WebCore/workers \???? $(LOCAL_PATH)/WebCore/xml \?????$(LOCAL_PATH)/WebCore/wml

注意红色部分是不一样的。
3,加入源文件的引用
在external/webkit/WebCore/Android.mk文件中,可以看到很多源文件的引用,在文件的最末尾,加上wml的源文件。
ifeq ($(ENABLE_WML), true)LOCAL_SRC_FILES := $(LOCAL_SRC_FILES) \wml/WMLAccessElement.cpp \wml/WMLAElement.cpp \wml/WMLAnchorElement.cpp \wml/WMLBRElement.cpp \wml/WMLCardElement.cpp \wml/WMLDocument.cpp \wml/WMLDoElement.cpp \wml/WMLElement.cpp \wml/WMLErrorHandling.cpp \wml/WMLEventHandlingElement.cpp \wml/WMLFieldSetElement.cpp \wml/WMLFormControlElement.cpp \wml/WMLGoElement.cpp \wml/WMLImageElement.cpp \wml/WMLImageLoader.cpp \wml/WMLInputElement.cpp \wml/WMLInsertedLegendElement.cpp \wml/WMLIntrinsicEvent.cpp \wml/WMLIntrinsicEventHandler.cpp \wml/WMLMetaElement.cpp \wml/WMLNoopElement.cpp \wml/WMLOnEventElement.cpp \wml/WMLOptGroupElement.cpp \wml/WMLOptionElement.cpp \wml/WMLPageState.cpp \wml/WMLPElement.cpp \wml/WMLPostfieldElement.cpp \wml/WMLPrevElement.cpp \wml/WMLRefreshElement.cpp \wml/WMLSelectElement.cpp \wml/WMLSetvarElement.cpp \wml/WMLTableElement.cpp \wml/WMLTaskElement.cpp \wml/WMLTemplateElement.cpp \wml/WMLTimerElement.cpp \wml/WMLVariables.cppendif

4,加入wml的css文件
在external/webkit/WebCore/Android.derived.mk文件中,找到style_sheets := $(LOCAL_PATH)/css/html.css,在这句的下面加上:
ifeq ($(ENABLE_WML), true)style_sheets := $(style_sheets) $(LOCAL_PATH)/css/wml.cssendif

5,生成WMLNames.h文件:
在external/webkit/WebCore/Android.derived.mk文件中的最后,加上:
#WML attribute namesifeq ($(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

注意:$(transform-generated-source)之前是个tab键。
6,对wml的mimeType的支持
在DOMImplementation.cpp文件中,在external/webkit/webcore/dom目录下,找到isXMLMIMEType方法,加入:
#if ENABLE(WML)????????? if (mimeType =="text/vnd.wap.wml")?????????????? return true;#endif

7,修改framework
在framework/base/core/java/android/webkit/LoadListener.java中的handleHeaders方法,找到
else if (mMimeType.equals("text/vnd.wap.wml"));把里面处理成html的形式改成mMimeType =?"text/vnd.wap.wml";

经过以上步骤,编译webkit,最好在编译webkit之前,执行一下rm ../../out/target/product/dkb/obj/STATIC_LIBRARIES/libwebcore_intermediates/ -rf 命令,编译framework。