【原创】android2.3如何加入对wml的支持

其实就是改makefile文件:
1,开启宏定义:
在external/webkit/Android.mk中开启宏:
ifeq ($(ENABLE_WML), )
     ENABLE_WML := true
endif

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

这里的-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/wml
LOCAL_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.cpp
endif

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.css
endif

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

注意:$(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。

你可能感兴趣的:(android)