diff options
102 files changed, 2997 insertions, 893 deletions
diff --git a/CleanSpec.mk b/CleanSpec.mk index d103aa6..1d9b9bb 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -107,6 +107,16 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libbcinfo_intermediates) + +# ICS MR2!!!!!!!!!!!! +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libbcinfo_intermediates) + +# WAIT, I MEAN JELLY BEAN!!!!!!!!!!!! +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) # ************************************************ diff --git a/core/Makefile b/core/Makefile index 81699ee..173932c 100644 --- a/core/Makefile +++ b/core/Makefile @@ -9,6 +9,8 @@ else FILE_NAME_TAG := $(BUILD_NUMBER) endif +is_tests_build := $(filter tests,$(MAKECMDGOALS)) + # ----------------------------------------------------------------- # Define rules to copy PRODUCT_COPY_FILES defined by the product. # PRODUCT_COPY_FILES contains words like <source file>:<dest file>. @@ -26,7 +28,8 @@ $(foreach cf,$(PRODUCT_COPY_FILES), \ $(eval _src := $(call word-colon,1,$(cf))) \ $(eval _dest := $(call word-colon,2,$(cf))) \ $(call check-product-copy-files,$(cf)) \ - $(if $(filter $(unique_product_copy_files_destinations),$(_dest)),, \ + $(if $(filter $(unique_product_copy_files_destinations),$(_dest)), \ + $(info PRODUCT_COPY_FILES $(cf) ignored.), \ $(eval _fulldest := $(call append-path,$(PRODUCT_OUT),$(_dest))) \ $(eval $(call copy-one-file,$(_src),$(_fulldest))) \ $(eval ALL_DEFAULT_INSTALLED_MODULES += $(_fulldest)) \ @@ -405,6 +408,11 @@ endif # ----------------------------------------------------------------- # NOTICE files # +# We are required to publish the licenses for all code under BSD, GPL and +# Apache licenses (and possibly other more exotic ones as well). We err on the +# side of caution, so the licenses for other third-party code are included here +# too. +# # This needs to be before the systemimage rules, because it adds to # ALL_DEFAULT_INSTALLED_MODULES, which those use to pick which files # go into the systemimage. @@ -553,7 +561,7 @@ endif # make the target NOTICE files depend on this particular file too, which will # then be in the right directory for the find in combine-notice-files to work. $(kernel_notice_file): \ - prebuilt/$(TARGET_PREBUILT_TAG)/kernel/LINUX_KERNEL_COPYING \ + prebuilts/qemu-kernel/arm/LINUX_KERNEL_COPYING \ | $(ACP) @echo Copying: $@ $(hide) mkdir -p $(dir $@) @@ -603,27 +611,27 @@ endif ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true) INTERNAL_USERIMAGES_DEPS := $(MKEXTUSERIMG) $(MAKE_EXT4FS) -INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS))) - -# $(1): src directory -# $(2): output file -# $(3): mount point -# $(4): ext variant (ext2, ext3, ext4) -# $(5): size of the partition -define build-userimage-ext-target - @mkdir -p $(dir $(2)) - $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ - $(MKEXTUSERIMG) $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG) $(1) $(2) $(4) $(3) $(5) -endef else INTERNAL_USERIMAGES_DEPS := $(MKYAFFS2) endif +INTERNAL_USERIMAGES_BINARY_PATHS := $(sort $(dir $(INTERNAL_USERIMAGES_DEPS))) + +# $(1): the path of the output dictionary file +define generate-userimage-prop-dictionary +$(if $(INTERNAL_USERIMAGES_EXT_VARIANT),$(hide) echo "fs_type=$(INTERNAL_USERIMAGES_EXT_VARIANT)" >> $(1)) +$(if $(BOARD_SYSTEMIMAGE_PARTITION_SIZE),$(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_USERDATAIMAGE_PARTITION_SIZE),$(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE),$(hide) echo "cache_fs_type=$(BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE)" >> $(1)) +$(if $(BOARD_CACHEIMAGE_PARTITION_SIZE),$(hide) echo "cache_size=$(BOARD_CACHEIMAGE_PARTITION_SIZE)" >> $(1)) +$(if $(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG),$(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(1)) +$(if $(mkyaffs2_extra_flags),$(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(1)) +endef # ----------------------------------------------------------------- # Recovery image # If neither TARGET_NO_KERNEL nor TARGET_NO_RECOVERY are true -ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY) $(BUILD_TINY_ANDROID))) +ifeq (,$(filter true, $(TARGET_NO_KERNEL) $(TARGET_NO_RECOVERY) $(BUILD_TINY_ANDROID) $(BUILD_PDK))) INSTALLED_RECOVERYIMAGE_TARGET := $(PRODUCT_OUT)/recovery.img @@ -740,10 +748,18 @@ endif # INTERNAL_SYSTEMIMAGE_FILES := $(filter $(TARGET_OUT)/%, \ - $(ALL_PREBUILT) \ - $(ALL_COPIED_HEADERS) \ - $(ALL_GENERATED_SOURCES) \ - $(ALL_DEFAULT_INSTALLED_MODULES)) + $(ALL_PREBUILT) \ + $(ALL_COPIED_HEADERS) \ + $(ALL_GENERATED_SOURCES) \ + $(ALL_DEFAULT_INSTALLED_MODULES)) + +ifdef is_tests_build +# We don't want to install tests modules to the system partition +# when building "tests", because now "tests" may be built in a user, userdebug +# or eng build variant and we don't want to pollute the system partition. +# INTERNAL_SYSTEMIMAGE_FILES += $(filter $(TARGET_OUT)/%, \ +# $(tests_MODULES)) +endif FULL_SYSTEMIMAGE_DEPS := $(INTERNAL_SYSTEMIMAGE_FILES) $(INTERNAL_USERIMAGES_DEPS) # ----------------------------------------------------------------- @@ -769,27 +785,18 @@ $(call dist-for-goals, sdk_addon, $(INSTALLED_FILES_FILE)) endif systemimage_intermediates := \ - $(call intermediates-dir-for,PACKAGING,systemimage) + $(call intermediates-dir-for,PACKAGING,systemimage) BUILT_SYSTEMIMAGE := $(systemimage_intermediates)/system.img -ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true) -## generate an ext image -# $(1): output file -define build-systemimage-target - @echo "Target system fs image: $(1)" - $(call build-userimage-ext-target,$(TARGET_OUT),$(1),system,$(INTERNAL_USERIMAGES_EXT_VARIANT),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)) -endef - -else # INTERNAL_USERIMAGES_USE_EXT != true - -## generate a yaffs2 image # $(1): output file define build-systemimage-target - @echo "Target system fs image: $(1)" - @mkdir -p $(dir $(1)) - $(hide) $(MKYAFFS2) -f $(mkyaffs2_extra_flags) $(TARGET_OUT) $(1) + @echo "Target system fs image: $(1)" + @mkdir -p $(dir $(1)) $(systemimage_intermediates) && rm -rf $(systemimage_intermediates)/system_image_info.txt + $(call generate-userimage-prop-dictionary, $(systemimage_intermediates)/system_image_info.txt) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(TARGET_OUT) $(systemimage_intermediates)/system_image_info.txt $(1) endef -endif # INTERNAL_USERIMAGES_USE_EXT $(BUILT_SYSTEMIMAGE): $(FULL_SYSTEMIMAGE_DEPS) $(INSTALLED_FILES_FILE) $(call build-systemimage-target,$@) @@ -829,6 +836,12 @@ systemimage-nodeps snod: $(filter-out systemimage-nodeps snod,$(MAKECMDGOALS)) \ $(call build-systemimage-target,$(INSTALLED_SYSTEMIMAGE)) $(hide) $(call assert-max-image-size,$(INSTALLED_SYSTEMIMAGE),$(BOARD_SYSTEMIMAGE_PARTITION_SIZE),yaffs) +ifneq (,$(filter systemimage-nodeps snod, $(MAKECMDGOALS))) +ifeq (true,$(WITH_DEXPREOPT)) +$(warning Warning: with dexpreopt enabled, you may need a full rebuild.) +endif +endif + ####### ## system tarball define build-systemtarball-target @@ -888,29 +901,28 @@ boottarball-nodeps btnod: $(FS_GET_STATS) \ # ----------------------------------------------------------------- # data partition image INTERNAL_USERDATAIMAGE_FILES := \ - $(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) + $(filter $(TARGET_OUT_DATA)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) -ifeq ($(INTERNAL_USERIMAGES_USE_EXT),true) -## Generate an ext2 image -define build-userdataimage-target - $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)") - @mkdir -p $(TARGET_OUT_DATA) - $(call build-userimage-ext-target,$(TARGET_OUT_DATA),$(INSTALLED_USERDATAIMAGE_TARGET),data,$(INTERNAL_USERIMAGES_EXT_VARIANT),$(BOARD_USERDATAIMAGE_PARTITION_SIZE)) - $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE),yaffs) -endef +# If we build "tests" at the same time, make sure $(tests_MODULES) get covered. +ifdef is_tests_build +INTERNAL_USERDATAIMAGE_FILES += \ + $(filter $(TARGET_OUT_DATA)/%,$(tests_MODULES)) +endif -else # INTERNAL_USERIMAGES_USE_EXT != true +userdataimage_intermediates := \ + $(call intermediates-dir-for,PACKAGING,userdata) +BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img -## Generate a yaffs2 image define build-userdataimage-target - $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)") - @mkdir -p $(TARGET_OUT_DATA) - $(hide) $(MKYAFFS2) -f $(mkyaffs2_extra_flags) $(TARGET_OUT_DATA) $(INSTALLED_USERDATAIMAGE_TARGET) - $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE),yaffs) + $(call pretty,"Target userdata fs image: $(INSTALLED_USERDATAIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_DATA) + @mkdir -p $(userdataimage_intermediates) && rm -rf $(userdataimage_intermediates)/userdata_image_info.txt + $(call generate-userimage-prop-dictionary, $(userdataimage_intermediates)/userdata_image_info.txt) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(TARGET_OUT_DATA) $(userdataimage_intermediates)/userdata_image_info.txt $(INSTALLED_USERDATAIMAGE_TARGET) + $(hide) $(call assert-max-image-size,$(INSTALLED_USERDATAIMAGE_TARGET),$(BOARD_USERDATAIMAGE_PARTITION_SIZE),yaffs) endef -endif # INTERNAL_USERIMAGES_USE_EXT - -BUILT_USERDATAIMAGE_TARGET := $(PRODUCT_OUT)/userdata.img # We just build this directly to the install location. INSTALLED_USERDATAIMAGE_TARGET := $(BUILT_USERDATAIMAGE_TARGET) @@ -944,6 +956,38 @@ userdatatarball-nodeps: $(FS_GET_STATS) # ----------------------------------------------------------------- +# cache partition image +ifdef BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE +INTERNAL_CACHEIMAGE_FILES := \ + $(filter $(TARGET_OUT_CACHE)/%,$(ALL_DEFAULT_INSTALLED_MODULES)) + +cacheimage_intermediates := \ + $(call intermediates-dir-for,PACKAGING,cache) +BUILT_CACHEIMAGE_TARGET := $(PRODUCT_OUT)/cache.img + +define build-cacheimage-target + $(call pretty,"Target cache fs image: $(INSTALLED_CACHEIMAGE_TARGET)") + @mkdir -p $(TARGET_OUT_CACHE) + @mkdir -p $(cacheimage_intermediates) && rm -rf $(cacheimage_intermediates)/cache_image_info.txt + $(call generate-userimage-prop-dictionary, $(cacheimage_intermediates)/cache_image_info.txt) + $(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH \ + ./build/tools/releasetools/build_image.py \ + $(TARGET_OUT_CACHE) $(cacheimage_intermediates)/cache_image_info.txt $(INSTALLED_CACHEIMAGE_TARGET) + $(hide) $(call assert-max-image-size,$(INSTALLED_CACHEIMAGE_TARGET),$(BOARD_CACHEIMAGE_PARTITION_SIZE),yaffs) +endef + +# We just build this directly to the install location. +INSTALLED_CACHEIMAGE_TARGET := $(BUILT_CACHEIMAGE_TARGET) +$(INSTALLED_CACHEIMAGE_TARGET): $(INTERNAL_USERIMAGES_DEPS) $(INTERNAL_CACHEIMAGE_FILES) + $(build-cacheimage-target) + +.PHONY: cacheimage-nodeps +cacheimage-nodeps: | $(INTERNAL_USERIMAGES_DEPS) + $(build-cacheimage-target) + +endif # BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE + +# ----------------------------------------------------------------- # bring in the installer image generation defines if necessary ifeq ($(TARGET_USE_DISKINSTALLER),true) include bootable/diskinstaller/config.mk @@ -1024,6 +1068,7 @@ $(BUILT_TARGET_FILES_PACKAGE): \ $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_SYSTEMIMAGE) \ $(INSTALLED_USERDATAIMAGE_TARGET) \ + $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_ANDROID_INFO_TXT_TARGET) \ $(built_ota_tools) \ $(APKCERTS_FILE) \ @@ -1100,23 +1145,12 @@ endif ifdef BOARD_RECOVERYIMAGE_PARTITION_SIZE $(hide) echo "recovery_size=$(BOARD_RECOVERYIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt endif -ifdef BOARD_SYSTEMIMAGE_PARTITION_SIZE - $(hide) echo "system_size=$(BOARD_SYSTEMIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt -endif -ifdef BOARD_USERDATAIMAGE_PARTITION_SIZE - $(hide) echo "userdata_size=$(BOARD_USERDATAIMAGE_PARTITION_SIZE)" >> $(zip_root)/META/misc_info.txt -endif $(hide) echo "tool_extensions=$(tool_extensions)" >> $(zip_root)/META/misc_info.txt -ifdef mkyaffs2_extra_flags - $(hide) echo "mkyaffs2_extra_flags=$(mkyaffs2_extra_flags)" >> $(zip_root)/META/misc_info.txt -endif -ifdef INTERNAL_USERIMAGES_SPARSE_EXT_FLAG - $(hide) echo "extfs_sparse_flag=$(INTERNAL_USERIMAGES_SPARSE_EXT_FLAG)" >> $(zip_root)/META/misc_info.txt -endif $(hide) echo "default_system_dev_certificate=$(DEFAULT_SYSTEM_DEV_CERTIFICATE)" >> $(zip_root)/META/misc_info.txt ifdef PRODUCT_EXTRA_RECOVERY_KEYS $(hide) echo "extra_recovery_keys=$(PRODUCT_EXTRA_RECOVERY_KEYS)" >> $(zip_root)/META/misc_info.txt endif + $(call generate-userimage-prop-dictionary, $(zip_root)/META/misc_info.txt) @# Zip everything up, preserving symlinks $(hide) (cd $(zip_root) && zip -qry ../$(notdir $@) .) @# Run fs_config on all the system, boot ramdisk, and recovery ramdisk files in the zip, and save the output @@ -1193,7 +1227,7 @@ endif # TARGET_PRODUCT != sdk # ----------------------------------------------------------------- # A zip of the tests that are built when running "make tests". # This is very similar to BUILT_TARGET_FILES_PACKAGE, but we -# only grab SYSTEM and DATA, and it's called "*-tests-*.zip". +# only grab DATA, and it's called "*-tests-*.zip". # name := $(TARGET_PRODUCT) ifeq ($(TARGET_BUILD_TYPE),debug) @@ -1206,25 +1240,14 @@ BUILT_TESTS_ZIP_PACKAGE := $(intermediates)/$(name).zip $(BUILT_TESTS_ZIP_PACKAGE): intermediates := $(intermediates) $(BUILT_TESTS_ZIP_PACKAGE): zip_root := $(intermediates)/$(name) -# Depending on the dependencies of system image and userdata image. -# But we don't need to really create them. +# Depending on the images guarantees that the underlying # directories are up-to-date. $(BUILT_TESTS_ZIP_PACKAGE): \ - $(FULL_SYSTEMIMAGE_DEPS) \ - $(INTERNAL_USERDATAIMAGE_FILES) \ - | $(ACP) + $(INSTALLED_USERDATAIMAGE_TARGET) \ + | $(ACP) @echo "Package test files: $@" $(hide) rm -rf $@ $(zip_root) $(hide) mkdir -p $(dir $@) $(zip_root) - @# Some parts of the system image - $(hide) $(call package_files-copy-root, \ - $(SYSTEMIMAGE_SOURCE_DIR)/xbin,$(zip_root)/SYSTEM/xbin) - $(hide) $(call package_files-copy-root, \ - $(SYSTEMIMAGE_SOURCE_DIR)/lib,$(zip_root)/SYSTEM/lib) - $(hide) $(call package_files-copy-root, \ - $(SYSTEMIMAGE_SOURCE_DIR)/framework, \ - $(zip_root)/SYSTEM/framework) - $(hide) $(ACP) $(SYSTEMIMAGE_SOURCE_DIR)/build.prop $(zip_root)/SYSTEM @# Contents of the data image $(hide) $(call package_files-copy-root, \ $(TARGET_OUT_DATA),$(zip_root)/DATA) @@ -1242,6 +1265,12 @@ ifneq (,$(filter $(MAKECMDGOALS),tests-build-target)) $(BUILT_TESTS_ZIP_PACKAGE)) endif +.PHONY: tests +tests: $(BUILT_TESTS_ZIP_PACKAGE) +ifneq (,$(filter tests, $(MAKECMDGOALS))) +$(call dist-for-goals, tests, $(BUILT_TESTS_ZIP_PACKAGE)) +endif + # ----------------------------------------------------------------- # A zip of the symbols directory. Keep the full paths to make it # more obvious where these files came from. @@ -1297,7 +1326,7 @@ dalvikfiles: $(INTERNAL_DALVIK_MODULES) INTERNAL_EMULATOR_PACKAGE_FILES += \ $(HOST_OUT_EXECUTABLES)/emulator$(HOST_EXECUTABLE_SUFFIX) \ - prebuilt/android-$(TARGET_ARCH)/kernel/kernel-qemu \ + prebuilts/qemu-kernel/$(TARGET_ARCH)/kernel-qemu \ $(INSTALLED_RAMDISK_TARGET) \ $(INSTALLED_SYSTEMIMAGE) \ $(INSTALLED_USERDATAIMAGE_TARGET) @@ -1311,11 +1340,13 @@ $(INTERNAL_EMULATOR_PACKAGE_TARGET): $(INTERNAL_EMULATOR_PACKAGE_FILES) $(hide) zip -qj $@ $(INTERNAL_EMULATOR_PACKAGE_FILES) # ----------------------------------------------------------------- +# Old PDK stuffs, retired # The pdk package (Platform Development Kit) -ifneq (,$(filter pdk,$(MAKECMDGOALS))) - include development/pdk/Pdk.mk -endif +#ifneq (,$(filter pdk,$(MAKECMDGOALS))) +# include development/pdk/Pdk.mk +#endif + # ----------------------------------------------------------------- # The SDK @@ -1368,6 +1399,12 @@ sdk_tools_atree_files := sdk/build/tools.atree ifneq (,$(strip $(wildcard sdk/build/tools.$(TARGET_ARCH).atree))) sdk_tools_atree_files += sdk/build/tools.$(TARGET_ARCH).atree endif +ifneq (,$(strip $(wildcard sdk/build/tools.$(HOST_OS).atree))) + sdk_tools_atree_files += sdk/build/tools.$(HOST_OS).atree +endif +ifneq (,$(strip $(wildcard sdk/build/tools.$(HOST_OS)-$(HOST_ARCH).atree))) + sdk_tools_atree_files += sdk/build/tools.$(HOST_OS)-$(HOST_ARCH).atree +endif sdk_atree_files := \ $(atree_dir)/sdk.exclude.atree \ @@ -1430,6 +1467,7 @@ $(INTERNAL_SDK_TARGET): $(deps) -I $(TARGET_COMMON_OUT_ROOT) \ -v "PLATFORM_NAME=android-$(PLATFORM_VERSION)" \ -v "OUT_DIR=$(OUT_DIR)" \ + -v "HOST_OUT=$(HOST_OUT)" \ -v "TARGET_ARCH=$(TARGET_ARCH)" \ -v "TARGET_CPU_ABI=$(TARGET_CPU_ABI)" \ -v "DLL_EXTENSION=$(HOST_SHLIB_SUFFIX)" \ diff --git a/core/armelf.x b/core/armelf.x index d38dc1d..b484776 100644 --- a/core/armelf.x +++ b/core/armelf.x @@ -93,10 +93,16 @@ SECTIONS .preinit_array : { KEEP (*(.preinit_array)) } PROVIDE (__preinit_array_end = .); PROVIDE (__init_array_start = .); - .init_array : { KEEP (*(.init_array)) } + .init_array : { + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + } PROVIDE (__init_array_end = .); PROVIDE (__fini_array_start = .); - .fini_array : { KEEP (*(.fini_array)) } + .fini_array : { + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + } PROVIDE (__fini_array_end = .); .ctors : { diff --git a/core/armelflib.x b/core/armelflib.x index 0150e02..ec7abd5 100644 --- a/core/armelflib.x +++ b/core/armelflib.x @@ -59,10 +59,16 @@ SECTIONS .preinit_array : { KEEP (*(.preinit_array)) } PROVIDE (__preinit_array_end = .); PROVIDE (__init_array_start = .); - .init_array : { KEEP (*(.init_array)) } + .init_array : { + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + } PROVIDE (__init_array_end = .); PROVIDE (__fini_array_start = .); - .fini_array : { KEEP (*(.fini_array)) } + .fini_array : { + KEEP (*(.fini_array)) + KEEP (*(SORT(.fini_array.*))) + } PROVIDE (__fini_array_end = .); .ctors : { diff --git a/core/base_rules.mk b/core/base_rules.mk index 242b53d..38c2c10 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -110,8 +110,10 @@ endif # find files like MODULE_LICENSE_GPL_AND_AFL but exclude files like # MODULE_LICENSE_LGPL. # -ifneq ($(call find-parent-file,$(LOCAL_PATH),MODULE_LICENSE*_GPL* MODULE_LICENSE*_MPL*),) +gpl_license_file := $(call find-parent-file,$(LOCAL_PATH),MODULE_LICENSE*_GPL* MODULE_LICENSE*_MPL*) +ifneq ($(gpl_license_file),) LOCAL_MODULE_TAGS += gnu + ALL_GPL_MODULE_LICENSE_FILES := $(sort $(ALL_GPL_MODULE_LICENSE_FILES) $(gpl_license_file)) endif # @@ -381,7 +383,7 @@ endif # java_resource_file_groups ## PRIVATE java vars ###################################### -ifneq ($(strip $(all_java_sources)$(all_res_assets)),) +ifneq ($(strip $(all_java_sources)$(all_res_assets))$(LOCAL_STATIC_JAVA_LIBRARIES),) full_static_java_libs := \ $(foreach lib,$(LOCAL_STATIC_JAVA_LIBRARIES), \ @@ -587,6 +589,10 @@ ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS := \ $(ALL_MODULES.$(LOCAL_MODULE).EVENT_LOG_TAGS) $(event_log_tags) ALL_MODULES.$(LOCAL_MODULE).INTERMEDIATE_SOURCE_DIR := \ $(ALL_MODULES.$(LOCAL_MODULE).INTERMEDIATE_SOURCE_DIR) $(LOCAL_INTERMEDIATE_SOURCE_DIR) +ifdef LOCAL_MODULE_OWNER +ALL_MODULES.$(LOCAL_MODULE).OWNER := \ + $(strip $(ALL_MODULES.$(LOCAL_MODULE).OWNER) $(LOCAL_MODULE_OWNER)) +endif INSTALLABLE_FILES.$(LOCAL_INSTALLED_MODULE).MODULE := $(LOCAL_MODULE) diff --git a/core/binary.mk b/core/binary.mk index e488200..e729164 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -571,7 +571,7 @@ built_whole_libraries := \ # We don't care about installed static libraries, since the # libraries have already been linked into the module at that point. # We do, however, care about the NOTICE files for any static -# libraries that we use. (see notice_files.make) +# libraries that we use. (see notice_files.mk) installed_static_library_notice_file_targets := \ $(foreach lib,$(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES), \ diff --git a/core/build_id.mk b/core/build_id.mk index 70bd235..40bb35d 100644 --- a/core/build_id.mk +++ b/core/build_id.mk @@ -23,7 +23,7 @@ # (like "TC1-RC5"). It must be a single word, and is # capitalized by convention. # -BUILD_ID := MR1 +BUILD_ID := MASTER # DISPLAY_BUILD_NUMBER should only be set for development branches, # If set, the BUILD_NUMBER (cl) is appended to the BUILD_ID for diff --git a/core/clear_vars.mk b/core/clear_vars.mk index c6fd06b..63f44b3 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -58,7 +58,6 @@ LOCAL_INTERMEDIATE_SOURCES:= LOCAL_INTERMEDIATE_SOURCE_DIR:= LOCAL_JAVACFLAGS:= LOCAL_JAVA_LIBRARIES:= -LOCAL_JAVA_LAYERS_FILE:= LOCAL_NO_STANDARD_LIBRARIES:= LOCAL_CLASSPATH:= LOCAL_DROIDDOC_USE_STANDARD_DOCLET:= @@ -108,6 +107,7 @@ LOCAL_MANIFEST_FILE:= LOCAL_RENDERSCRIPT_INCLUDES:= LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE:= LOCAL_RENDERSCRIPT_CC:= +LOCAL_RENDERSCRIPT_FLAGS:= LOCAL_RENDERSCRIPT_TARGET_API:= LOCAL_BUILD_HOST_DEX:= LOCAL_DEX_PREOPT:= # '',true,false,nostripping @@ -115,7 +115,9 @@ LOCAL_PROTOC_OPTIMIZE_TYPE:= # lite(default),micro,full LOCAL_PROTOC_FLAGS:= LOCAL_NO_CRT:= LOCAL_PROPRIETARY_MODULE:= +LOCAL_MODULE_OWNER:= LOCAL_CTS_TEST_PACKAGE:= +LOCAL_CTS_TEST_RUNNER:= # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time. diff --git a/core/combo/HOST_darwin-x86.mk b/core/combo/HOST_darwin-x86.mk index 544a29e..198c53f 100644 --- a/core/combo/HOST_darwin-x86.mk +++ b/core/combo/HOST_darwin-x86.mk @@ -17,11 +17,17 @@ # Configuration for Darwin (Mac OS X) on x86. # Included by combo/select.mk -# We build everything in 32-bit, because some host tools are -# 32-bit-only anyway (emulator, acc), and because it gives us +ifneq ($(strip $(BUILD_HOST_64bit)),) +# By default we build everything in 32-bit, because it gives us # more consistency between the host tools and the target. +# BUILD_HOST_64bit=1 overrides it for tool like emulator +# which can benefit from 64-bit host arch. +HOST_GLOBAL_CFLAGS += -m64 +HOST_GLOBAL_LDFLAGS += -m64 +else HOST_GLOBAL_CFLAGS += -m32 HOST_GLOBAL_LDFLAGS += -m32 +endif # BUILD_HOST_64bit # Use the Mac OSX SDK 10.5 if the build host is 10.6 build_mac_version := $(shell sw_vers -productVersion) @@ -53,32 +59,58 @@ HOST_JNILIB_SUFFIX := .jnilib HOST_GLOBAL_CFLAGS += \ -include $(call select-android-config-h,darwin-x86) -HOST_RUN_RANLIB_AFTER_COPYING := true +ifneq ($(filter 10.7.%, $(build_mac_version)),) + HOST_RUN_RANLIB_AFTER_COPYING := false +else + HOST_RUN_RANLIB_AFTER_COPYING := true + PRE_LION_DYNAMIC_LINKER_OPTIONS := -Wl,-dynamic +endif HOST_GLOBAL_ARFLAGS := cqs HOST_CUSTOM_LD_COMMAND := true +# Workaround for lack of "-Wl,--whole-archive" in MacOS's linker. +define _darwin-extract-and-include-single-whole-static-lib +@echo "preparing StaticLib: $(PRIVATE_MODULE) [including $(1)]" +$(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs;\ + mkdir -p $$ldir; \ + for f in `$(HOST_AR) t $(1)`; do \ + $(HOST_AR) p $(1) $$f > $$ldir/$$f; \ + done ; + +endef + +define darwin-extract-and-include-whole-static-libs +$(if $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES), $(hide) rm -rf $(PRIVATE_INTERMEDIATES_DIR)/WHOLE) +$(foreach lib,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES), \ + $(call _darwin-extract-and-include-single-whole-static-lib, $(lib))) +endef + define transform-host-o-to-shared-lib-inner +$(call darwin-extract-and-include-whole-static-libs) $(hide) $(PRIVATE_CXX) \ -dynamiclib -single_module -read_only_relocs suppress \ $(HOST_GLOBAL_LD_DIRS) \ $(HOST_GLOBAL_LDFLAGS) \ $(PRIVATE_ALL_OBJECTS) \ + $(if $(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES), `find $(PRIVATE_INTERMEDIATES_DIR)/WHOLE -name '*.o' 2>/dev/null`) \ $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ - $(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--start-group) \ $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ $(PRIVATE_LDLIBS) \ -o $@ \ + -install_name @rpath/$(notdir $@) \ + -Wl,-rpath,@loader_path/../lib \ $(PRIVATE_LDFLAGS) \ $(HOST_LIBGCC) endef define transform-host-o-to-executable-inner $(hide) $(PRIVATE_CXX) \ + -Wl,-rpath,@loader_path/../lib \ -o $@ \ - -Wl,-dynamic -headerpad_max_install_names \ + $(PRE_LION_DYNAMIC_LINKER_OPTIONS) -headerpad_max_install_names \ $(HOST_GLOBAL_LD_DIRS) \ $(HOST_GLOBAL_LDFLAGS) \ $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ diff --git a/core/combo/HOST_linux-x86.mk b/core/combo/HOST_linux-x86.mk index 5ae4972..6cee6ea 100644 --- a/core/combo/HOST_linux-x86.mk +++ b/core/combo/HOST_linux-x86.mk @@ -33,26 +33,32 @@ endef # LOCAL_CC and LOCAL_CXX to override this. # ifeq ($(TARGET_PRODUCT),sdk) -HOST_SDK_TOOLCHAIN_PREFIX := prebuilt/linux-x86/toolchain/i686-linux-glibc2.7-4.4.3/bin/i686-linux +HOST_SDK_TOOLCHAIN_PREFIX := prebuilts/tools/gcc-sdk # Don't do anything if the toolchain is not there -ifneq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)-gcc))) -HOST_CC := $(HOST_SDK_TOOLCHAIN_PREFIX)-gcc -HOST_CXX := $(HOST_SDK_TOOLCHAIN_PREFIX)-g++ -HOST_AR := $(HOST_SDK_TOOLCHAIN_PREFIX)-ar -endif # $(HOST_SDK_TOOLCHAIN_PREFIX)-gcc exists +ifneq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc))) +HOST_CC := $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc +HOST_CXX := $(HOST_SDK_TOOLCHAIN_PREFIX)/g++ +HOST_AR := $(HOST_SDK_TOOLCHAIN_PREFIX)/ar +endif # $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc exists endif # TARGET_PRODUCT == sdk -# We build everything in 32-bit, because some host tools are -# 32-bit-only anyway (emulator, acc), and because it gives us +ifneq ($(strip $(BUILD_HOST_64bit)),) +# By default we build everything in 32-bit, because it gives us # more consistency between the host tools and the target. +# BUILD_HOST_64bit=1 overrides it for tool like emulator +# which can benefit from 64-bit host arch. +HOST_GLOBAL_CFLAGS += -m64 +HOST_GLOBAL_LDFLAGS += -m64 +else HOST_GLOBAL_CFLAGS += -m32 HOST_GLOBAL_LDFLAGS += -m32 +endif # BUILD_HOST_64bit HOST_GLOBAL_CFLAGS += -fPIC HOST_GLOBAL_CFLAGS += \ -include $(call select-android-config-h,linux-x86) # Disable new longjmp in glibc 2.11 and later. See bug 2967937. -HOST_GLOBAL_CFLAGS += -D_FORTIFY_SOURCE=0 +HOST_GLOBAL_CFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=0 HOST_NO_UNDEFINED_LDFLAGS := -Wl,--no-undefined diff --git a/core/combo/HOST_windows-x86.mk b/core/combo/HOST_windows-x86.mk index 9870998..fe4bd66 100644 --- a/core/combo/HOST_windows-x86.mk +++ b/core/combo/HOST_windows-x86.mk @@ -26,13 +26,19 @@ TOOLS_EXE_SUFFIX := .exe ifneq ($(findstring Linux,$(UNAME)),) ifneq ($(strip $(USE_MINGW)),) HOST_ACP_UNAVAILABLE := true -TOOLS_PREFIX := /usr/bin/i586-mingw32msvc- TOOLS_EXE_SUFFIX := HOST_GLOBAL_CFLAGS += -DUSE_MINGW +ifneq ($(strip $(BUILD_HOST_64bit)),) +TOOLS_PREFIX := /usr/bin/amd64-mingw32msvc- +HOST_C_INCLUDES += /usr/lib/gcc/amd64-mingw32msvc/4.4.2/include +HOST_GLOBAL_LD_DIRS += -L/usr/amd64-mingw32msvc/lib +else +TOOLS_PREFIX := /usr/bin/i586-mingw32msvc- HOST_C_INCLUDES += /usr/lib/gcc/i586-mingw32msvc/3.4.4/include HOST_GLOBAL_LD_DIRS += -L/usr/i586-mingw32msvc/lib -endif -endif +endif # BUILD_HOST_64bit +endif # USE_MINGW +endif # Linux HOST_CC := $(TOOLS_PREFIX)gcc$(TOOLS_EXE_SUFFIX) HOST_CXX := $(TOOLS_PREFIX)g++$(TOOLS_EXE_SUFFIX) diff --git a/core/combo/TARGET_linux-arm.mk b/core/combo/TARGET_linux-arm.mk index 8c89143..711041d 100644 --- a/core/combo/TARGET_linux-arm.mk +++ b/core/combo/TARGET_linux-arm.mk @@ -43,8 +43,8 @@ include $(TARGET_ARCH_SPECIFIC_MAKEFILE) # You can set TARGET_TOOLS_PREFIX to get gcc from somewhere else ifeq ($(strip $(TARGET_TOOLS_PREFIX)),) -TARGET_TOOLS_PREFIX := \ - prebuilt/$(HOST_PREBUILT_TAG)/toolchain/arm-linux-androideabi-4.4.x/bin/arm-linux-androideabi- +TARGET_TOOLCHAIN_ROOT := prebuilt/$(HOST_PREBUILT_TAG)/toolchain/arm-linux-androideabi-4.4.x +TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/arm-linux-androideabi- endif # Only define these if there's actually a gcc in there. @@ -102,7 +102,7 @@ android_config_h := $(call select-android-config-h,linux-arm) arch_include_dir := $(dir $(android_config_h)) TARGET_GLOBAL_CFLAGS += \ - -msoft-float -fpic \ + -msoft-float -fpic -fPIE \ -ffunction-sections \ -fdata-sections \ -funwind-tables \ @@ -114,11 +114,13 @@ TARGET_GLOBAL_CFLAGS += \ -include $(android_config_h) \ -I $(arch_include_dir) -# This warning causes dalvik not to build with gcc 4.6 and -Werror. +# This warning causes dalvik not to build with gcc 4.6.x and -Werror. # We cannot turn it off blindly since the option is not available -# in gcc-4.4.x -ifneq ($(filter 4.6.0%, $(shell $(TARGET_CC) --version)),) -TARGET_GLOBAL_CFLAGS += -Wno-unused-but-set-variable +# in gcc-4.4.x. We also want to disable sincos optimization globally +# by turning off the builtin sin function. +ifneq ($(filter 4.6.%, $(shell $(TARGET_CC) --version)),) +TARGET_GLOBAL_CFLAGS += -Wno-unused-but-set-variable -fno-builtin-sin \ + -fno-strict-volatile-bitfields endif # This is to avoid the dreaded warning compiler message: @@ -266,7 +268,7 @@ $(hide) $(PRIVATE_CXX) \ endef define transform-o-to-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bdynamic -Wl,-T,$(BUILD_SYSTEM)/armelf.x \ +$(hide) $(PRIVATE_CXX) -nostdlib -Bdynamic -fPIE -pie \ -Wl,-dynamic-linker,/system/bin/linker \ -Wl,--gc-sections \ -Wl,-z,nocopyreloc \ @@ -287,7 +289,7 @@ $(hide) $(PRIVATE_CXX) -nostdlib -Bdynamic -Wl,-T,$(BUILD_SYSTEM)/armelf.x \ endef define transform-o-to-static-executable-inner -$(hide) $(PRIVATE_CXX) -nostdlib -Bstatic -Wl,-T,$(BUILD_SYSTEM)/armelf.x \ +$(hide) $(PRIVATE_CXX) -nostdlib -Bstatic \ -Wl,--gc-sections \ -o $@ \ $(TARGET_GLOBAL_LD_DIRS) \ diff --git a/core/combo/TARGET_linux-sh.mk b/core/combo/TARGET_linux-sh.mk index b8e00dd..88c6215 100644 --- a/core/combo/TARGET_linux-sh.mk +++ b/core/combo/TARGET_linux-sh.mk @@ -19,8 +19,8 @@ # You can set TARGET_TOOLS_PREFIX to get gcc from somewhere else ifeq ($(strip $(TARGET_TOOLS_PREFIX)),) -TARGET_TOOLS_PREFIX := \ - prebuilt/$(HOST_PREBUILT_TAG)/toolchain/sh-4.3.3/bin/sh-linux-gnu- +TARGET_TOOLCHAIN_ROOT := prebuilt/$(HOST_PREBUILT_TAG)/toolchain/sh-4.3.3 +TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/sh-linux-gnu- endif TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX) diff --git a/core/combo/TARGET_linux-x86.mk b/core/combo/TARGET_linux-x86.mk index 0fb6edc..9e1d4bd 100644 --- a/core/combo/TARGET_linux-x86.mk +++ b/core/combo/TARGET_linux-x86.mk @@ -22,10 +22,22 @@ ifeq ($(strip $(TARGET_ARCH_VARIANT)),) TARGET_ARCH_VARIANT := x86 endif +# Include the arch-variant-specific configuration file. +# Its role is to define various ARCH_X86_HAVE_XXX feature macros, +# plus initial values for TARGET_GLOBAL_CFLAGS +# +TARGET_ARCH_SPECIFIC_MAKEFILE := $(BUILD_COMBOS)/arch/$(TARGET_ARCH)/$(TARGET_ARCH_VARIANT).mk +ifeq ($(strip $(wildcard $(TARGET_ARCH_SPECIFIC_MAKEFILE))),) +$(error Unknown $(TARGET_ARCH) architecture version: $(TARGET_ARCH_VARIANT)) +endif + +include $(TARGET_ARCH_SPECIFIC_MAKEFILE) + + # You can set TARGET_TOOLS_PREFIX to get gcc from somewhere else ifeq ($(strip $(TARGET_TOOLS_PREFIX)),) -TARGET_TOOLS_PREFIX := \ - prebuilt/$(HOST_PREBUILT_TAG)/toolchain/i686-android-linux-4.4.3/bin/i686-android-linux- +TARGET_TOOLCHAIN_ROOT := prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/i686-android-linux-4.4.3 +TARGET_TOOLS_PREFIX := $(TARGET_TOOLCHAIN_ROOT)/bin/i686-android-linux- endif TARGET_CC := $(TARGET_TOOLS_PREFIX)gcc$(HOST_EXECUTABLE_SUFFIX) @@ -73,7 +85,7 @@ TARGET_GLOBAL_CFLAGS += \ -Wa,--noexecstack \ -Werror=format-security \ -Wstrict-aliasing=2 \ - -fPIC \ + -fPIC -fPIE \ -ffunction-sections \ -finline-functions \ -finline-limit=300 \ @@ -84,27 +96,48 @@ TARGET_GLOBAL_CFLAGS += \ -funwind-tables \ -include $(call select-android-config-h,target_linux-x86) -# Needs to be fixed later -#TARGET_GLOBAL_CFLAGS += \ -# -fstack-protector - -# Needs to be added for RELEASE -#TARGET_GLOBAL_CFLAGS += \ -# -DNDEBUG - +# XXX: Not sure this is still needed. Must check with our toolchains. TARGET_GLOBAL_CPPFLAGS += \ -fno-use-cxa-atexit -ifeq ($(TARGET_ARCH_VARIANT),x86-atom) - TARGET_GLOBAL_CFLAGS += -march=atom -mstackrealign -DUSE_SSSE3 -DUSE_SSE2 -mfpmath=sse -else - TARGET_GLOBAL_CFLAGS += -march=i686 +# XXX: Our toolchain is normally configured to always set these flags by default +# however, there have been reports that this is sometimes not the case. So make +# them explicit here unless we have the time to carefully check it +# +TARGET_GLOBAL_CFLAGS += -mstackrealign -msse3 -mfpmath=sse + +# XXX: These flags should not be defined here anymore. Instead, the Android.mk +# of the modules that depend on these features should instead check the +# corresponding macros (e.g. ARCH_X86_HAVE_SSE2 and ARCH_X86_HAVE_SSSE3) +# Keep them here until this is all cleared up. +# +ifeq ($(ARCH_X86_HAVE_SSE2),true) +TARGET_GLOBAL_CFLAGS += -DUSE_SSE2 endif +ifeq ($(ARCH_X86_HAVE_SSSE3),true) # yes, really SSSE3, not SSE3! +TARGET_GLOBAL_CFLAGS += -DUSE_SSSE3 +endif + +# XXX: This flag is probably redundant. I believe our toolchain always sets +# it by default. Consider for removal. +# TARGET_GLOBAL_CFLAGS += -mbionic + +# XXX: This flag is probably redundant. The macro should be defined by our +# toolchain binaries automatically (as a compiler built-in). +# Check with: $BINPREFIX-gcc -dM -E < /dev/null +# +# Consider for removal. +# TARGET_GLOBAL_CFLAGS += -D__ANDROID__ +# XXX: This flag is probably redundant since our toolchain binaries already +# generate 32-bit machine code. It probably dates back to the old days +# where we were using the host toolchain on Linux to build the platform +# images. Consider it for removal. TARGET_GLOBAL_LDFLAGS += -m32 + TARGET_GLOBAL_LDFLAGS += -Wl,-z,noexecstack TARGET_GLOBAL_LDFLAGS += -Wl,--gc-sections @@ -158,6 +191,7 @@ $(hide) $(PRIVATE_CXX) \ -nostdlib -Bdynamic \ -Wl,-dynamic-linker,/system/bin/linker \ -Wl,-z,nocopyreloc \ + -fPIE -pie \ -o $@ \ $(TARGET_GLOBAL_LD_DIRS) \ -Wl,-rpath-link=$(TARGET_OUT_INTERMEDIATE_LIBRARIES) \ @@ -187,3 +221,21 @@ $(hide) $(PRIVATE_CXX) \ -Wl,--end-group \ $(if $(filter true,$(PRIVATE_NO_CRT)),,$(TARGET_CRTEND_O)) endef + +# Special check for x86 NDK ABI compatibility. +# The TARGET_CPU_ABI variable should be defined in BoardConfig.mk to 'x86' +# *only* if the platform image is compatible with the NDK x86 ABI. +# +# We perform a small check here to ensure that nothing bad can happen. +# +ifeq ($(TARGET_CPU_ABI),x86) + ifneq (true-true-true-true,$(ARCH_X86_HAVE_MMX)-$(ARCH_X86_HAVE_SSE)-$(ARCH_X86_HAVE_SSE2)-$(ARCH_X86_HAVE_SSE3)) + $(info ERROR: Your x86 platform image is not compatible with the NDK x86 ABI) + $(info As such, you should *not* define TARGET_CPU_ABI to 'x86' in your BoardConfig.mk) + $(info to ensure that your device will not be mistakenly listed as compatible by + $(info the Android Market. Also, it is likely that the image will fail the CTS tests) + $(info Please undefine TARGET_CPU_ABI in your BoardConfig.mk, or select the value 'none') + $(info The corresponding image will still be able to run Dalvik-based Android applications) + $(error Aborting build! Please fix your BoardConfig.mk) + endif +endif diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk index 7b5b8ed..32273ff 100644 --- a/core/combo/arch/arm/armv7-a-neon.mk +++ b/core/combo/arch/arm/armv7-a-neon.mk @@ -8,6 +8,7 @@ ARCH_ARM_HAVE_HALFWORD_MULTIPLY := true ARCH_ARM_HAVE_CLZ := true ARCH_ARM_HAVE_FFS := true ARCH_ARM_HAVE_ARMV7A := true +ARCH_ARM_HAVE_TLS_REGISTER := true ARCH_ARM_HAVE_VFP := true ARCH_ARM_HAVE_VFP_D32 := true ARCH_ARM_HAVE_NEON := true diff --git a/core/combo/arch/arm/armv7-a.mk b/core/combo/arch/arm/armv7-a.mk index 0ca3ec6..220f7ec 100644 --- a/core/combo/arch/arm/armv7-a.mk +++ b/core/combo/arch/arm/armv7-a.mk @@ -8,6 +8,7 @@ ARCH_ARM_HAVE_HALFWORD_MULTIPLY := true ARCH_ARM_HAVE_CLZ := true ARCH_ARM_HAVE_FFS := true ARCH_ARM_HAVE_ARMV7A := true +ARCH_ARM_HAVE_TLS_REGISTER := true ARCH_ARM_HAVE_VFP := true # Note: Hard coding the 'tune' value here is probably not ideal, diff --git a/core/combo/arch/x86/x86-atom.mk b/core/combo/arch/x86/x86-atom.mk new file mode 100644 index 0000000..85998e7 --- /dev/null +++ b/core/combo/arch/x86/x86-atom.mk @@ -0,0 +1,18 @@ +# This file contains feature macro definitions specific to the +# 'x86-atom' arch variant. This is an extension of the 'x86' base variant +# that adds Atom-specific features. +# +# See build/core/combo/arch/x86/x86.mk for differences. +# +ARCH_X86_HAVE_MMX := true +ARCH_X86_HAVE_SSE := true +ARCH_X86_HAVE_SSE2 := true +ARCH_X86_HAVE_SSE3 := true + +ARCH_X86_HAVE_SSSE3 := true +ARCH_X86_HAVE_MOVBE := true +ARCH_X86_HAVE_POPCNT := false # popcnt is not supported by current Atom CPUs + +# This flag is used to enabled Atom-specific optimizations with our toolchain +# +TARGET_GLOBAL_CFLAGS += -march=atom diff --git a/core/combo/arch/x86/x86.mk b/core/combo/arch/x86/x86.mk new file mode 100644 index 0000000..476da45 --- /dev/null +++ b/core/combo/arch/x86/x86.mk @@ -0,0 +1,35 @@ +# This file contains feature macro definitions specific to the +# base 'x86' platform ABI. This one must *strictly* match the NDK x86 ABI +# which mandates specific CPU extensions to be available. +# +# It is also used to build full_x86-eng / sdk_x86-eng platform images that +# are run in the emulator under KVM emulation (i.e. running directly on +# the host development machine's CPU). +# + +# If your target device doesn't support the four following features, then +# it cannot be compatible with the NDK x86 ABI. You should define a new +# target arch variant (e.g. "x86-mydevice") and a corresponding file +# under build/core/combo/arch/x86/ +# +ARCH_X86_HAVE_MMX := true +ARCH_X86_HAVE_SSE := true +ARCH_X86_HAVE_SSE2 := true +ARCH_X86_HAVE_SSE3 := true + +# These features are optional and shall not be included in the base platform +# Otherwise, they sdk_x86-eng system images might fail to run on some +# developer machines. +# + +ARCH_X86_HAVE_SSSE3 := false +ARCH_X86_HAVE_MOVBE := false +ARCH_X86_HAVE_POPCNT := false + + +# XXX: This flag is probably redundant, because it should be set by default +# by our toolchain binaries. However, there have been reports that this may +# not always work as intended, so keep it unless we have the time to check +# everything properly. + +TARGET_GLOBAL_CFLAGS += -march=i686 diff --git a/core/combo/select.mk b/core/combo/select.mk index cdeb68a..803cfc0 100644 --- a/core/combo/select.mk +++ b/core/combo/select.mk @@ -66,7 +66,7 @@ ifneq ($(USE_CCACHE),) ifeq ($(HOST_OS)-$(BUILD_OS),windows-linux) CCACHE_HOST_TAG := linux-$(BUILD_ARCH) endif - ccache := prebuilt/$(CCACHE_HOST_TAG)/ccache/ccache + ccache := prebuilts/misc/$(CCACHE_HOST_TAG)/ccache/ccache # Check that the executable is here. ccache := $(strip $(wildcard $(ccache))) ifdef ccache diff --git a/core/config.mk b/core/config.mk index d486ed3..56ef97e 100644 --- a/core/config.mk +++ b/core/config.mk @@ -29,9 +29,11 @@ SRC_HEADERS := \ $(TOPDIR)hardware/libhardware_legacy/include \ $(TOPDIR)hardware/ril/include \ $(TOPDIR)dalvik/libnativehelper/include \ + $(TOPDIR)frameworks/native/include \ + $(TOPDIR)frameworks/native/opengl/include \ $(TOPDIR)frameworks/base/include \ $(TOPDIR)frameworks/base/opengl/include \ - $(TOPDIR)frameworks/base/native/include \ + $(TOPDIR)frameworks/base/native/include \ $(TOPDIR)external/skia/include SRC_HOST_HEADERS:=$(TOPDIR)tools/include SRC_LIBRARIES:= $(TOPDIR)libs @@ -73,6 +75,8 @@ BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk BUILD_NATIVE_TEST := $(BUILD_SYSTEM)/native_test.mk BUILD_HOST_NATIVE_TEST := $(BUILD_SYSTEM)/host_native_test.mk +-include cts/build/config.mk + # ############################################################### # Parse out any modifier targets. # ############################################################### @@ -147,6 +151,33 @@ include $(board_config_mk) TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) board_config_mk := +# pull in device specific kernel headers. Files should be in +# $(TARGET_DEVICE_DIR)/kernel-headers, e.g. +# $(TARGET_DEVICE_DIR)/kernel-headers/linux/ +# $(TARGET_DEVICE_DIR)/kernel-headers/media/ +# $(TARGET_DEVICE_DIR)/kernel-headers/video/ +# etc. +TARGET_DEVICE_KERNEL_HEADERS := $(strip $(wildcard $(TARGET_DEVICE_DIR)/kernel-headers)) + +define validate-kernel-headers +$(if $(firstword $(foreach hdr_dir,$(1),\ + $(filter-out kernel-headers,$(notdir $(hdr_dir))))),\ + $(error Kernel header dirs must be end in kernel-headers: $(1))) +endef +# also allow the board config to provide additional directories since +# there could be device/oem/base_hw and device/oem/derived_hw +# that both are valid devices but derived_hw needs to use kernel headers +# from base_hw. +TARGET_BOARD_KERNEL_HEADERS := $(strip $(wildcard $(TARGET_BOARD_KERNEL_HEADERS))) +TARGET_BOARD_KERNEL_HEADERS := $(patsubst %/,%,$(TARGET_BOARD_KERNEL_HEADERS)) +$(call validate-kernel-headers,$(TARGET_BOARD_KERNEL_HEADERS)) + +# then add product-inherited includes, to allow for +# hardware/sivendor/chip/chip.mk to include their own headers +TARGET_PRODUCT_KERNEL_HEADERS := $(strip $(wildcard $(PRODUCT_VENDOR_KERNEL_HEADERS))) +TARGET_PRODUCT_KERNEL_HEADERS := $(patsubst %/,%,$(TARGET_PRODUCT_KERNEL_HEADERS)) +$(call validate-kernel-headers,$(TARGET_PRODUCT_KERNEL_HEADERS)) + # Clean up/verify variables defined by the board config file. TARGET_BOOTLOADER_BOARD_NAME := $(strip $(TARGET_BOOTLOADER_BOARD_NAME)) TARGET_CPU_ABI := $(strip $(TARGET_CPU_ABI)) @@ -169,6 +200,14 @@ include $(BUILD_SYSTEM)/combo/select.mk combo_target := TARGET_ include $(BUILD_SYSTEM)/combo/select.mk +# Compute TARGET_TOOLCHAIN_ROOT from TARGET_TOOLS_PREFIX +# if only TARGET_TOOLS_PREFIX is passed to the make command. +ifndef TARGET_TOOLCHAIN_ROOT +TARGET_TOOLCHAIN_ROOT := $(patsubst %/, %, $(dir $(TARGET_TOOLS_PREFIX))) +TARGET_TOOLCHAIN_ROOT := $(patsubst %/, %, $(dir $(TARGET_TOOLCHAIN_ROOT))) +TARGET_TOOLCHAIN_ROOT := $(wildcard $(TARGET_TOOLCHAIN_ROOT)) +endif + # Pick a Java compiler. include $(BUILD_SYSTEM)/combo/javac.mk @@ -318,7 +357,8 @@ HOST_GLOBAL_LD_DIRS += -L$(HOST_OUT_INTERMEDIATE_LIBRARIES) TARGET_GLOBAL_LD_DIRS += -L$(TARGET_OUT_INTERMEDIATE_LIBRARIES) HOST_PROJECT_INCLUDES:= $(SRC_HEADERS) $(SRC_HOST_HEADERS) $(HOST_OUT_HEADERS) -TARGET_PROJECT_INCLUDES:= $(SRC_HEADERS) $(TARGET_OUT_HEADERS) +TARGET_PROJECT_INCLUDES:= $(SRC_HEADERS) $(TARGET_OUT_HEADERS) \ + $(TARGET_OUT_KERNEL_HEADERS) # Many host compilers don't support these flags, so we have to make # sure to only specify them for the target compilers checked in to @@ -339,8 +379,8 @@ PREBUILT_IS_PRESENT := $(if $(wildcard prebuilt/Android.mk),true) # For use with the LOCAL_SDK_VERSION variable for include $(BUILD_PACKAGE) # ############################################################### -HISTORICAL_SDK_VERSIONS_ROOT := $(TOPDIR)prebuilt/sdk -HISTORICAL_NDK_VERSIONS_ROOT := $(TOPDIR)prebuilt/ndk +HISTORICAL_SDK_VERSIONS_ROOT := $(TOPDIR)prebuilts/sdk +HISTORICAL_NDK_VERSIONS_ROOT := $(TOPDIR)prebuilts/ndk # Historical SDK version N is stored in $(HISTORICAL_SDK_VERSIONS_ROOT)/N. # The 'current' version is whatever this source tree is. diff --git a/core/definitions.mk b/core/definitions.mk index 867575a..0b7092f 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -78,6 +78,9 @@ INTERNAL_DALVIK_MODULES:= # All findbugs xml files ALL_FINDBUGS_FILES:= +# GPL module license files +ALL_GPL_MODULE_LICENSE_FILES:= + ########################################################### ## Debugging; prints a variable list to stdout ########################################################### @@ -691,7 +694,7 @@ define _get-package-overrides endef define get-package-overrides -$(strip $(sort $(call _get-package-overrides,$(1)))) +$(sort $(strip $(call _get-package-overrides,$(1)))) endef ########################################################### @@ -802,6 +805,7 @@ $(hide) $(PRIVATE_RS_CC) \ -d $(PRIVATE_RS_OUTPUT_DIR) \ -a $@ -MD \ $(addprefix -target-api , $(PRIVATE_RS_TARGET_API)) \ + $(PRIVATE_RS_FLAGS) \ $(foreach inc,$(PRIVATE_RS_INCLUDES),$(addprefix -I , $(inc))) \ $(PRIVATE_RS_SOURCE_FILES) #$(hide) $(LLVM_RS_LINK) \ @@ -848,7 +852,7 @@ $(hide) for f in $(PRIVATE_PROTO_SRC_FILES); do \ $(addprefix --proto_path=, $(PRIVATE_PROTO_INCLUDES)) \ $(PRIVATE_PROTO_JAVA_OUTPUT_OPTION)=$(PRIVATE_PROTO_JAVA_OUTPUT_DIR) \ $(PRIVATE_PROTOC_FLAGS) \ - $$f; \ + $$f || exit 33; \ done $(hide) touch $@ endef @@ -890,7 +894,7 @@ $(hide) $(PRIVATE_CXX) \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CPPFLAGS) \ $(PRIVATE_DEBUG_CFLAGS) \ - -MD -o $@ $< + -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< $(transform-d-to-p) endef @@ -917,7 +921,7 @@ $(hide) $(PRIVATE_CC) \ $(PRIVATE_CFLAGS) \ $(1) \ $(PRIVATE_DEBUG_CFLAGS) \ - -MD -o $@ $< + -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< endef define transform-c-to-o-no-deps @@ -978,7 +982,7 @@ $(hide) $(PRIVATE_CXX) \ $(PRIVATE_CFLAGS) \ $(PRIVATE_CPPFLAGS) \ $(PRIVATE_DEBUG_CFLAGS) \ - -MD -o $@ $< + -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< $(transform-d-to-p) endef @@ -1004,7 +1008,7 @@ $(hide) $(PRIVATE_CC) \ $(PRIVATE_CFLAGS) \ $(1) \ $(PRIVATE_DEBUG_CFLAGS) \ - -MD -o $@ $< + -MD -MF $(patsubst %.o,%.d,$@) -o $@ $< endef define transform-host-c-to-o-no-deps @@ -1104,7 +1108,7 @@ $(hide) ldir=$(PRIVATE_INTERMEDIATES_DIR)/WHOLE/$(basename $(notdir $(1)))_objs; rm -rf $$ldir; \ mkdir -p $$ldir; \ filelist=; \ - for f in `$(HOST_AR) t $(1) | grep '\.o$$'`; do \ + for f in `$(HOST_AR) t $(1) | \grep '\.o$$'`; do \ $(HOST_AR) p $(1) $$f > $$ldir/$$f; \ filelist="$$filelist $$ldir/$$f"; \ done ; \ @@ -1292,13 +1296,6 @@ endef ifneq ($(HOST_CUSTOM_LD_COMMAND),true) define transform-host-o-to-executable-inner $(hide) $(PRIVATE_CXX) \ - -Wl,-rpath-link=$(HOST_OUT_INTERMEDIATE_LIBRARIES) \ - -Wl,-rpath,\$$ORIGIN/../lib \ - $(HOST_GLOBAL_LD_DIRS) \ - $(PRIVATE_LDFLAGS) \ - $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ - $(HOST_GLOBAL_LDFLAGS) \ - ) \ $(PRIVATE_ALL_OBJECTS) \ -Wl,--whole-archive \ $(call normalize-host-libraries,$(PRIVATE_ALL_WHOLE_STATIC_LIBRARIES)) \ @@ -1307,6 +1304,13 @@ $(hide) $(PRIVATE_CXX) \ $(call normalize-host-libraries,$(PRIVATE_ALL_STATIC_LIBRARIES)) \ $(if $(PRIVATE_GROUP_STATIC_LIBRARIES),-Wl$(comma)--end-group) \ $(call normalize-host-libraries,$(PRIVATE_ALL_SHARED_LIBRARIES)) \ + -Wl,-rpath-link=$(HOST_OUT_INTERMEDIATE_LIBRARIES) \ + -Wl,-rpath,\$$ORIGIN/../lib \ + $(HOST_GLOBAL_LD_DIRS) \ + $(PRIVATE_LDFLAGS) \ + $(if $(PRIVATE_NO_DEFAULT_COMPILER_FLAGS),, \ + $(HOST_GLOBAL_LDFLAGS) \ + ) \ -o $@ \ $(PRIVATE_LDLIBS) endef @@ -1444,7 +1448,8 @@ $(hide) if [ -d "$(PRIVATE_SOURCE_INTERMEDIATES_DIR)" ]; then \ fi $(hide) tr ' ' '\n' < $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list \ | sort -u > $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq -$(hide) $(1) -encoding UTF-8 \ +$(hide) if [ -s $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq ] ; then \ + $(1) -encoding UTF-8 \ $(strip $(PRIVATE_JAVAC_DEBUG_FLAGS)) \ $(if $(findstring true,$(LOCAL_WARNINGS_ENABLE)),$(xlint_unchecked),) \ $(2) \ @@ -1454,11 +1459,14 @@ $(hide) $(1) -encoding UTF-8 \ -extdirs "" -d $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ $(PRIVATE_JAVACFLAGS) \ \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq \ - || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) -$(if $(PRIVATE_JAVA_LAYERS_FILE), $(hide) build/tools/java-layers.py \ - $(PRIVATE_JAVA_LAYERS_FILE) \@$(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq,) + || ( rm -rf $(PRIVATE_CLASS_INTERMEDIATES_DIR) ; exit 41 ) \ +fi $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list $(hide) rm -f $(PRIVATE_CLASS_INTERMEDIATES_DIR)/java-source-list-uniq +$(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) \ + -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \ + $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \ + | xargs rm -rf) $(hide) jar $(if $(strip $(PRIVATE_JAR_MANIFEST)),-cfm,-cf) \ $@ $(PRIVATE_JAR_MANIFEST) -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) . endef @@ -1527,7 +1535,7 @@ define transform-classes.jar-to-dex @echo "target Dex: $(PRIVATE_MODULE)" @mkdir -p $(dir $@) $(hide) $(DX) \ - $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx1536M) \ + $(if $(findstring windows,$(HOST_OS)),,-JXms16M -JXmx2048M) \ --dex --output=$@ \ $(incremental_dex) \ $(if $(NO_OPTIMIZE_DX), \ @@ -1867,7 +1875,6 @@ $(if $(2), \ size=$$(for i in $(1); do $(call get-file-size,$$i); echo +; done; echo 0); \ total=$$(( $$( echo "$$size" ) )); \ printname=$$(echo -n "$(1)" | tr " " +); \ - echo "$$printname total size is $$total"; \ img_blocksize=$(call image-size-from-data-size,$(BOARD_FLASH_BLOCK_SIZE)); \ if [ "$(3)" == "yaffs" ]; then \ reservedblocks=8; \ @@ -1879,6 +1886,7 @@ $(if $(2), \ reserve=$$(((twoblocks > onepct ? twoblocks : onepct) + \ reservedblocks * img_blocksize)); \ maxsize=$$(($(2) - reserve)); \ + echo "$$printname maxsize=$$maxsize blocksize=$$img_blocksize total=$$total reserve=$$reserve"; \ if [ "$$total" -gt "$$maxsize" ]; then \ echo "error: $$printname too large ($$total > [$(2) - $$reserve])"; \ false; \ @@ -1919,6 +1927,21 @@ $$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) | $$(ACP) $$(transform-prebuilt-to-target) endef +# Version of add-radio-file that also arranges for the version of the +# file to be checked against the contents of +# $(TARGET_BOARD_INFO_FILE). +# $(1): filename +# $(2): name of version variable in board-info (eg, "version-baseband") +define add-radio-file-checked + $(eval $(call add-radio-file-checked-internal,$(1),$(notdir $(1)),$(2))) +endef +define add-radio-file-checked-internal +INSTALLED_RADIOIMAGE_TARGET += $$(PRODUCT_OUT)/$(2) +BOARD_INFO_CHECK += $(3):$(LOCAL_PATH)/$(1) +$$(PRODUCT_OUT)/$(2) : $$(LOCAL_PATH)/$(1) | $$(ACP) + $$(transform-prebuilt-to-target) +endef + ########################################################### # Override the package defined in $(1), setting the diff --git a/core/dumpvar.mk b/core/dumpvar.mk index e0de464..87f7086 100644 --- a/core/dumpvar.mk +++ b/core/dumpvar.mk @@ -3,13 +3,23 @@ # what to add to the path given the config we have chosen. ifeq ($(CALLED_FROM_SETUP),true) +ifneq ($(filter /%,$(HOST_OUT_EXECUTABLES)),) +ABP:=$(HOST_OUT_EXECUTABLES) +else ABP:=$(PWD)/$(HOST_OUT_EXECUTABLES) +endif -# Add the toolchain bin dir if it actually exists +# Add the ARM toolchain bin dir if it actually exists ifneq ($(wildcard $(PWD)/prebuilt/$(HOST_PREBUILT_TAG)/toolchain/arm-linux-androideabi-4.4.x/bin),) # this should be copied to HOST_OUT_EXECUTABLES instead ABP:=$(ABP):$(PWD)/prebuilt/$(HOST_PREBUILT_TAG)/toolchain/arm-linux-androideabi-4.4.x/bin endif + +# Add the x86 toolchain bin dir if it actually exists +ifneq ($(wildcard $(PWD)/prebuilts/gcc/$(HOST_PREBUILT_TAG)/x86/i686-android-linux-4.4.3/bin),) + # this should be copied to HOST_OUT_EXECUTABLES instead + ABP:=$(ABP):$(PWD)/prebuilts/gcc//$(HOST_PREBUILT_TAG)/x86/i686-android-linux-4.4.3/bin +endif ANDROID_BUILD_PATHS := $(ABP) ANDROID_PREBUILTS := prebuilt/$(HOST_PREBUILT_TAG) @@ -38,7 +48,11 @@ ifdef dumpvar_goals absolute_dumpvar := $(strip $(filter abs-%,$(dumpvar_goals))) ifdef absolute_dumpvar dumpvar_goals := $(patsubst abs-%,%,$(dumpvar_goals)) - DUMPVAR_VALUE := $(PWD)/$($(dumpvar_goals)) + ifneq ($(filter /%,$($(dumpvar_goals))),) + DUMPVAR_VALUE := $($(dumpvar_goals)) + else + DUMPVAR_VALUE := $(PWD)/$($(dumpvar_goals)) + endif dumpvar_target := dumpvar-abs-$(dumpvar_goals) else DUMPVAR_VALUE := $($(dumpvar_goals)) @@ -59,6 +73,7 @@ endif # CALLED_FROM_SETUP ifneq ($(PRINT_BUILD_CONFIG),) +HOST_OS_EXTRA:=$(shell python -c "import platform; print(platform.platform())") $(info ============================================) $(info PLATFORM_VERSION_CODENAME=$(PLATFORM_VERSION_CODENAME)) $(info PLATFORM_VERSION=$(PLATFORM_VERSION)) @@ -70,7 +85,9 @@ $(info TARGET_ARCH=$(TARGET_ARCH)) $(info TARGET_ARCH_VARIANT=$(TARGET_ARCH_VARIANT)) $(info HOST_ARCH=$(HOST_ARCH)) $(info HOST_OS=$(HOST_OS)) +$(info HOST_OS_EXTRA=$(HOST_OS_EXTRA)) $(info HOST_BUILD_TYPE=$(HOST_BUILD_TYPE)) $(info BUILD_ID=$(BUILD_ID)) +$(info OUT_DIR=$(OUT_DIR)) $(info ============================================) endif diff --git a/core/envsetup.mk b/core/envsetup.mk index 6cd42c8..9cc32c3 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -102,6 +102,14 @@ else HOST_PREBUILT_TAG := $(HOST_OS)-$(HOST_ARCH) endif +# TARGET_COPY_OUT_* are all relative to the staging directory, ie PRODUCT_OUT. +# Define them here so they can be used in product config files. +TARGET_COPY_OUT_SYSTEM := system +TARGET_COPY_OUT_DATA := data +TARGET_COPY_OUT_VENDOR := system/vendor +TARGET_COPY_OUT_ROOT := root +TARGET_COPY_OUT_RECOVERY := recovery + # Read the product specs so we an get TARGET_DEVICE and other # variables that we need in order to locate the output files. include $(BUILD_SYSTEM)/product_config.mk @@ -133,7 +141,11 @@ endif # figure out the output directories ifeq (,$(strip $(OUT_DIR))) +ifeq (,$(strip $(OUT_DIR_COMMON_BASE))) OUT_DIR := $(TOPDIR)out +else +OUT_DIR := $(OUT_DIR_COMMON_BASE)/$(notdir $(PWD)) +endif endif DEBUG_OUT_DIR := $(OUT_DIR)/debug @@ -179,10 +191,11 @@ HOST_OUT_COMMON_INTERMEDIATES := $(HOST_COMMON_OUT_ROOT)/obj TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj TARGET_OUT_HEADERS:= $(TARGET_OUT_INTERMEDIATES)/include +TARGET_OUT_KERNEL_HEADERS:= $(TARGET_OUT_INTERMEDIATES)/kernel-headers TARGET_OUT_INTERMEDIATE_LIBRARIES := $(TARGET_OUT_INTERMEDIATES)/lib TARGET_OUT_COMMON_INTERMEDIATES := $(TARGET_COMMON_OUT_ROOT)/obj -TARGET_OUT := $(PRODUCT_OUT)/system +TARGET_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_SYSTEM) TARGET_OUT_EXECUTABLES:= $(TARGET_OUT)/bin TARGET_OUT_OPTIONAL_EXECUTABLES:= $(TARGET_OUT)/xbin TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib @@ -195,7 +208,7 @@ TARGET_OUT_STATIC_LIBRARIES:= $(TARGET_OUT_INTERMEDIATES)/lib TARGET_OUT_NOTICE_FILES:=$(TARGET_OUT_INTERMEDIATES)/NOTICE_FILES TARGET_OUT_FAKE := $(PRODUCT_OUT)/fake_packages -TARGET_OUT_DATA := $(PRODUCT_OUT)/data +TARGET_OUT_DATA := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_DATA) TARGET_OUT_DATA_EXECUTABLES:= $(TARGET_OUT_EXECUTABLES) TARGET_OUT_DATA_SHARED_LIBRARIES:= $(TARGET_OUT_SHARED_LIBRARIES) TARGET_OUT_DATA_JAVA_LIBRARIES:= $(TARGET_OUT_JAVA_LIBRARIES) @@ -206,7 +219,9 @@ TARGET_OUT_DATA_ETC := $(TARGET_OUT_ETC) TARGET_OUT_DATA_STATIC_LIBRARIES:= $(TARGET_OUT_STATIC_LIBRARIES) TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest -TARGET_OUT_VENDOR := $(PRODUCT_OUT)/system/vendor +TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache + +TARGET_OUT_VENDOR := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_VENDOR) TARGET_OUT_VENDOR_EXECUTABLES:= $(TARGET_OUT_VENDOR)/bin TARGET_OUT_VENDOR_OPTIONAL_EXECUTABLES:= $(TARGET_OUT_VENDOR)/xbin TARGET_OUT_VENDOR_SHARED_LIBRARIES:= $(TARGET_OUT_VENDOR)/lib @@ -221,13 +236,13 @@ TARGET_ROOT_OUT_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED) TARGET_ROOT_OUT_SBIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/sbin TARGET_ROOT_OUT_BIN_UNSTRIPPED := $(TARGET_OUT_UNSTRIPPED)/bin -TARGET_ROOT_OUT := $(PRODUCT_OUT)/root +TARGET_ROOT_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_ROOT) TARGET_ROOT_OUT_BIN := $(TARGET_ROOT_OUT)/bin TARGET_ROOT_OUT_SBIN := $(TARGET_ROOT_OUT)/sbin TARGET_ROOT_OUT_ETC := $(TARGET_ROOT_OUT)/etc TARGET_ROOT_OUT_USR := $(TARGET_ROOT_OUT)/usr -TARGET_RECOVERY_OUT := $(PRODUCT_OUT)/recovery +TARGET_RECOVERY_OUT := $(PRODUCT_OUT)/$(TARGET_COPY_OUT_RECOVERY) TARGET_RECOVERY_ROOT_OUT := $(TARGET_RECOVERY_OUT)/root TARGET_SYSLOADER_OUT := $(PRODUCT_OUT)/sysloader diff --git a/core/find-jdk-tools-jar.sh b/core/find-jdk-tools-jar.sh index e1278c3..f150a9a 100755 --- a/core/find-jdk-tools-jar.sh +++ b/core/find-jdk-tools-jar.sh @@ -1,3 +1,4 @@ +#!/bin/sh if [ "x$ANDROID_JAVA_HOME" != x ] && [ -e "$ANDROID_JAVA_HOME/lib/tools.jar" ] ; then echo $ANDROID_JAVA_HOME/lib/tools.jar else diff --git a/core/host_java_library.mk b/core/host_java_library.mk index 322d10f..6cc0b1f 100644 --- a/core/host_java_library.mk +++ b/core/host_java_library.mk @@ -52,6 +52,7 @@ $(LOCAL_INTERMEDIATE_TARGETS): \ $(cleantarget): PRIVATE_CLEAN_FILES += $(intermediates.COMMON) $(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) +$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) $(jar_manifest_file) $(transform-host-java-to-package) @@ -87,6 +88,7 @@ endif else $(LOCAL_BUILT_MODULE): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) +$(LOCAL_BUILT_MODULE): PRIVATE_JAR_EXCLUDE_FILES := $(LOCAL_BUILT_MODULE): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) $(jar_manifest_file) $(transform-host-java-to-package) endif # LOCAL_BUILD_HOST_DEX diff --git a/core/java.mk b/core/java.mk index 0c51da3..38fd6f2 100644 --- a/core/java.mk +++ b/core/java.mk @@ -5,7 +5,7 @@ # Make sure there's something to build. # It's possible to build a package that doesn't contain any classes. -ifeq (,$(strip $(LOCAL_SRC_FILES)$(all_res_assets))) +ifeq (,$(strip $(LOCAL_SRC_FILES)$(all_res_assets)$(LOCAL_STATIC_JAVA_LIBRARIES))) $(error $(LOCAL_PATH): Target java module does not define any source or resource files) endif @@ -152,11 +152,16 @@ ifeq ($(LOCAL_RENDERSCRIPT_CC),) LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC) endif +# Turn on all warnings and warnings as errors for RS compiles. +# This can be disabled with LOCAL_RENDERSCRIPT_FLAGS := -Wno-error +renderscript_flags := -Wall -Werror +renderscript_flags += $(LOCAL_RENDERSCRIPT_FLAGS) + # prepend the RenderScript system include path ifneq ($(filter-out current,$(LOCAL_SDK_VERSION)),) LOCAL_RENDERSCRIPT_INCLUDES := \ - $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_VERSION)/renderscript/clang-include \ - $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_VERSION)/renderscript/include \ + $(HISTORICAL_SDK_VERSIONS_ROOT)/renderscript/clang-include \ + $(HISTORICAL_SDK_VERSIONS_ROOT)/renderscript/include \ $(LOCAL_RENDERSCRIPT_INCLUDES) else LOCAL_RENDERSCRIPT_INCLUDES := \ @@ -171,6 +176,7 @@ endif $(RenderScript_file_stamp): PRIVATE_RS_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES) $(RenderScript_file_stamp): PRIVATE_RS_CC := $(LOCAL_RENDERSCRIPT_CC) +$(RenderScript_file_stamp): PRIVATE_RS_FLAGS := $(renderscript_flags) $(RenderScript_file_stamp): PRIVATE_RS_SOURCE_FILES := $(renderscript_sources_fullpath) # By putting the generated java files into $(LOCAL_INTERMEDIATE_SOURCE_DIR), they will be # automatically found by the java compiling function transform-java-to-classes.jar. @@ -214,7 +220,7 @@ $(cleantarget): PRIVATE_CLEAN_FILES += $(intermediates.COMMON) # If the module includes java code (i.e., it's not framework-res), compile it. full_classes_jar := built_dex := -ifneq (,$(strip $(all_java_sources))) +ifneq (,$(strip $(all_java_sources)$(full_static_java_libs))) # If LOCAL_BUILT_MODULE_STEM wasn't overridden by our caller, # full_classes_jar will be the same module as LOCAL_BUILT_MODULE. @@ -238,19 +244,14 @@ $(full_classes_stubs_jar) : $(LOCAL_BUILT_MODULE) | $(ACP) $(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@ ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar) -# The layers file allows you to enforce a layering between java packages. -# Run build/tools/java-layers.py for more details. -layers_file := $(addprefix $(LOCAL_PATH)/, $(LOCAL_JAVA_LAYERS_FILE)) -$(full_classes_compiled_jar): PRIVATE_JAVA_LAYERS_FILE := $(layers_file) - # Compile the java files to a .jar file. # This intentionally depends on java_sources, not all_java_sources. # Deps for generated source files must be handled separately, # via deps on the target that generates the sources. $(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) -$(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps)\ - $(jar_manifest_file) $(layers_file) \ - $(RenderScript_file_stamp) $(proto_java_sources_file_stamp) +$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(LOCAL_JAR_EXCLUDE_FILES) +$(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) $(jar_manifest_file) \ + $(RenderScript_file_stamp) $(proto_java_sources_file_stamp) $(transform-java-to-classes.jar) # All of the rules after full_classes_compiled_jar are very unlikely diff --git a/core/java_library.mk b/core/java_library.mk index fa40c0e..06cdfc4 100644 --- a/core/java_library.mk +++ b/core/java_library.mk @@ -14,9 +14,11 @@ ifneq (,$(LOCAL_ASSET_DIR)) $(error $(LOCAL_PATH): Target java libraries may not set LOCAL_ASSET_DIR) endif +ifneq (true,$(LOCAL_IS_STATIC_JAVA_LIBRARY)) ifneq (,$(LOCAL_RESOURCE_DIR)) $(error $(LOCAL_PATH): Target java libraries may not set LOCAL_RESOURCE_DIR) endif +endif #xxx base_rules.mk looks at this all_res_assets := @@ -90,6 +92,7 @@ $(built_odex) : $(DEXPREOPT_BOOT_ODEXS) $(built_odex) : $(common_javalib.jar) | $(DEXPREOPT) $(DEXOPT) @echo "Dexpreopt Jar: $(PRIVATE_MODULE) ($@)" $(hide) rm -f $@ + @mkdir -p $(dir $@) $(call dexpreopt-one-file,$<,$@) $(LOCAL_BUILT_MODULE) : $(common_javalib.jar) | $(ACP) $(AAPT) diff --git a/core/legacy_prebuilts.mk b/core/legacy_prebuilts.mk index 41943b1..c25880d 100644 --- a/core/legacy_prebuilts.mk +++ b/core/legacy_prebuilts.mk @@ -43,6 +43,7 @@ GRANDFATHERED_ALL_PREBUILT := \ cdt.bin \ chat-ril \ cmu6plus.ok.zip \ + content \ cpcap-key.kl \ data \ dbus.conf \ diff --git a/core/main.mk b/core/main.mk index 89cbc63..ab9d52d 100644 --- a/core/main.mk +++ b/core/main.mk @@ -37,15 +37,20 @@ endif #TOPDIR := $(TOP)/ #endif -# check for broken versions of make +# Check for broken versions of make. +# (Allow any version under Cygwin since we don't actually build the platform there.) +ifeq (,$(findstring CYGWIN,$(shell uname -sm))) ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.81)) +ifeq (0,$(shell expr $$(echo $(MAKE_VERSION) | sed "s/[^0-9\.].*//") = 3.82)) $(warning ********************************************************************************) $(warning * You are using version $(MAKE_VERSION) of make.) -$(warning * Android can only be built by version 3.81.) +$(warning * Android can only be built by versions 3.81 and 3.82.) $(warning * see http://source.android.com/source/download.html) $(warning ********************************************************************************) $(error stopping) endif +endif +endif TOP := . TOPDIR := @@ -178,7 +183,7 @@ include $(BUILD_SYSTEM)/definitions.mk # Bring in dex_preopt.mk include $(BUILD_SYSTEM)/dex_preopt.mk -ifneq ($(filter eng user userdebug tests,$(MAKECMDGOALS)),) +ifneq ($(filter eng user userdebug,$(MAKECMDGOALS)),) $(info ***************************************************************) $(info ***************************************************************) $(info Don't pass '$(filter eng user userdebug tests,$(MAKECMDGOALS))' on \ @@ -202,6 +207,32 @@ $(info ***************************************************************) $(error stopping) endif +# ----------------------------------------------------------------- +# The pdk (Platform Development Kit) build +# pdk_eng : for building binary blob necessary for pdk_rel build +# pdk_rel : HAL build for chipset vendors + +PDK_BUILD_TYPE:= $(filter pdk_eng pdk_rel,$(MAKECMDGOALS)) +ifeq (2,$(words $(PDK_BUILD_TYPE))) + $(error You can't build pdk_eng and pdk_rel in the same run.) +endif +ifneq ($(PDK_BUILD_TYPE),) + $(info PDK build type $(PDK_BUILD_TYPE)) + BUILD_PDK:= true + include pdk/build/pdk.mk + # force droid target + MAKECMDGOALS:= $(subst $(PDK_BUILD_TYPE),droid,$(MAKECMDGOALS)) +ifeq ($(PDK_BUILD_TYPE), pdk_eng) + .PHONY: pdk_eng + pdk_eng: droid pdk_bin_zip + +else # pdk_rel + .PHONY: pdk_rel + pdk_rel: droid + +endif # pdk_rel +endif # PDK_BUILD_TYPE +# ----------------------------------------------------------------- ### ### In this section we set up the things that are different ### between the build variants @@ -271,11 +302,13 @@ endif # !enable_target_debugging ifeq ($(TARGET_BUILD_VARIANT),eng) tags_to_install := user debug eng +ifneq ($(filter ro.setupwizard.mode=ENABLED, $(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))),) # Don't require the setup wizard on eng builds ADDITIONAL_BUILD_PROPERTIES := $(filter-out ro.setupwizard.mode=%,\ $(call collapse-pairs, $(ADDITIONAL_BUILD_PROPERTIES))) \ ro.setupwizard.mode=OPTIONAL endif +endif ## tests ## @@ -387,74 +420,8 @@ SDK_ONLY := true endif ifeq ($(SDK_ONLY),true) - -# ----- SDK for Windows ------ -# These configure the build targets that are available for the SDK under Windows. -# The first section defines all the C/C++ tools that can be compiled in C/C++, -# the second section defines all the Java ones (assuming javac is available.) - -subdirs := \ - prebuilt \ - build/libs/host \ - build/tools/zipalign \ - dalvik/dexdump \ - dalvik/libdex \ - dalvik/tools/dmtracedump \ - dalvik/tools/hprof-conv \ - development/host \ - development/tools/etc1tool \ - development/tools/line_endings \ - development/tools/emulator/opengl \ - external/clang \ - external/easymock \ - external/expat \ - external/libpng \ - external/llvm \ - external/qemu \ - external/sqlite/dist \ - external/zlib \ - frameworks/base \ - frameworks/compile \ - sdk/avdlauncher \ - sdk/emulator/mksdcard \ - sdk/sdklauncher \ - system/core/adb \ - system/core/fastboot \ - system/core/libcutils \ - system/core/liblog \ - system/core/libzipfile - -# The following can only be built if "javac" is available. -# This check is used when building parts of the SDK under Cygwin. -ifneq (,$(shell which javac 2>/dev/null)) -subdirs += \ - build/tools/signapk \ - dalvik/dx \ - libcore \ - sdk/archquery \ - sdk/androidprefs \ - sdk/apkbuilder \ - sdk/assetstudio \ - sdk/common \ - sdk/ddms \ - sdk/hierarchyviewer2 \ - sdk/ide_common \ - sdk/jarutils \ - sdk/layoutlib_api \ - sdk/layoutopt \ - sdk/ninepatch \ - sdk/rule_api \ - sdk/lint \ - sdk/sdkstats \ - sdk/sdkmanager \ - sdk/swtmenubar \ - sdk/traceview \ - development/apps \ - development/tools/mkstubs \ - packages -else -$(warning SDK_ONLY: javac not available.) -endif +include $(TOPDIR)sdk/build/sdk_only_whitelist.mk +include $(TOPDIR)development/build/sdk_only_whitelist.mk # Exclude tools/acp when cross-compiling windows under linux ifeq ($(findstring Linux,$(UNAME)),) @@ -475,23 +442,24 @@ subdirs := \ build/libs \ build/target \ build/tools/acp \ + external/gcc-demangle \ external/mksh \ external/yaffs2 \ external/zlib else # !BUILD_TINY_ANDROID - -ifneq ($(TARGET_SUBDIRS),) -subdirs := $(TARGET_SUBDIRS) -else +ifneq ($(BUILD_PDK),) +subdirs := $(BUILD_PDK_SUBDIRS) +FULL_BUILD := true +else # Normal droid build # # Typical build; include any Android.mk files we can find. # subdirs := $(TOP) -endif # !TARGET_SUBDIRS - FULL_BUILD := true +endif # !BUILD_PDK + endif # !BUILD_TINY_ANDROID endif # !SDK_ONLY @@ -752,12 +720,18 @@ endif .PHONY: userdatatarball userdatatarball: $(INSTALLED_USERDATATARBALL_TARGET) +.PHONY: cacheimage +cacheimage: $(INSTALLED_CACHEIMAGE_TARGET) + .PHONY: bootimage bootimage: $(INSTALLED_BOOTIMAGE_TARGET) ifeq ($(BUILD_TINY_ANDROID), true) INSTALLED_RECOVERYIMAGE_TARGET := endif +ifneq ($(BUILD_PDK),) +INSTALLED_RECOVERYIMAGE_TARGET := +endif # Build files and then package it into the rom formats .PHONY: droidcore @@ -766,6 +740,7 @@ droidcore: files \ $(INSTALLED_BOOTIMAGE_TARGET) \ $(INSTALLED_RECOVERYIMAGE_TARGET) \ $(INSTALLED_USERDATAIMAGE_TARGET) \ + $(INSTALLED_CACHEIMAGE_TARGET) \ $(INSTALLED_FILES_FILE) # dist_files only for putting your library into the dist directory with a full build. @@ -822,8 +797,7 @@ endif # TARGET_BUILD_APPS endif # droid in $(MAKECMDGOALS) -.PHONY: droid tests -tests: droidcore +.PHONY: droid # phony target that include any targets in $(ALL_MODULES) .PHONY: all_modules diff --git a/core/pathmap.mk b/core/pathmap.mk index 60fbfd2..235f775 100644 --- a/core/pathmap.mk +++ b/core/pathmap.mk @@ -34,6 +34,7 @@ pathmap_INCL := \ corecg:external/skia/include/core \ dbus:external/dbus \ frameworks-base:frameworks/base/include \ + frameworks-native:frameworks/native/include \ graphics:external/skia/include/core \ libc:bionic/libc/include \ libdrm1:frameworks/base/media/libdrm/mobile1/include \ @@ -47,8 +48,13 @@ pathmap_INCL := \ libstdc++:bionic/libstdc++/include \ libthread_db:bionic/libthread_db/include \ mkbootimg:system/core/mkbootimg \ + opengl-tests-includes:frameworks/native/opengl/tests/include \ recovery:bootable/recovery \ system-core:system/core/include \ + audio-effects:system/media/audio_effects/include \ + audio-utils:system/media/audio_utils/include \ + wilhelm:system/media/wilhelm/include \ + wilhelm-ut:system/media/wilhelm/src/ut \ speex:external/speex/include # diff --git a/core/product.mk b/core/product.mk index 4d4c983..b001ca2 100644 --- a/core/product.mk +++ b/core/product.mk @@ -84,7 +84,9 @@ _product_var_list := \ PRODUCT_SDK_ADDON_DOC_MODULES \ PRODUCT_DEFAULT_WIFI_CHANNELS \ PRODUCT_DEFAULT_DEV_CERTIFICATE \ + PRODUCT_RESTRICT_VENDOR_FILES \ PRODUCT_FACTORY_RAMDISK_MODULES \ + PRODUCT_VENDOR_KERNEL_HEADERS \ define dump-product @@ -200,6 +202,9 @@ _product_stash_var_list := $(_product_var_list) \ TARGET_ARCH_VARIANT \ TARGET_BOARD_PLATFORM \ TARGET_BOARD_PLATFORM_GPU \ + TARGET_BOARD_KERNEL_HEADERS \ + TARGET_DEVICE_KERNEL_HEADERS \ + TARGET_PRODUCT_KERNEL_HEADERS \ TARGET_BOOTLOADER_BOARD_NAME \ TARGET_COMPRESS_MODULE_SYMBOLS \ TARGET_NO_BOOTLOADER \ @@ -228,6 +233,8 @@ _product_stash_var_list += \ BOARD_RECOVERYIMAGE_PARTITION_SIZE \ BOARD_SYSTEMIMAGE_PARTITION_SIZE \ BOARD_USERDATAIMAGE_PARTITION_SIZE \ + BOARD_CACHEIMAGE_FILE_SYSTEM_TYPE \ + BOARD_CACHEIMAGE_PARTITION_SIZE \ BOARD_FLASH_BLOCK_SIZE \ BOARD_SYSTEMIMAGE_PARTITION_SIZE \ BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE \ diff --git a/core/product_config.mk b/core/product_config.mk index c455723..ea3e517 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -306,6 +306,10 @@ DEVICE_PACKAGE_OVERLAYS := \ # An list of whitespace-separated words. PRODUCT_TAGS := $(strip $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_TAGS)) +# The list of product-specific kernel header dirs +PRODUCT_VENDOR_KERNEL_HEADERS := \ + $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_VENDOR_KERNEL_HEADERS) + # Add the product-defined properties to the build properties. ADDITIONAL_BUILD_PROPERTIES := \ $(ADDITIONAL_BUILD_PROPERTIES) \ diff --git a/core/static_java_library.mk b/core/static_java_library.mk index 93d770a..0b2f63b 100644 --- a/core/static_java_library.mk +++ b/core/static_java_library.mk @@ -21,5 +21,88 @@ LOCAL_UNINSTALLABLE_MODULE := true LOCAL_IS_STATIC_JAVA_LIBRARY := true + +# Hack to build static Java library with Android resource +# See bug 5714516 +all_resources := +ifdef LOCAL_RESOURCE_DIR +all_resources := $(strip \ + $(foreach dir, $(LOCAL_RESOURCE_DIR), \ + $(addprefix $(dir)/, \ + $(patsubst res/%,%, \ + $(call find-subdir-assets,$(dir)) \ + ) \ + ) \ + )) + +ifneq (,$(all_resources)) +# Those files will be excluded from the built jar. +# The R/Manifest classes should be re-generated in the app Module instead. +# Use '' and $ escape because they will be passed to bash. +LOCAL_JAR_EXCLUDE_FILES := 'R.class' 'R$$*.class' 'Manifest.class' 'Manifest$$*.class' +endif +endif + include $(BUILD_SYSTEM)/java_library.mk + +ifneq (,$(all_resources)) +R_file_stamp := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/R.stamp + +ifeq ($(strip $(LOCAL_MANIFEST_FILE)),) +LOCAL_MANIFEST_FILE := AndroidManifest.xml +endif +full_android_manifest := $(LOCAL_PATH)/$(LOCAL_MANIFEST_FILE) + +LOCAL_SDK_RES_VERSION:=$(strip $(LOCAL_SDK_RES_VERSION)) +ifeq ($(LOCAL_SDK_RES_VERSION),) + LOCAL_SDK_RES_VERSION:=$(LOCAL_SDK_VERSION) +endif + +framework_res_package_export := +framework_res_package_export_deps := +# Please refer to package.mk +ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) +ifneq ($(filter-out current,$(LOCAL_SDK_RES_VERSION)),) +framework_res_package_export := \ + $(HISTORICAL_SDK_VERSIONS_ROOT)/$(LOCAL_SDK_RES_VERSION)/android.jar +framework_res_package_export_deps := $(framework_res_package_export) +else +framework_res_package_export := \ + $(call intermediates-dir-for,APPS,framework-res,,COMMON)/package-export.apk +framework_res_package_export_deps := \ + $(dir $(framework_res_package_export))src/R.stamp +endif +endif + +$(R_file_stamp): PRIVATE_MODULE := $(LOCAL_MODULE) +# add --non-constant-id to prevent inlining constants. +$(R_file_stamp): PRIVATE_AAPT_FLAGS := $(LOCAL_AAPT_FLAGS) --non-constant-id +$(R_file_stamp): PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR) +$(R_file_stamp): PRIVATE_ANDROID_MANIFEST := $(full_android_manifest) +$(R_file_stamp): PRIVATE_RESOURCE_PUBLICS_OUTPUT := $(intermediates.COMMON)/public_resources.xml +$(R_file_stamp): PRIVATE_RESOURCE_DIR := $(LOCAL_RESOURCE_DIR) +$(R_file_stamp): PRIVATE_AAPT_INCLUDES := $(framework_res_package_export) +ifneq (,$(filter-out current, $(LOCAL_SDK_VERSION))) +$(R_file_stamp): PRIVATE_DEFAULT_APP_TARGET_SDK := $(LOCAL_SDK_VERSION) +else +$(R_file_stamp): PRIVATE_DEFAULT_APP_TARGET_SDK := $(DEFAULT_APP_TARGET_SDK) +endif +$(R_file_stamp): PRIVATE_ASSET_DIR := +$(R_file_stamp): PRIVATE_PROGUARD_OPTIONS_FILE := +$(R_file_stamp): PRIVATE_MANIFEST_PACKAGE_NAME := +$(R_file_stamp): PRIVATE_MANIFEST_INSTRUMENTATION_FOR := + +$(R_file_stamp) : $(all_resources) $(full_android_manifest) $(AAPT) $(framework_res_package_export_deps) + @echo "target R.java/Manifest.java: $(PRIVATE_MODULE) ($@)" + $(create-resource-java-files) + $(hide) find $(PRIVATE_SOURCE_INTERMEDIATES_DIR) -name R.java | xargs cat > $@ + +$(LOCAL_BUILT_MODULE): $(R_file_stamp) +ifneq ($(full_classes_jar),) +$(full_classes_compiled_jar): $(R_file_stamp) +endif + +endif # $(all_resources) not empty + LOCAL_IS_STATIC_JAVA_LIBRARY := +LOCAL_JAR_EXCLUDE_FILES := diff --git a/core/tasks/apicheck.mk b/core/tasks/apicheck.mk index 96e0f44..b3d800b 100644 --- a/core/tasks/apicheck.mk +++ b/core/tasks/apicheck.mk @@ -17,7 +17,8 @@ # api compatibility or added apis illegally. # -ifneq ($(BUILD_TINY_ANDROID), true) +# skip api check for TINY_ANDROID and PDK buid +ifeq (,$(filter true, $(BUILD_TINY_ANDROID) $(BUILD_PDK))) .PHONY: checkapi diff --git a/target/board/generic_armv5/BoardConfig.mk b/core/tasks/collect_gpl_sources.mk index d8fa2fe..3c7afcc 100644 --- a/target/board/generic_armv5/BoardConfig.mk +++ b/core/tasks/collect_gpl_sources.mk @@ -1,4 +1,3 @@ -# # Copyright (C) 2011 The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); @@ -12,12 +11,20 @@ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. -# -include build/target/board/generic/BoardConfig.mk +gpl_source_tgz := $(call intermediates-dir-for,PACKAGING,gpl_source,HOST,COMMON)/gpl_source.tgz + +$(gpl_source_tgz): PRIVATE_PATHS := $(sort $(patsubst %/, %, $(dir $(ALL_GPL_MODULE_LICENSE_FILES)))) +$(gpl_source_tgz) : $(ALL_GPL_MODULE_LICENSE_FILES) + @echo Package gpl sources: $@ + @rm -rf $(dir $@) && mkdir -p $(dir $@) + $(hide) tar cfz $@ --exclude ".git*" $(PRIVATE_PATHS) + -TARGET_ARCH_VARIANT := -TARGET_CPU_ABI := armeabi -TARGET_CPU_ABI2 := +.PHONY: gpl_source_tgz +gpl_source_tgz : $(gpl_source_tgz) -WITH_DEXPREOPT := false +# Dist the tgz only if we are doing a full build +ifeq (,$(TARGET_BUILD_APPS)) +$(call dist-for-goals, droidcore, $(gpl_source_tgz)) +endif diff --git a/core/tasks/cts.mk b/core/tasks/cts.mk index 45dcd0f..4f624d8 100644 --- a/core/tasks/cts.mk +++ b/core/tasks/cts.mk @@ -25,6 +25,9 @@ CTS_TF_JAR := $(HOST_OUT_JAVA_LIBRARIES)/cts-tradefed.jar CTS_TF_EXEC_PATH := $(HOST_OUT_EXECUTABLES)/cts-tradefed CTS_TF_README_PATH := $(cts_tools_src_dir)/tradefed-host/README +VMTESTSTF_INTERMEDIATES :=$(call intermediates-dir-for,EXECUTABLES,vm-tests-tf,1,) +VMTESTSTF_JAR := $(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar + CTS_CORE_CASE_LIST := \ android.core.tests.libcore.package.dalvik \ android.core.tests.libcore.package.com \ @@ -34,6 +37,10 @@ CTS_CORE_CASE_LIST := \ android.core.tests.libcore.package.libcore \ android.core.tests.runner +# Depend on the full package paths rather than the phony targets to avoid +# rebuilding the packages every time. +CTS_CORE_CASES := $(foreach pkg,$(CTS_CORE_CASE_LIST),$(call intermediates-dir-for,APPS,$(pkg))/package.apk) + -include cts/CtsTestCaseList.mk CTS_CASE_LIST := $(CTS_CORE_CASE_LIST) $(CTS_TEST_CASE_LIST) @@ -41,8 +48,7 @@ DEFAULT_TEST_PLAN := $(cts_dir)/$(cts_name)/resource/plans $(cts_dir)/all_cts_files_stamp: PRIVATE_JUNIT_HOST_JAR := $(junit_host_jar) --include cts/CtsHostLibraryList.mk -$(cts_dir)/all_cts_files_stamp: $(CTS_CASE_LIST) $(CTS_TEST_CASES) $(junit_host_jar) $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(CTS_TF_README_PATH) $(ACP) +$(cts_dir)/all_cts_files_stamp: $(CTS_CORE_CASES) $(CTS_TEST_CASES) $(CTS_TEST_CASE_LIST) $(junit_host_jar) $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(VMTESTSTF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(CTS_TF_README_PATH) $(ACP) # Make necessary directory for CTS $(hide) rm -rf $(PRIVATE_CTS_DIR) $(hide) mkdir -p $(TMP_DIR) @@ -51,6 +57,7 @@ $(cts_dir)/all_cts_files_stamp: $(CTS_CASE_LIST) $(CTS_TEST_CASES) $(junit_host_ $(hide) mkdir -p $(PRIVATE_DIR)/repository/testcases $(hide) mkdir -p $(PRIVATE_DIR)/repository/plans # Copy executable and JARs to CTS directory + $(hide) $(ACP) -fp $(VMTESTSTF_JAR) $(PRIVATE_DIR)/repository/testcases $(hide) $(ACP) -fp $(DDMLIB_JAR) $(PRIVATE_JUNIT_HOST_JAR) $(HOSTTESTLIB_JAR) $(CTS_HOST_LIBRARY_JARS) $(TF_JAR) $(CTS_TF_JAR) $(CTS_TF_EXEC_PATH) $(CTS_TF_README_PATH) $(PRIVATE_DIR)/tools # Change mode of the executables $(foreach apk,$(CTS_CASE_LIST),$(call copy-testcase-apk,$(apk))) @@ -81,96 +88,72 @@ CORETESTS_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-tests GEN_CLASSPATH := $(CORE_INTERMEDIATES)/classes.jar:$(BOUNCYCASTLE_INTERMEDIATES)/classes.jar:$(APACHEXML_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(SQLITEJDBC_INTERMEDIATES)/javalib.jar:$(CORETESTS_INTERMEDIATES)/javalib.jar -$(cts_dir)/all_cts_core_files_stamp: PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) +CTS_CORE_XMLS := \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml \ + $(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml + +$(CTS_CORE_XMLS): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) # Why does this depend on javalib.jar instead of classes.jar? Because # even though the tool will operate on the classes.jar files, the # build system requires that dependencies use javalib.jar. If # javalib.jar is up-to-date, then classes.jar is as well. Depending # on classes.jar will build the files incorrectly. -$(cts_dir)/all_cts_core_files_stamp: $(CTS_CORE_CASE_LIST) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CORE_INTERMEDIATES)/javalib.jar $(BOUNCYCASTLE_INTERMEDIATES)/javalib.jar $(APACHEXML_INTERMEDIATES)/javalib.jar $(SQLITEJDBC_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(CORETESTS_INTERMEDIATES)/javalib.jar $(cts_dir)/all_cts_files_stamp | $(ACP) - $(call generate-core-test-description,$(cts_dir)/$(cts_name)/repository/testcases/android.core.tests.libcore.package.dalvik,\ +$(CTS_CORE_XMLS): $(CTS_CORE_CASES) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CORE_INTERMEDIATES)/javalib.jar $(BOUNCYCASTLE_INTERMEDIATES)/javalib.jar $(APACHEXML_INTERMEDIATES)/javalib.jar $(SQLITEJDBC_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(CORETESTS_INTERMEDIATES)/javalib.jar | $(ACP) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik,\ cts/tests/core/libcore/dalvik/AndroidManifest.xml,\ $(CORETESTS_INTERMEDIATES)/javalib.jar,dalvik,\ libcore/expectations) - $(call generate-core-test-description,$(cts_dir)/$(cts_name)/repository/testcases/android.core.tests.libcore.package.com,\ + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com,\ cts/tests/core/libcore/com/AndroidManifest.xml,\ $(CORETESTS_INTERMEDIATES)/javalib.jar,com,\ libcore/expectations) - $(call generate-core-test-description,$(cts_dir)/$(cts_name)/repository/testcases/android.core.tests.libcore.package.sun,\ + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun,\ cts/tests/core/libcore/sun/AndroidManifest.xml,\ $(CORETESTS_INTERMEDIATES)/javalib.jar,sun,\ libcore/expectations) - $(call generate-core-test-description,$(cts_dir)/$(cts_name)/repository/testcases/android.core.tests.libcore.package.tests,\ + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests,\ cts/tests/core/libcore/tests/AndroidManifest.xml,\ $(CORETESTS_INTERMEDIATES)/javalib.jar,tests,\ libcore/expectations) - $(call generate-core-test-description,$(cts_dir)/$(cts_name)/repository/testcases/android.core.tests.libcore.package.org,\ + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org,\ cts/tests/core/libcore/org/AndroidManifest.xml,\ $(CORETESTS_INTERMEDIATES)/javalib.jar,org,\ libcore/expectations) - $(call generate-core-test-description,$(cts_dir)/$(cts_name)/repository/testcases/android.core.tests.libcore.package.libcore,\ + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore,\ cts/tests/core/libcore/libcore/AndroidManifest.xml,\ $(CORETESTS_INTERMEDIATES)/javalib.jar,libcore,\ libcore/expectations) - $(hide) touch $@ - - -# ----- Generate the test descriptions for the vm-tests ----- -# TODO: remove this section once cts-tf replaces cts. -# -CORE_VM_TEST_DESC := $(cts_dir)/$(cts_name)/repository/testcases/android.core.vm-tests - -VMTESTS_INTERMEDIATES :=$(call intermediates-dir-for,EXECUTABLES,vm-tests,1,) -# core tests only needed to get hold of junit-framework-classes -CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core,,COMMON) -JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON) - -GEN_CLASSPATH := $(CORE_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(VMTESTS_INTERMEDIATES)/android.core.vm-tests.jar:$(HOSTTESTLIB_JAR):$(DDMLIB_JAR) - -$(CORE_VM_TEST_DESC): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) -# Please see big comment above on why this line depends on javalib.jar instead of classes.jar -$(CORE_VM_TEST_DESC): vm-tests $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CORE_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(VMTESTS_INTERMEDIATES)/android.core.vm-tests.jar $(HOSTTESTLIB_JAR) $(DDMLIB_JAR) $(cts_dir)/all_cts_files_stamp | $(ACP) - $(call generate-core-test-description,$(CORE_VM_TEST_DESC),\ - cts/tests/vm-tests/AndroidManifest.xml,\ - $(VMTESTS_INTERMEDIATES)/android.core.vm-tests.jar,"",\ - libcore/expectations,\ - cts/tools/vm-tests/Android.mk) - $(ACP) -fv $(VMTESTS_INTERMEDIATES)/android.core.vm-tests.jar $(PRIVATE_DIR)/repository/testcases/android.core.vm-tests.jar # ----- Generate the test descriptions for the vm-tests-tf ----- # -CORE_VM_TEST_TF_DESC := $(cts_dir)/$(cts_name)/repository/testcases/android.core.vm-tests-tf +CORE_VM_TEST_TF_DESC := $(CTS_TESTCASES_OUT)/android.core.vm-tests-tf.xml -VMTESTSTF_INTERMEDIATES :=$(call intermediates-dir-for,EXECUTABLES,vm-tests-tf,1,) # core tests only needed to get hold of junit-framework-classes CORE_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core,,COMMON) JUNIT_INTERMEDIATES :=$(call intermediates-dir-for,JAVA_LIBRARIES,core-junit,,COMMON) -GEN_CLASSPATH := $(CORE_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar:$(DDMLIB_JAR):$(TF_JAR) +GEN_CLASSPATH := $(CORE_INTERMEDIATES)/classes.jar:$(JUNIT_INTERMEDIATES)/classes.jar:$(VMTESTSTF_JAR):$(DDMLIB_JAR):$(TF_JAR) $(CORE_VM_TEST_TF_DESC): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) # Please see big comment above on why this line depends on javalib.jar instead of classes.jar -$(CORE_VM_TEST_TF_DESC): $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CORE_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar $(DDMLIB_JAR) $(cts_dir)/all_cts_files_stamp | $(ACP) - $(call generate-core-test-description,$(CORE_VM_TEST_TF_DESC),\ +$(CORE_VM_TEST_TF_DESC): $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CORE_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(VMTESTSTF_JAR) $(DDMLIB_JAR) | $(ACP) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) + $(call generate-core-test-description,$(CTS_TESTCASES_OUT)/android.core.vm-tests-tf,\ cts/tests/vm-tests-tf/AndroidManifest.xml,\ - $(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar,"",\ + $(VMTESTSTF_JAR),"",\ libcore/expectations,\ cts/tools/vm-tests-tf/Android.mk) - $(ACP) -fv $(VMTESTSTF_INTERMEDIATES)/android.core.vm-tests-tf.jar $(PRIVATE_DIR)/repository/testcases/android.core.vm-tests-tf.jar - - -# Move app security host-side tests to the repository -APP_SECURITY_LIB := $(cts_dir)/$(cts_name)/repository/testcases/CtsAppSecurityTests.jar - -$(APP_SECURITY_LIB): $(HOST_OUT_JAVA_LIBRARIES)/CtsAppSecurityTests.jar $(cts_dir)/all_cts_files_stamp $(ACP) - $(ACP) -fv $(HOST_OUT_JAVA_LIBRARIES)/CtsAppSecurityTests.jar $(APP_SECURITY_LIB) - # Generate the default test plan for User. # Usage: buildCts.py <testRoot> <ctsOutputDir> <tempDir> <androidRootDir> <docletPath> -$(DEFAULT_TEST_PLAN): $(cts_dir)/all_cts_files_stamp $(cts_dir)/all_cts_core_files_stamp $(cts_tools_src_dir)/utils/buildCts.py $(CORE_VM_TEST_TF_DESC) $(CORE_VM_TEST_DESC) $(APP_SECURITY_LIB) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CTS_TEST_XMLS) | $(ACP) - $(hide) $(ACP) -fp $(CTS_TEST_XMLS) $(PRIVATE_DIR)/repository/testcases +$(DEFAULT_TEST_PLAN): $(cts_dir)/all_cts_files_stamp $(cts_tools_src_dir)/utils/buildCts.py $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CTS_CORE_XMLS) $(CTS_TEST_XMLS) $(CORE_VM_TEST_TF_DESC) | $(ACP) + $(hide) $(ACP) -fp $(CTS_CORE_XMLS) $(CTS_TEST_XMLS) $(CORE_VM_TEST_TF_DESC) $(PRIVATE_DIR)/repository/testcases $(hide) $(cts_tools_src_dir)/utils/buildCts.py cts/tests/tests/ $(PRIVATE_DIR) $(TMP_DIR) \ $(TOP) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar @@ -183,7 +166,7 @@ $(INTERNAL_CTS_TARGET): PRIVATE_NAME := $(cts_name) $(INTERNAL_CTS_TARGET): PRIVATE_CTS_DIR := $(cts_dir) $(INTERNAL_CTS_TARGET): PRIVATE_DIR := $(cts_dir)/$(cts_name) $(INTERNAL_CTS_TARGET): TMP_DIR := $(cts_dir)/temp -$(INTERNAL_CTS_TARGET): $(cts_dir)/all_cts_files_stamp $(DEFAULT_TEST_PLAN) $(CORE_VM_TEST_DESC) +$(INTERNAL_CTS_TARGET): $(cts_dir)/all_cts_files_stamp $(DEFAULT_TEST_PLAN) $(hide) echo "Package CTS: $@" $(hide) cd $(dir $@) && zip -rq $(notdir $@) $(PRIVATE_NAME) diff --git a/core/tasks/vendor_module_check.mk b/core/tasks/vendor_module_check.mk new file mode 100644 index 0000000..c2d6c78 --- /dev/null +++ b/core/tasks/vendor_module_check.mk @@ -0,0 +1,79 @@ +# +# Copyright (C) 2011 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +# Restrict the vendor module owners here. +_vendor_owner_whitelist := \ + broadcom \ + csr \ + imgtec \ + invensense \ + nxp \ + samsung \ + ti + + +ifneq (,$(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_RESTRICT_VENDOR_FILES)) + +_check_modules := $(sort $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)) + +# expand with the required modules +# $(1) the module name set to expand +define _expand_required_modules +$(eval _erm_new_modules:=)\ +$(foreach m, $(1), $(eval r:=$(ALL_MODULES.$(m).REQUIRED))\ + $(if $(r), $(if $(filter $(_check_modules), $(r)),,\ + $(eval _check_modules := $(_check_modules) $(r))\ + $(eval _erm_new_modules := $(_erm_new_modules) $(r)))))\ +$(if $(_erm_new_modules), $(call _expand_required_modules, $(_erm_new_modules))) +endef + +$(call _expand_required_modules, $(_check_modules)) + + +# Restrict owners +ifneq (,$(filter true owner all, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_RESTRICT_VENDOR_FILES))) + +ifneq (,$(filter vendor/%, $(PRODUCT_PACKAGE_OVERLAYS) $(DEVICE_PACKAGE_OVERLAYS))) +$(error Error: Product "$(TARGET_PRODUCT)" can not have overlay in vendor tree: \ + $(filter vendor/%, $(PRODUCT_PACKAGE_OVERLAYS) $(DEVICE_PACKAGE_OVERLAYS))) +endif +ifneq (,$(filter vendor/%, $(PRODUCT_COPY_FILES))) +$(error Error: Product "$(TARGET_PRODUCT)" can not have PRODUCT_COPY_FILES from vendor tree: \ + $(filter vendor/%, $(PRODUCT_COPY_FILES))) +endif + +$(foreach m, $(_check_modules), \ + $(if $(filter vendor/%, $(ALL_MODULES.$(m).PATH)),\ + $(if $(filter $(_vendor_owner_whitelist), $(ALL_MODULES.$(m).OWNER)),,\ + $(error Error: vendor module "$(m)" in $(ALL_MODULES.$(m).PATH) with unknown owner \ + "$(ALL_MODULES.$(m).OWNER)" in product "$(TARGET_PRODUCT)")))) + +endif + + +# Restrict paths +ifneq (,$(filter path all, $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_RESTRICT_VENDOR_FILES))) + +$(foreach m, $(_check_modules), \ + $(if $(filter vendor/%, $(ALL_MODULES.$(m).PATH)),\ + $(if $(filter $(TARGET_OUT_VENDOR)/%, $(ALL_MODULES.$(m).INSTALLED)),,\ + $(error Error: vendor module "$(m)" in $(ALL_MODULES.$(m).PATH) \ + in product "$(TARGET_PRODUCT)" being installed to \ + $(ALL_MODULES.$(m).INSTALLED) which is not in the vendor tree)))) + +endif + +endif diff --git a/core/user_tags.mk b/core/user_tags.mk index 2e7017e..53f0ee2 100644 --- a/core/user_tags.mk +++ b/core/user_tags.mk @@ -50,7 +50,6 @@ GRANDFATHERED_USER_MODULES += \ applypatch \ app_process \ archquery \ - asm-3.1 \ atree \ audio \ badblocks \ @@ -72,6 +71,7 @@ GRANDFATHERED_USER_MODULES += \ com.android.phone.common \ com.android.vcard \ commons-compress-1.0 \ + content \ copybit.qsd8k \ copybit.s5pc110 \ coverage \ @@ -171,7 +171,6 @@ GRANDFATHERED_USER_MODULES += \ layoutlib_api \ layoutlib_create \ layoutlib_utils \ - layoutopt \ liba2dp \ libabi \ libandroid \ @@ -472,7 +471,6 @@ GRANDFATHERED_USER_MODULES += \ sig-create \ signapk \ signature-tools \ - simg2img \ spec-progress \ sqlite3 \ stack_dump \ @@ -494,7 +492,6 @@ GRANDFATHERED_USER_MODULES += \ traceview \ tune2fs \ tune2fs_host \ - uix \ usbtest \ vdc \ vm-tests \ diff --git a/core/version_defaults.mk b/core/version_defaults.mk index 091fc34..c97306c 100644 --- a/core/version_defaults.mk +++ b/core/version_defaults.mk @@ -41,7 +41,7 @@ ifeq "" "$(PLATFORM_VERSION)" # which is the version that we reveal to the end user. # Update this value when the platform version changes (rather # than overriding it somewhere else). Can be an arbitrary string. - PLATFORM_VERSION := 4.0.3 + PLATFORM_VERSION := JellyBean endif ifeq "" "$(PLATFORM_SDK_VERSION)" @@ -59,7 +59,7 @@ endif ifeq "" "$(PLATFORM_VERSION_CODENAME)" # This is the current development code-name, if the build is not a final # release build. If this is a final release build, it is simply "REL". - PLATFORM_VERSION_CODENAME := REL + PLATFORM_VERSION_CODENAME := JellyBean endif ifeq "" "$(DEFAULT_APP_TARGET_SDK)" diff --git a/envsetup.sh b/envsetup.sh index bab2d25..f11763a 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -1,4 +1,4 @@ -function help() { +function hmm() { cat <<EOF Invoke ". build/envsetup.sh" from your shell to add the following functions to your environment: - croot: Changes directory to the top of the tree. @@ -146,6 +146,10 @@ function setpaths() unset ANDROID_HOST_OUT export ANDROID_HOST_OUT=$(get_abs_build_var HOST_OUT) + # needed for processing samples collected by perf counters + unset OPROFILE_EVENTS_DIR + export OPROFILE_EVENTS_DIR=$T/external/oprofile/events + # needed for building linux on MacOS # TODO: fix the path #export HOST_EXTRACFLAGS="-I "$T/system/kernel_headers/host_include @@ -502,8 +506,8 @@ complete -F _lunch lunch # Run tapas with one ore more app names (from LOCAL_PACKAGE_NAME) function tapas() { - local variant=$(echo -n $(echo $* | xargs -n 1 echo | grep -E '^(user|userdebug|eng)$')) - local apps=$(echo -n $(echo $* | xargs -n 1 echo | grep -E -v '^(user|userdebug|eng)$')) + local variant=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E '^(user|userdebug|eng)$')) + local apps=$(echo -n $(echo $* | xargs -n 1 echo | \grep -E -v '^(user|userdebug|eng)$')) if [ $(echo $variant | wc -w) -gt 1 ]; then echo "tapas: Error: Multiple build variants supplied: $variant" @@ -611,12 +615,17 @@ function mmm() T=$(gettop) if [ "$T" ]; then local MAKEFILE= + local MODULES= local ARGS= local DIR TO_CHOP local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') for DIR in $DIRS ; do - DIR=`echo $DIR | sed -e 's:/$::'` + MODULES=`echo $DIR | sed -n -e 's/.*:\(.*$\)/\1/p' | sed 's/,/ /'` + if [ "$MODULES" = "" ]; then + MODULES=all_modules + fi + DIR=`echo $DIR | sed -e 's/:.*//' -e 's:/$::'` if [ -f $DIR/Android.mk ]; then TO_CHOP=`(cd -P -- $T && pwd -P) | wc -c | tr -d ' '` TO_CHOP=`expr $TO_CHOP + 1` @@ -643,7 +652,7 @@ function mmm() fi fi done - ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS all_modules $ARGS + ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T $DASH_ARGS $MODULES $ARGS else echo "Couldn't locate the top of the tree. Try setting TOP." fi @@ -704,6 +713,14 @@ function gdbclient() local OUT_SO_SYMBOLS=$(get_abs_build_var TARGET_OUT_SHARED_LIBRARIES_UNSTRIPPED) local OUT_EXE_SYMBOLS=$(get_abs_build_var TARGET_OUT_EXECUTABLES_UNSTRIPPED) local PREBUILTS=$(get_abs_build_var ANDROID_PREBUILTS) + local ARCH=$(get_build_var TARGET_ARCH) + local GDB + case "$ARCH" in + x86) GDB=i686-android-linux-gdb;; + arm) GDB=arm-linux-androideabi-gdb;; + *) echo "Unknown arch $ARCH"; return 1;; + esac + if [ "$OUT_ROOT" -a "$PREBUILTS" ]; then local EXE="$1" if [ "$EXE" ] ; then @@ -744,7 +761,7 @@ function gdbclient() echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" echo >>"$OUT_ROOT/gdbclient.cmds" "" - arm-linux-androideabi-gdb -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" + $GDB -x "$OUT_ROOT/gdbclient.cmds" "$OUT_EXE_SYMBOLS/$EXE" else echo "Unable to determine build system output dir." fi @@ -908,7 +925,7 @@ function runhat() echo "Running hat on $localFile" echo "View the output by pointing your browser at http://localhost:7000/" echo "" - hat $localFile + hat -JXmx512m $localFile } function getbugreports() @@ -1007,7 +1024,7 @@ function godir () { echo "" fi local lines - lines=($(grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) + lines=($(\grep "$1" $T/filelist | sed -e 's/\/[^/]*$//' | sort | uniq)) if [[ ${#lines[@]} = 0 ]]; then echo "Not found" return diff --git a/libs/host/Android.mk b/libs/host/Android.mk index d02e4b2..9900f59 100644 --- a/libs/host/Android.mk +++ b/libs/host/Android.mk @@ -23,3 +23,5 @@ LOCAL_ACP_UNAVAILABLE:= true include $(BUILD_HOST_STATIC_LIBRARY) +# Include toolchain prebuilt modules if they exist. +-include $(TARGET_TOOLCHAIN_ROOT)/toolchain.mk diff --git a/libs/host/CopyFile.c b/libs/host/CopyFile.c index 23f1260..ca52565 100644 --- a/libs/host/CopyFile.c +++ b/libs/host/CopyFile.c @@ -137,7 +137,7 @@ static int copyFileContents(const char* dst, int dstFd, const char* src, int src return -1; } if (writeCount != readCount) { - fprintf(stderr, "acp: partial write to '%s' (%d of %d)\n", + fprintf(stderr, "acp: partial write to '%s' (%zd of %zd)\n", dst, writeCount, readCount); return -1; } diff --git a/target/board/Android.mk b/target/board/Android.mk index 58164f6..7d94ee0 100644 --- a/target/board/Android.mk +++ b/target/board/Android.mk @@ -26,19 +26,20 @@ endif # device we're building for. This file is typically packaged up # with everything else. # -# If the file "board-info.txt" appears in $(TARGET_DEVICE_DIR), -# it will be used; otherwise TARGET_BOARD_INFO_FILE is used, which -# can be set in BoardConfig.mk. +# If TARGET_BOARD_INFO_FILE (which can be set in BoardConfig.mk) is +# defined, it is used, otherwise board-info.txt is looked for in +# $(TARGET_DEVICE_DIR). # INSTALLED_ANDROID_INFO_TXT_TARGET := $(PRODUCT_OUT)/android-info.txt -board_info_txt := $(wildcard $(TARGET_DEVICE_DIR)/board-info.txt) -ifndef board_info_txt board_info_txt := $(TARGET_BOARD_INFO_FILE) +ifndef board_info_txt +board_info_txt := $(wildcard $(TARGET_DEVICE_DIR)/board-info.txt) endif $(INSTALLED_ANDROID_INFO_TXT_TARGET): $(board_info_txt) + $(hide) build/tools/check_radio_versions.py $< $(BOARD_INFO_CHECK) $(call pretty,"Generated: ($@)") ifdef board_info_txt - $(hide) cat $< > $@ + $(hide) grep -v '#' $< > $@ else $(hide) echo "board=$(TARGET_BOOTLOADER_BOARD_NAME)" > $@ endif diff --git a/target/board/generic/BoardConfig.mk b/target/board/generic/BoardConfig.mk index 57e60d3..bc999fa 100644 --- a/target/board/generic/BoardConfig.mk +++ b/target/board/generic/BoardConfig.mk @@ -21,6 +21,7 @@ TARGET_NO_KERNEL := true TARGET_ARCH_VARIANT := armv7-a TARGET_CPU_ABI := armeabi-v7a TARGET_CPU_ABI2 := armeabi +ARCH_ARM_HAVE_TLS_REGISTER := true HAVE_HTC_AUDIO_DRIVER := true BOARD_USES_GENERIC_AUDIO := true diff --git a/target/board/generic/device.mk b/target/board/generic/device.mk index 8b187d5..ca18365 100644 --- a/target/board/generic/device.mk +++ b/target/board/generic/device.mk @@ -19,12 +19,15 @@ PRODUCT_PROPERTY_OVERRIDES := \ ro.ril.hsxpa=1 \ - ro.ril.gprsclass=10 + ro.ril.gprsclass=10 \ + ro.adb.qemud=1 PRODUCT_COPY_FILES := \ development/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ development/data/etc/vold.conf:system/etc/vold.conf \ development/tools/emulator/system/camera/media_profiles.xml:system/etc/media_profiles.xml \ + development/tools/emulator/system/camera/media_codecs.xml:system/etc/media_codecs.xml \ PRODUCT_PACKAGES := \ - audio.primary.goldfish + audio.primary.goldfish \ + power.goldfish diff --git a/target/board/generic_armv5/AndroidBoard.mk b/target/board/generic_armv5/AndroidBoard.mk deleted file mode 100644 index 7daff27..0000000 --- a/target/board/generic_armv5/AndroidBoard.mk +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - --include build/target/board/generic/AndroidBoard.mk diff --git a/target/board/generic_armv5/README.txt b/target/board/generic_armv5/README.txt deleted file mode 100644 index 25d590a..0000000 --- a/target/board/generic_armv5/README.txt +++ /dev/null @@ -1,5 +0,0 @@ -The "generic_armv5" product defines a non-hardware-specific target -without a kernel or bootloader. - -It is not a product "base class"; no other products inherit -from it or use it in any way. diff --git a/target/board/generic_armv5/device.mk b/target/board/generic_armv5/device.mk deleted file mode 100644 index 7c4aaf2..0000000 --- a/target/board/generic_armv5/device.mk +++ /dev/null @@ -1,17 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -include build/target/board/generic/device.mk diff --git a/target/board/generic_armv5/system.prop b/target/board/generic_armv5/system.prop deleted file mode 100644 index 137a0f9..0000000 --- a/target/board/generic_armv5/system.prop +++ /dev/null @@ -1,6 +0,0 @@ -# -# system.prop for generic sdk -# - -rild.libpath=/system/lib/libreference-ril.so -rild.libargs=-d /dev/ttyS0 diff --git a/target/board/generic_x86/BoardConfig.mk b/target/board/generic_x86/BoardConfig.mk index 1a1bc80..c62b0a4 100644 --- a/target/board/generic_x86/BoardConfig.mk +++ b/target/board/generic_x86/BoardConfig.mk @@ -29,3 +29,7 @@ endif # Build OpenGLES emulation host and guest libraries BUILD_EMULATOR_OPENGL := true + +# Build and enable the OpenGL ES View renderer. When running on the emulator, +# the GLES renderer disables itself if host GL acceleration isn't available. +USE_OPENGL_RENDERER := true diff --git a/target/board/generic_x86/device.mk b/target/board/generic_x86/device.mk index 1055cba..3a1d2f0 100644 --- a/target/board/generic_x86/device.mk +++ b/target/board/generic_x86/device.mk @@ -19,9 +19,11 @@ PRODUCT_PROPERTY_OVERRIDES := \ ro.ril.hsxpa=1 \ - ro.ril.gprsclass=10 + ro.ril.gprsclass=10 \ + ro.adb.qemud=1 PRODUCT_COPY_FILES := \ development/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ development/data/etc/vold.conf:system/etc/vold.conf \ development/tools/emulator/system/camera/media_profiles.xml:system/etc/media_profiles.xml \ + development/tools/emulator/system/camera/media_codecs.xml:system/etc/media_codecs.xml \ diff --git a/target/board/vbox_x86/device.mk b/target/board/vbox_x86/device.mk index a76d8fa..a650ed6 100644 --- a/target/board/vbox_x86/device.mk +++ b/target/board/vbox_x86/device.mk @@ -21,14 +21,16 @@ LOCAL_PATH := $(call my-dir) PRODUCT_PROPERTY_OVERRIDES := \ ro.ril.hsxpa=1 \ - ro.ril.gprsclass=10 + ro.ril.gprsclass=10 \ + ro.adb.qemud=1 -LOCAL_KERNEL := prebuilt/android-x86/kernel/kernel-vbox +LOCAL_KERNEL := prebuilts/qemu-kernel/x86/kernel-vbox PRODUCT_COPY_FILES := \ development/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ development/data/etc/vold.conf:system/etc/vold.conf \ development/tools/emulator/system/camera/media_profiles.xml:system/etc/media_profiles.xml \ + development/tools/emulator/system/camera/media_codecs.xml:system/etc/media_codecs.xml \ build/target/board/vbox_x86/init.rc:root/init.rc \ build/target/board/vbox_x86/init.vbox_x86.rc:root/init.vbox_x86.rc \ $(LOCAL_KERNEL):kernel diff --git a/target/product/AndroidProducts.mk b/target/product/AndroidProducts.mk index e77c783..44b9000 100644 --- a/target/product/AndroidProducts.mk +++ b/target/product/AndroidProducts.mk @@ -35,7 +35,6 @@ else PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/core.mk \ $(LOCAL_DIR)/generic.mk \ - $(LOCAL_DIR)/generic_armv5.mk \ $(LOCAL_DIR)/generic_x86.mk \ $(LOCAL_DIR)/full.mk \ $(LOCAL_DIR)/full_x86.mk \ diff --git a/target/product/core.mk b/target/product/core.mk index abb2d9f..f655904 100644 --- a/target/product/core.mk +++ b/target/product/core.mk @@ -67,9 +67,11 @@ PRODUCT_PACKAGES := \ ip-up-vpn \ ip6tables \ iptables \ + libandroidfw \ libOpenMAXAL \ libOpenSLES \ libaudiopreprocessing \ + libaudioutils \ libcrypto \ libdvm \ libexpat \ @@ -84,10 +86,13 @@ PRODUCT_PACKAGES := \ libspeexresampler \ libsqlite_jni \ libssl \ - libstagefright_soft_h264dec \ libstagefright_soft_aacdec \ + libstagefright_soft_aacenc \ libstagefright_soft_amrdec \ + libstagefright_soft_amrnbenc \ + libstagefright_soft_amrwbenc \ libstagefright_soft_g711dec \ + libstagefright_soft_h264dec \ libstagefright_soft_mp3dec \ libstagefright_soft_mpeg4dec \ libstagefright_soft_vorbisdec \ @@ -96,8 +101,11 @@ PRODUCT_PACKAGES := \ libwebrtc_audio_preprocessing \ libwilhelm \ libz \ + requestsync \ screencap \ - sensorservice + sensorservice \ + lint + # host-only dependencies ifeq ($(WITH_HOST_DALVIK),true) diff --git a/target/product/full.mk b/target/product/full.mk index 0f1956b..8231e99 100644 --- a/target/product/full.mk +++ b/target/product/full.mk @@ -19,9 +19,6 @@ # build quite specifically for the emulator, and might not be # entirely appropriate to inherit from for on-device configurations. -PRODUCT_PACKAGES := \ - Camera - $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base_telephony.mk) $(call inherit-product, $(SRC_TARGET_DIR)/board/generic/device.mk) diff --git a/target/product/full_x86.mk b/target/product/full_x86.mk index c7a4cfb..d6a169a 100644 --- a/target/product/full_x86.mk +++ b/target/product/full_x86.mk @@ -26,9 +26,6 @@ ifdef NET_ETH0_STARTONBOOT PRODUCT_PROPERTY_OVERRIDES += net.eth0.startonboot=1 endif -PRODUCT_PACKAGES := \ - Camera - $(call inherit-product, $(SRC_TARGET_DIR)/product/full_base.mk) $(call inherit-product, $(SRC_TARGET_DIR)/board/generic_x86/device.mk) diff --git a/target/product/generic_armv5.mk b/target/product/generic_armv5.mk deleted file mode 100644 index daa321a..0000000 --- a/target/product/generic_armv5.mk +++ /dev/null @@ -1,25 +0,0 @@ -# -# Copyright (C) 2011 The Android Open Source Project -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -# This is a generic product that isn't specialized for a specific device. -# It includes the base Android platform. - -$(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk) - -# Overrides -PRODUCT_BRAND := generic_armv5 -PRODUCT_DEVICE := generic_armv5 -PRODUCT_NAME := generic_armv5 diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk index a39f05a..2a65adf 100644 --- a/target/product/generic_no_telephony.mk +++ b/target/product/generic_no_telephony.mk @@ -21,7 +21,6 @@ PRODUCT_POLICY := android.policy_phone PRODUCT_PACKAGES := \ DeskClock \ - AlarmProvider \ Bluetooth \ Calculator \ Calendar \ @@ -54,11 +53,14 @@ PRODUCT_PACKAGES += \ librs_jni \ libvideoeditor_jni \ libvideoeditorplayer \ - libvideoeditor_core + libvideoeditor_core \ + libdownmix PRODUCT_PACKAGES += \ audio.primary.default \ - audio_policy.default + audio_policy.default \ + local_time.default \ + power.default PRODUCT_PACKAGES += \ local_time.default diff --git a/target/product/large_emu_hw.mk b/target/product/large_emu_hw.mk index 15b1bed..91a9e08 100644 --- a/target/product/large_emu_hw.mk +++ b/target/product/large_emu_hw.mk @@ -22,11 +22,9 @@ PRODUCT_POLICY := android.policy_mid PRODUCT_PACKAGES := \ CarHome \ DeskClock \ - AlarmProvider \ Bluetooth \ Calculator \ Calendar \ - Camera \ CertInstaller \ DrmProvider \ Email \ diff --git a/target/product/locales_full.mk b/target/product/locales_full.mk index 1031303..8b8ab05 100644 --- a/target/product/locales_full.mk +++ b/target/product/locales_full.mk @@ -1,3 +1,3 @@ -PRODUCT_LOCALES := cs_CZ da_DK de_AT de_CH de_DE de_LI el_GR en_AU en_CA en_GB en_NZ en_SG en_US es_ES fr_CA fr_CH fr_BE fr_FR it_CH it_IT ja_JP ko_KR nb_NO nl_BE nl_NL pl_PL pt_PT ru_RU sv_SE tr_TR zh_CN zh_HK zh_TW am_ET hi_IN +PRODUCT_LOCALES := en_US cs_CZ da_DK de_AT de_CH de_DE de_LI el_GR en_AU en_CA en_GB en_NZ en_SG es_ES fr_CA fr_CH fr_BE fr_FR it_CH it_IT ja_JP ko_KR nb_NO nl_BE nl_NL pl_PL pt_PT ru_RU sv_SE tr_TR zh_CN zh_HK zh_TW am_ET hi_IN $(call inherit-product, build/target/product/languages_full.mk) diff --git a/target/product/sdk.mk b/target/product/sdk.mk index ceb1898..7287664 100644 --- a/target/product/sdk.mk +++ b/target/product/sdk.mk @@ -19,7 +19,6 @@ PRODUCT_PROPERTY_OVERRIDES := PRODUCT_PACKAGES := \ Calculator \ - Camera \ DeskClock \ Email \ Exchange \ @@ -77,7 +76,6 @@ PRODUCT_PACKAGES += \ ddms \ hierarchyviewer \ draw9patch \ - layoutopt \ traceview \ android \ dexdump \ @@ -88,6 +86,7 @@ PRODUCT_PACKAGES += \ # See development/build/sdk.atree PRODUCT_PACKAGES += \ androidprefs \ + annotations \ sdkstats \ archquery \ ddms \ @@ -95,14 +94,15 @@ PRODUCT_PACKAGES += \ ddmuilib \ draw9patch \ hierarchyviewer \ - layoutopt \ - uix \ traceview \ anttasks \ + ide_common \ sdklib \ sdkuilib \ sdkmanager \ swtmenubar \ + rule_api \ + assetstudio \ swing-worker-1.1 \ groovy-all-1.7.0 \ commons-compress-1.0 \ @@ -130,7 +130,8 @@ PRODUCT_PACKAGES += \ # audio libraries. PRODUCT_PACKAGES += \ audio.primary.goldfish \ - audio_policy.default + audio_policy.default \ + local_time.default PRODUCT_PACKAGE_OVERLAYS := development/sdk_overlay @@ -138,6 +139,8 @@ PRODUCT_COPY_FILES := \ system/core/rootdir/etc/vold.fstab:system/etc/vold.fstab \ frameworks/base/data/sounds/effects/camera_click.ogg:system/media/audio/ui/camera_click.ogg \ frameworks/base/data/sounds/effects/VideoRecord.ogg:system/media/audio/ui/VideoRecord.ogg \ + frameworks/base/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \ + frameworks/base/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:system/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \ frameworks/base/data/etc/android.hardware.camera.autofocus.xml:system/etc/permissions/android.hardware.camera.autofocus.xml $(call inherit-product-if-exists, frameworks/base/data/fonts/fonts.mk) @@ -137,11 +137,7 @@ def SetupToolsPath(): uname = os.uname()[0] if uname == "Darwin": - proc = os.uname()[-1] - if proc == "i386": - uname = "darwin-x86" - else: - uname = "darwin-ppc" + uname = "darwin-x86" elif uname == "Linux": uname = "linux-x86" prefix = "./prebuilt/" + uname + "/toolchain/arm-linux-androideabi-4.4.x/bin/" diff --git a/tools/check_radio_versions.py b/tools/check_radio_versions.py new file mode 100755 index 0000000..ebe621f --- /dev/null +++ b/tools/check_radio_versions.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python +# +# Copyright (C) 2012 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import sys +import os + +try: + from hashlib import sha1 +except ImportError: + from sha import sha as sha1 + +if len(sys.argv) < 2: + sys.exit(0) + +build_info = {} +f = open(sys.argv[1]) +for line in f: + line = line.strip() + if line.startswith("require"): + key, value = line.split()[1].split("=", 1) + build_info[key] = value +f.close() + +bad = False + +for item in sys.argv[2:]: + key, fn = item.split(":", 1) + + values = build_info.get(key, None) + if not values: + continue + values = values.split("|") + + f = open(fn, "rb") + digest = sha1(f.read()).hexdigest() + f.close() + + versions = {} + try: + f = open(fn + ".sha1") + except IOError: + if not bad: print + print "*** Error opening \"%s.sha1\"; can't verify %s" % (fn, key) + bad = True + continue + for line in f: + line = line.strip() + if not line or line.startswith("#"): continue + h, v = line.split() + versions[h] = v + + if digest not in versions: + if not bad: print + print "*** SHA-1 hash of \"%s\" doesn't appear in \"%s.sha1\"" % (fn, fn) + bad = True + continue + + if versions[digest] not in values: + if not bad: print + print "*** \"%s\" is version %s; not any %s allowed by \"%s\"." % ( + fn, versions[digest], key, sys.argv[1]) + bad = True + +if bad: + print + sys.exit(1) diff --git a/tools/droiddoc/templates-sdk/assets/android-developer-docs.css b/tools/droiddoc/templates-sdk/assets/android-developer-docs.css index 03073eb..6cc4a97 100644 --- a/tools/droiddoc/templates-sdk/assets/android-developer-docs.css +++ b/tools/droiddoc/templates-sdk/assets/android-developer-docs.css @@ -72,7 +72,9 @@ zoom:1; } +#side-nav li span.heading, #side-nav li h2 { + display:block; font-size:12px; font-weight: bold; margin:.5em 0 0 0; @@ -706,6 +708,18 @@ h5.jd-tagtitle { width:auto; } +div.design-announce { + border-top:1px solid #33B5E5; + border-bottom:1px solid #33B5E5; + padding:5px 10px 10px 55px; + margin:2em 0; + background:url('../design/static/ico_styleguide.png') 5px 13px no-repeat; +} + +div.design-announce p { + margin: .5em 0 0 0; +} + div.special { padding: .5em 1em 1em 1em; margin: 0 0 1em; diff --git a/tools/droiddoc/templates-sdk/assets/design/callout.png b/tools/droiddoc/templates-sdk/assets/design/callout.png Binary files differnew file mode 100644 index 0000000..5d49f34 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/callout.png diff --git a/tools/droiddoc/templates-sdk/assets/design/default.css b/tools/droiddoc/templates-sdk/assets/design/default.css new file mode 100644 index 0000000..5000ce8 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/default.css @@ -0,0 +1,641 @@ +/* color definitions */ +/* 16 column layout */ +/* clearfix idiom */ +/* common mixins */ +/* page layout + top-level styles */ +::-webkit-selection, +::-moz-selection, +::selection { + background-color: #0099cc; + color: #fff; } + +html, body { + height: 100%; + margin: 0; + padding: 0; + background: #eee none no-repeat fixed top left; + background-image: -webkit-gradient(linear, 100% 0%, 100% 100%, from(#dddddd), color-stop(25%, #f2f2f2), color-stop(75%, #f2f2f2), to(#dddddd)); + background-image: -moz-linear-gradient(top, #dddddd, #f2f2f2, #f2f2f2, #dddddd); + -webkit-font-smoothing: antialiased; + /* prevent subpixel antialiasing, which thickens the text */ + text-rendering: optimizeLegibility; + /* opentype ftw */ } + +body { + color: #555555; + font: 14px/20px Roboto, sans-serif; + font-weight: 400; } + +#page-container { + width: 940px; + margin: 0 40px; } + +#page-header { + height: 80px; + margin-bottom: 20px; + font-size: 48px; + line-height: 48px; + font-weight: 100; + padding-left: 10px; } + #page-header a { + display: block; + position: relative; + top: 20px; + text-decoration: none; + color: #555555 !important; } + +#main-row { + display: inline-block; } + #main-row:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; } + * html #main-row { + height: 1px; } + +#page-footer { + margin-left: 190px; + margin-top: 80px; + color: #999999; + padding-bottom: 40px; + font-size: 12px; + line-height: 15px; } + #page-footer a { + color: #777777; } + #page-footer #copyright { + margin-bottom: 10px; } + +#nav-container { + width: 160px; + min-height: 10px; + margin-right: 20px; + float: left; } + +#nav { + width: 160px; } + +#nav.fixed { + position: fixed; + top: 40px; } + +#content { + width: 760px; + float: left; } + +a, +a:visited { + color: #333333; } + +a:hover, +acronym:hover { + color: #7aa1b0 !important; } + +a:focus, +a:active { + color: #33b5e5 !important; } + +img { + border: none; } + +ul { + margin: 0; + padding: 0; } + +strong { + font-weight: 500; } + +em { + font-style: italic; } + +code { + font-family: Courier New, monospace; } + +acronym { + border-bottom: 1px dotted #555555; + cursor: help; } + +acronym:hover { + border-bottom-color: #7aa1b0; } + +img.with-shadow, +video.with-shadow { + box-shadow: 0 2px 4px rgba(0, 0, 0, 0.25); } + +/* disclosures mixin */ +/* content layout */ +.layout-content-row { + display: inline-block; + margin-bottom: 10px; } + .layout-content-row:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; } + * html .layout-content-row { + height: 1px; } + +.layout-content-col { + float: left; + margin-left: 20px; } + .layout-content-col:first-child { + margin-left: 0; } + +.layout-content-col.span-1 { + width: 40px; } + +.layout-content-col.span-2 { + width: 100px; } + +.layout-content-col.span-3 { + width: 160px; } + +.layout-content-col.span-4 { + width: 220px; } + +.layout-content-col.span-5 { + width: 280px; } + +.layout-content-col.span-6 { + width: 340px; } + +.layout-content-col.span-7 { + width: 400px; } + +.layout-content-col.span-8 { + width: 460px; } + +.layout-content-col.span-9 { + width: 520px; } + +.layout-content-col.span-10 { + width: 580px; } + +.layout-content-col.span-11 { + width: 640px; } + +.layout-content-col.span-12 { + width: 700px; } + +.layout-content-col.span-13 { + width: 760px; } + +.vspace.size-1 { + height: 10px; } + +.vspace.size-2 { + height: 20px; } + +.vspace.size-3 { + height: 30px; } + +.vspace.size-4 { + height: 40px; } + +.vspace.size-5 { + height: 50px; } + +.vspace.size-6 { + height: 60px; } + +.vspace.size-7 { + height: 70px; } + +.vspace.size-8 { + height: 80px; } + +.vspace.size-9 { + height: 90px; } + +.vspace.size-10 { + height: 100px; } + +.vspace.size-11 { + height: 110px; } + +.vspace.size-12 { + height: 120px; } + +.vspace.size-13 { + height: 130px; } + +.vspace.size-14 { + height: 140px; } + +.vspace.size-15 { + height: 150px; } + +.vspace.size-16 { + height: 160px; } + +/* nav */ +#nav { + /* section header divs */ + /* expanded section header divs */ + /* sublinks */ } + #nav li { + list-style-type: none; + font-size: 14px; + line-height: 10px; } + #nav a { + color: #555555; + text-decoration: none; } + #nav li.selected > a, + #nav li.selected .nav-section-header a { + font-weight: 500; + color: #0099cc !important; } + #nav .nav-section-header { + position: relative; + padding: 10px; + margin-bottom: 1px; + /* section header links */ } + #nav .nav-section-header a { + color: #333333; + font-weight: 500; + text-transform: uppercase; } + #nav .nav-section-header:after { + content: ''; + background: transparent url(disclosure_down.png) no-repeat scroll top left; + width: 10px; + height: 10px; + display: block; + position: absolute; + top: 10px; + right: 10px; } + #nav .nav-section-header.empty:after { + display: none; } + #nav li.expanded .nav-section-header { + background: rgba(0, 0, 0, 0.05); } + #nav li.expanded .nav-section-header:after { + content: ''; + background: transparent url(disclosure_up.png) no-repeat scroll top left; + width: 10px; + height: 10px; } + #nav > li > ul { + height: 0; + overflow: hidden; + margin-bottom: 0; } + #nav > li > ul.animate-height { + -webkit-transition: height 0.25s ease-in; + -moz-transition: height 0.25s ease-in; + transition: height 0.25s ease-in; } + #nav > li > ul li { + padding: 10px 10px 11px 10px; } + #nav > li.expanded > ul { + height: auto; } + #nav > li.expanded > ul li { + background: rgba(0, 0, 0, 0.03); } + #nav #back-dac-section { + padding: 10px; + border-top: 1px solid #ddd; } + #nav #back-dac-section a { + color: #333333; + font-weight: 500; + text-transform: uppercase; } + +/* content header */ +.content-header { + border-bottom: 1px solid #33b5e5; + height: 30px; } + .content-header h2 { + border-bottom: 0; } + .content-header.just-links { + border-bottom: 0; } + +.content-footer { + border-top: 1px solid #33b5e5; + margin-top: 10px; + height: 30px; } + +.paging-links { + position: relative; } + .paging-links a { + position: absolute; + font-size: 14px; + line-height: 30px; + color: #555555; + text-decoration: none; + text-transform: uppercase; } + .paging-links .prev-page-link { + display: none; + left: -5px; } + .paging-links .prev-page-link:before { + content: ''; + background: transparent url(disclosure_left.png) no-repeat scroll top left; + width: 10px; + height: 10px; + display: inline-block; + margin-right: 5px; } + .paging-links .next-page-link { + display: none; + right: 10px; } + .paging-links .next-page-link:after { + content: ''; + background: transparent url(disclosure_right.png) no-repeat scroll top left; + width: 10px; + height: 10px; + display: inline-block; + margin-left: 5px; } + +/* content body */ +@-webkit-keyframes glowheader { + from { + background-color: #33b5e5; + color: #000; + border-bottom-color: #000; } + + to { + background-color: transparent; + color: #33b5e5; + border-bottom-color: #33b5e5; } } + +@-moz-keyframes glowheader { + from { + background-color: #33b5e5; + color: #000; + border-bottom-color: #000; } + + to { + background-color: transparent; + color: #33b5e5; + border-bottom-color: #33b5e5; } } + +@keyframes glowheader { + from { + background-color: #33b5e5; + color: #000; + border-bottom-color: #000; } + + to { + background-color: transparent; + color: #33b5e5; + border-bottom-color: #33b5e5; } } + +#content p, +#content ul, +#content ol, +#content h3 { + margin: 0 10px 10px 10px; } +#content h2 { + padding-left: 10px; + padding-right: 10px; + margin-bottom: 10px; + font-size: 16px; + line-height: 30px; + font-weight: 500; + color: #33b5e5; + border-bottom: 1px solid #33b5e5; + height: 30px; } + #content h2:target { + -webkit-animation-name: glowheader; + -moz-animation-name: glowheader; + animation-name: glowheader; + -webkit-animation-duration: 0.7s; + -moz-animation-duration: 0.7s; + animation-duration: 0.7s; + -webkit-animation-timing-function: ease-out; + -moz-animation-timing-function: ease-out; + animation-timing-function: ease-out; } +#content hr { + border: 0; + border-bottom: 1px solid #33b5e5; + margin-bottom: 20px; } +#content h3 { + color: #33b5e5; + text-transform: uppercase; + font-size: 14px; + line-height: 20px; + font-weight: 500; } +#content h4 { + margin: 0 10px; + color: #333333; + font-weight: 500; + font-size: 14px; + line-height: 20px; } +#content strong { + color: #333333; } +#content ul li, +#content ol li { + margin-left: 20px; } + #content ul li h4, + #content ol li h4 { + margin: 0; } + #content ul li p, + #content ol li p { + margin-left: 0; } +#content ul li { + list-style-type: square; + list-style-type: none; + position: relative; } + #content ul li:before { + content: '\2022'; + font-family: verdana; + font-size: 14px; + line-height: 20px; + position: absolute; + left: -20px; + top: -1px; } +#content ol { + counter-reset: item; } + #content ol li { + font-size: 14px; + line-height: 20px; + list-style-type: none; + position: relative; } + #content ol li:before { + content: counter(item) ". "; + counter-increment: item; + position: absolute; + left: -20px; + top: 0; } + #content ol li.value-1:before { + content: "1. "; } + #content ol li.value-2:before { + content: "2. "; } + #content ol li.value-3:before { + content: "3. "; } + #content ol li.value-4:before { + content: "4. "; } + #content ol li.value-5:before { + content: "5. "; } + #content ol li.value-6:before { + content: "6. "; } + #content ol li.value-7:before { + content: "7. "; } + #content ol li.value-8:before { + content: "8. "; } + #content ol li.value-9:before { + content: "9. "; } + #content ol li.value-10:before { + content: "10. "; } +#content .with-callouts ol li { + list-style-position: inside; + margin-left: 0; } + #content .with-callouts ol li:before { + position: static; + display: inline; + left: 0; + float: left; + width: 17px; + color: #33b5e5; + font-weight: 500; } + +/* special list items */ +li.no-bullet { + list-style-type: none !important; } + +#content li.with-icon { + position: relative; + margin-left: 40px; + min-height: 30px; } + #content li.with-icon p { + margin-left: 0 !important; } + #content li.with-icon:before { + position: absolute; + left: -40px; + top: 0; + content: ''; + width: 30px; + height: 30px; } + #content li.with-icon.tablet:before { + background-image: url(ico_phone_tablet.png); } + #content li.with-icon.web:before { + background-image: url(ico_web.png); } + #content li.with-icon.checklist:before { + background-image: url(ico_checklist.png); } + #content li.with-icon.action:before { + background-image: url(ico_action.png); } + #content li.with-icon.use:before { + background-image: url(ico_use.png); } + +/* figures and callouts */ +.figure { + position: relative; } + .figure.pad-below { + margin-bottom: 20px; } + .figure .figure-callout { + position: absolute; + color: #fff; + font-weight: 500; + font-size: 16px; + line-height: 23px; + text-align: center; + background: transparent url(callout.png) no-repeat scroll 50% 50%; + padding-right: 2px; + width: 30px; + height: 29px; + z-index: 1000; } + .figure .figure-callout.top { + top: -9px; } + .figure .figure-callout.right { + right: -5px; } + +.figure-caption { + margin: 0 10px 20px 10px; + font-size: 14px; + line-height: 20px; + font-style: italic; } + +/* rows of figures */ +.figure-row { + font-size: 0; + line-height: 0; + /* to prevent space between figures */ } + .figure-row .figure { + display: inline-block; + vertical-align: top; } + .figure-row .figure + .figure { + margin-left: 10px; + /* reintroduce space between figures */ } + +/* video containers */ +.framed-galaxynexus-land-span-13 { + background: transparent url(content/misc_full_galaxynexus_blank_land_span13.png) no-repeat scroll top left; + padding: 42px 122px 62px 126px; + overflow: hidden; } + .framed-galaxynexus-land-span-13, .framed-galaxynexus-land-span-13 video, .framed-galaxynexus-land-span-13 img { + width: 512px; + height: 286px; } + +.framed-galaxynexus-port-span-9 { + background: transparent url(content/misc_full_galaxynexus_blank_port_span9.png) no-repeat scroll top left; + padding: 95px 122px 107px 124px; + overflow: hidden; } + .framed-galaxynexus-port-span-9, .framed-galaxynexus-port-span-9 video, .framed-galaxynexus-port-span-9 img { + width: 274px; + height: 488px; } + +.framed-galaxynexus-port-span-5 { + background: transparent url(content/misc_full_galaxynexus_blank_port_span5.png) no-repeat scroll top left; + padding: 75px 31px 76px 33px; + overflow: hidden; } + .framed-galaxynexus-port-span-5, .framed-galaxynexus-port-span-5 video, .framed-galaxynexus-port-span-5 img { + width: 216px; + height: 384px; } + +/* landing page disclosures */ +.landing-page-link { + text-decoration: none; + font-weight: 500; + color: #333333; } + .landing-page-link:after { + content: ''; + background: transparent url(disclosure_right.png) no-repeat scroll top left; + width: 10px; + height: 10px; + display: inline-block; + margin-left: 5px; } + +/* tooltips */ +.tooltip-box { + position: absolute; + background-color: rgba(0, 0, 0, 0.9); + border-radius: 2px; + font-size: 14px; + line-height: 20px; + color: #fff; + padding: 6px 10px; + max-width: 250px; + z-index: 10000; } + .tooltip-box.below:after { + position: absolute; + content: ''; + line-height: 0; + display: block; + top: -10px; + left: 5px; + border: 5px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.9); } + +/* video note */ +.video-instructions { + margin-top: 10px; + margin-bottom: 10px; } + .video-instructions:before { + content: ''; + background: transparent url(ico_movie_inline.png) no-repeat scroll top left; + display: inline-block; + width: 12px; + height: 12px; + margin-right: 8px; } + .video-instructions:after { + content: 'Click to replay movie.'; } + +/* download buttons */ +.download-button { + display: block; + margin-bottom: 5px; + text-decoration: none; + background-color: #33b5e5; + color: #fff !important; + font-weight: 500; + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.12); + padding: 6px 12px; + border-radius: 2px; } + .download-button:hover, .download-button:focus { + background-color: #0099cc; + color: #fff !important; } + .download-button:active { + background-color: #006699; } diff --git a/tools/droiddoc/templates-sdk/assets/design/default.js b/tools/droiddoc/templates-sdk/assets/design/default.js new file mode 100644 index 0000000..b306573 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/default.js @@ -0,0 +1,188 @@ +$(document).ready(function() { + // prep nav expandos + var pagePath = document.location.pathname; + if (pagePath.indexOf(SITE_ROOT) == 0) { + pagePath = pagePath.substr(SITE_ROOT.length); + if (pagePath == '' || pagePath.charAt(pagePath.length - 1) == '/') { + pagePath += 'index.html'; + } + } + + if (SITE_ROOT.match(/\.\.\//) || SITE_ROOT == '') { + // If running locally, SITE_ROOT will be a relative path, so account for that by + // finding the relative URL to this page. This will allow us to find links on the page + // leading back to this page. + var pathParts = pagePath.split('/'); + var relativePagePathParts = []; + var upDirs = (SITE_ROOT.match(/(\.\.\/)+/) || [''])[0].length / 3; + for (var i = 0; i < upDirs; i++) { + relativePagePathParts.push('..'); + } + for (var i = 0; i < upDirs; i++) { + relativePagePathParts.push(pathParts[pathParts.length - (upDirs - i) - 1]); + } + relativePagePathParts.push(pathParts[pathParts.length - 1]); + pagePath = relativePagePathParts.join('/'); + } else { + // Otherwise the page path should be an absolute URL. + pagePath = SITE_ROOT + pagePath; + } + + // select current page in sidenav and set up prev/next links if they exist + var $selNavLink = $('#nav').find('a[href="' + pagePath + '"]'); + if ($selNavLink.length) { + $selListItem = $selNavLink.closest('li'); + + $selListItem.addClass('selected'); + $selListItem.closest('li.nav-section').addClass('expanded'); + + // set up prev links + var $prevLink = []; + var $prevListItem = $selListItem.prev('li'); + if ($prevListItem.length) { + if ($prevListItem.hasClass('nav-section')) { + // jump to last topic of previous section + $prevLink = $prevListItem.find('a:last'); + } else { + // jump to previous topic in this section + $prevLink = $prevListItem.find('a:eq(0)'); + } + } else { + // jump to this section's index page (if it exists) + $prevLink = $selListItem.parents('li').find('a'); + } + + if ($prevLink.length) { + var prevHref = $prevLink.attr('href'); + if (prevHref == SITE_ROOT + 'index.html') { + // Don't show Previous when it leads to the homepage + $('.prev-page-link').hide(); + } else { + $('.prev-page-link').attr('href', prevHref).show(); + } + } else { + $('.prev-page-link').hide(); + } + + // set up next links + var $nextLink = []; + if ($selListItem.hasClass('nav-section')) { + // we're on an index page, jump to the first topic + $nextLink = $selListItem.find('ul').find('a:eq(0)') + } else { + // jump to the next topic in this section (if it exists) + $nextLink = $selListItem.next('li').find('a:eq(0)'); + if (!$nextLink.length) { + // no more topics in this section, jump to the first topic in the next section + $nextLink = $selListItem.parents('li').next('li.nav-section').find('a:eq(0)'); + } + } + if ($nextLink.length) { + $('.next-page-link').attr('href', $nextLink.attr('href')).show(); + } else { + $('.next-page-link').hide(); + } + } + + // Set up expand/collapse behavior + $('#nav li.nav-section').click(function() { + if ($(this).hasClass('expanded')) { + return; + } + + // hide other + var $old = $('#nav li.nav-section.expanded'); + if ($old.length) { + var $oldUl = $old.children('ul'); + $oldUl.css('height', $oldUl.height() + 'px'); + window.setTimeout(function() { + $oldUl + .addClass('animate-height') + .css('height', ''); + }, 0); + $old.removeClass('expanded'); + } + + // show me + $(this).addClass('expanded'); + var $ul = $(this).children('ul'); + var expandedHeight = $ul.height(); + $ul + .removeClass('animate-height') + .css('height', 0); + window.setTimeout(function() { + $ul + .addClass('animate-height') + .css('height', expandedHeight + 'px'); + }, 0); + }); + + // Stop expand/collapse behavior when clicking on nav section links (since we're navigating away + // from the page) + $('.nav-section-header').find('a:eq(0)').click(function(evt) { + window.location.href = $(this).attr('href'); + return false; + }); + + // Set up play-on-hover <video> tags. + $('video.play-on-hover').bind('click', function(){ + $(this).get(0).load(); // in case the video isn't seekable + $(this).get(0).play(); + }); + + // Set up tooltips + var TOOLTIP_MARGIN = 10; + $('acronym').each(function() { + var $target = $(this); + var $tooltip = $('<div>') + .addClass('tooltip-box') + .text($target.attr('title')) + .hide() + .appendTo('body'); + $target.removeAttr('title'); + + $target.hover(function() { + // in + var targetRect = $target.offset(); + targetRect.width = $target.width(); + targetRect.height = $target.height(); + + $tooltip.css({ + left: targetRect.left, + top: targetRect.top + targetRect.height + TOOLTIP_MARGIN + }); + $tooltip.addClass('below'); + $tooltip.show(); + }, function() { + // out + $tooltip.hide(); + }); + }); + + // Set up <h2> deeplinks + $('h2').click(function() { + var id = $(this).attr('id'); + if (id) { + document.location.hash = id; + } + }); + + // Set up fixed navbar + var navBarIsFixed = false; + $(window).scroll(function() { + var scrollTop = $(window).scrollTop(); + var navBarShouldBeFixed = (scrollTop > (100 - 40)); + if (navBarIsFixed != navBarShouldBeFixed) { + if (navBarShouldBeFixed) { + $('#nav') + .addClass('fixed') + .prependTo('#page-container'); + } else { + $('#nav') + .removeClass('fixed') + .prependTo('#nav-container'); + } + navBarIsFixed = navBarShouldBeFixed; + } + }); +});
\ No newline at end of file diff --git a/tools/droiddoc/templates-sdk/assets/design/default.scss b/tools/droiddoc/templates-sdk/assets/design/default.scss new file mode 100644 index 0000000..536ee16 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/default.scss @@ -0,0 +1,740 @@ +/* color definitions */ + +$text_color: #555; +$text_color_dark: #333; +$text_color_light: #777; +$text_color_lighter: #999; + +$ics_blue: #33b5e5; +$ics_blue_dark: #09c; +$ics_blue_darkest: #069; +$ics_blue_desaturated: #7aa1b0; + +$panel_background: rgba(0, 0, 0, 0.03); +$panel_background_dark: rgba(0, 0, 0, 0.05); + +$light_shadow_color: rgba(0,0,0,0.25); +$lighter_shadow_color: rgba(0,0,0,0.12); + +$tiny_text_size: 12px; +$small_text_size: 14px; +$large_text_size: 16px; +$default_line_height: 20px; +$tiny_line_height: 15px; + +$thinweight: 100; +$normalweight: 400; +$boldweight: 500; + +/* 16 column layout */ + +$col_width: 40px; +$gutter_width: 20px; + +@function gridwidth($n) { + @return $n * $col_width + ($n - 1) * $gutter_width; +} + +/* clearfix idiom */ + +@mixin clearfix { + display: inline-block; + &:after { + content: "."; + display: block; + height: 0; + clear: both; + visibility: hidden; + } + * html & { height: 1px } +} + +/* common mixins */ + +@mixin fontheight($font_size, $line_height) { + font-size: $font_size; + line-height: $line_height; +} + +@mixin prefixed($property, $value) { + -webkit-#{$property}: $value; + -moz-#{$property}: $value; + #{$property}: $value; +} + +/* page layout + top-level styles */ + +::-webkit-selection, +::-moz-selection, +::selection { + background-color: $ics_blue_dark; + color: #fff; +} + +html, body { + height: 100%; + margin: 0; + padding: 0; + background: #eee none no-repeat fixed top left; + background-image: -webkit-gradient(linear, 100% 0%, 100% 100%, from(#ddd), color-stop(25%, #f2f2f2), color-stop(75%, #f2f2f2), to(#ddd)); + background-image: -moz-linear-gradient(top, #ddd, #f2f2f2, #f2f2f2, #ddd); + -webkit-font-smoothing: antialiased; /* prevent subpixel antialiasing, which thickens the text */ + text-rendering: optimizeLegibility; /* opentype ftw */ +} + +body { + color: $text_color; + font: #{$small_text_size}/#{$default_line_height} Roboto,sans-serif; + font-weight: $normalweight; +} + +#page-container { + width: gridwidth(16); + margin: 0 40px; +} + +#page-header { + height: 80px; + margin-bottom: 20px; + @include fontheight(48px, 48px); + font-weight: $thinweight; + padding-left: $gutter_width / 2; + + a { + display: block; + position: relative; + top: 20px; + text-decoration :none; + color: $text_color !important; + } +} + +#main-row { + @include clearfix; +} + +#page-footer { + margin-left: gridwidth(3) + $gutter_width + 10; + margin-top: 80px; + color: $text_color_lighter; + padding-bottom: 40px; + @include fontheight($tiny_text_size, $tiny_line_height); + + a { + color: $text_color_light; + } + + #copyright { + margin-bottom: 10px; + } +} + +#nav-container { + width: gridwidth(3); + min-height: 10px; + margin-right: $gutter_width; + float: left; +} + +#nav { + width: gridwidth(3); +} + +#nav.fixed { + position: fixed; + top: 40px; +} + +#content { + width: gridwidth(13); + float: left; +} + +a, +a:visited { + color: $text_color_dark; +} + +a:hover, +acronym:hover { + color: $ics_blue_desaturated !important; +} + +a:focus, +a:active { + color: $ics_blue !important; +} + +img { + border: none; +} + +ul { + margin: 0; + padding: 0; +} + +strong { + font-weight: $boldweight; +} + +em { + font-style: italic; +} + +code { + font-family: Courier New, monospace; +} + +acronym { + border-bottom: 1px dotted $text_color; + cursor: help; +} + +acronym:hover { + border-bottom-color: $ics_blue_desaturated; +} + +img.with-shadow, +video.with-shadow { + box-shadow: 0 2px 4px $light_shadow_color; +} + +/* disclosures mixin */ + +@mixin disclosure($type) { + content: ''; + background: transparent url(disclosure_#{$type}.png) no-repeat scroll top left; + width: 10px; + height: 10px; +} + +/* content layout */ + +.layout-content-row { + @include clearfix; + margin-bottom: 10px; +} + +.layout-content-col { + float: left; + margin-left: $gutter_width; + + &:first-child { + margin-left: 0; + } +} + +@for $n from 1 through 13 { + .layout-content-col.span-#{$n} { width: gridwidth($n); } +} + +@for $n from 1 through 16 { + .vspace.size-#{$n} { height: 10px * $n; } +} + +/* nav */ + +#nav { + li { + list-style-type: none; + @include fontheight($small_text_size, 10px); + } + + a { + color: $text_color; + text-decoration: none; + } + + li.selected > a, + li.selected .nav-section-header a { + font-weight: $boldweight; + color: $ics_blue_dark !important; + } + + /* section header divs */ + + .nav-section-header { + position: relative; + padding: 10px; + margin-bottom: 1px; + + /* section header links */ + + a { + color: $text_color_dark; + font-weight: $boldweight; + text-transform: uppercase; + } + + &:after { + @include disclosure(down); + display: block; + position: absolute; + top: 10px; + right: 10px; + } + + &.empty:after { + display: none; + } + } + + /* expanded section header divs */ + + li.expanded .nav-section-header { + background: $panel_background_dark; + + &:after { + @include disclosure(up); + } + } + + /* sublinks */ + + & > li > ul { + height: 0; + overflow: hidden; + margin-bottom: 0; + + &.animate-height { + @include prefixed(transition, height 0.25s ease-in); + } + + li { + padding: 10px 10px (10px + 1) 10px; + } + } + + & > li.expanded > ul { + height: auto; + + li { + background: $panel_background; + } + } + + #back-dac-section { + padding: 10px; + border-top: 1px solid #ddd; + + a { + color: $text_color_dark; + font-weight: $boldweight; + text-transform: uppercase; + } + } +} + +/* content header */ + +$content_header_height: 30px; + +.content-header { + border-bottom: 1px solid $ics_blue; + height: $content_header_height; + + h2 { + border-bottom: 0; + } + + &.just-links { + border-bottom: 0; + } +} + +.content-footer { + border-top: 1px solid $ics_blue; + margin-top: 10px; + height: $content_header_height; +} + +.paging-links { + position: relative; + + a { + position: absolute; + font-size: $small_text_size; + line-height: $content_header_height; + color: $text_color; + text-decoration: none; + text-transform: uppercase; + } + + .prev-page-link { + display: none; + left: -5px; + + &:before { + @include disclosure(left); + display: inline-block; + margin-right: 5px; + } + } + + .next-page-link { + display: none; + right: 10px; + + &:after { + @include disclosure(right); + display: inline-block; + margin-left: 5px; + } + } +} + +/* content body */ + +@-webkit-keyframes glowheader { + from { background-color: rgb(51, 181, 229); color: #000; border-bottom-color: #000; } + to { background-color: transparent; color: $ics_blue; border-bottom-color: $ics_blue; } +} +@-moz-keyframes glowheader { + from { background-color: rgb(51, 181, 229); color: #000; border-bottom-color: #000; } + to { background-color: transparent; color: $ics_blue; border-bottom-color: $ics_blue; } +} +@keyframes glowheader { + from { background-color: rgb(51, 181, 229); color: #000; border-bottom-color: #000; } + to { background-color: transparent; color: $ics_blue; border-bottom-color: $ics_blue; } +} + +#content { + p, + ul, + ol, + h3 { + margin: 0 10px 10px 10px; + } + + h2 { + padding-left: 10px; + padding-right: 10px; + margin-bottom: 10px; + font-size: $large_text_size; + line-height: $content_header_height; + font-weight: $boldweight; + color: $ics_blue; + border-bottom: 1px solid $ics_blue; + height: $content_header_height; + + &:target { + @include prefixed(animation-name, glowheader); + @include prefixed(animation-duration, 0.7s); + @include prefixed(animation-timing-function, ease-out); + } + } + + hr { + border: 0; + border-bottom: 1px solid $ics_blue; + margin-bottom: 20px; + } + + h3 { + color: $ics_blue; + text-transform: uppercase; + @include fontheight($small_text_size, $default_line_height); + font-weight: $boldweight; + } + + h4 { + margin: 0 10px; + color: $text_color_dark; + font-weight: $boldweight; + @include fontheight($small_text_size, $default_line_height); + } + + strong { + color: $text_color_dark; + } + + ul li, + ol li { + margin-left: 20px; + + h4 { + margin: 0; + } + + p { + margin-left: 0; + } + } + + ul li { + list-style-type: square; + list-style-type: none; + position: relative; + + &:before { + content: '\2022'; + font-family: verdana; + @include fontheight($small_text_size, $default_line_height); + position: absolute; + left: -20px; + top: -1px; + } + } + + ol { + counter-reset: item; + + li { + @include fontheight($small_text_size, $default_line_height); + list-style-type: none; + position: relative; + + &:before { + content: counter(item) '. '; + counter-increment: item; + position: absolute; + left: -20px; + top: 0; + } + + @for $n from 1 through 10 { + &.value-#{$n}:before { + content: '#{$n}. '; + } + } + } + } + + .with-callouts ol li { + list-style-position: inside; + margin-left: 0; + + &:before { + position: static; + display: inline; + left: 0; + float: left; + width: 17px; + color: $ics_blue; + font-weight: $boldweight; + } + } +} + +/* special list items */ + +li.no-bullet { + list-style-type: none !important; +} + +#content li.with-icon { + position: relative; + margin-left: 40px; + min-height: 30px; + + p { + margin-left: 0 !important; + } + + &:before { + position: absolute; + left: -40px; + top: 0; + content: ''; + width: 30px; + height: 30px; + } + + &.tablet:before { + background-image: url(ico_phone_tablet.png); + } + + &.web:before { + background-image: url(ico_web.png); + } + + &.checklist:before { + background-image: url(ico_checklist.png); + } + + &.action:before { + background-image: url(ico_action.png); + } + + &.use:before { + background-image: url(ico_use.png); + } +} + +/* figures and callouts */ + +.figure { + position: relative; + + &.pad-below { + margin-bottom: 20px; + } + + .figure-callout { + position: absolute; + color: #fff; + font-weight: $boldweight; + @include fontheight($large_text_size, 23px); + text-align: center; + background: transparent url(callout.png) no-repeat scroll 50% 50%; + padding-right: 2px; + width: 30px; + height: 29px; + z-index: 1000; + + &.top { + top: -9px; + } + + &.right { + right: -5px; + } + } +} + +.figure-caption { + margin: 0 10px 20px 10px; + @include fontheight($small_text_size, $default_line_height); + font-style: italic; +} + +/* rows of figures */ + +.figure-row { + @include fontheight(0, 0); /* to prevent space between figures */ + + .figure { + display: inline-block; + vertical-align: top; + } + + .figure + .figure { + margin-left: 10px; /* reintroduce space between figures */ + } +} + +/* video containers */ + +.framed-galaxynexus-land-span-13 { + background: transparent url(content/misc_full_galaxynexus_blank_land_span13.png) no-repeat scroll top left; + padding: 42px 122px 62px 126px; + overflow: hidden; + + &, + & video, + & img { + width: 512px; + height: 286px; + } +} + +.framed-galaxynexus-port-span-9 { + background: transparent url(content/misc_full_galaxynexus_blank_port_span9.png) no-repeat scroll top left; + padding: 95px 122px 107px 124px; + overflow: hidden; + + &, + & video, + & img { + width: 274px; + height: 488px; + } +} + +.framed-galaxynexus-port-span-5 { + background: transparent url(content/misc_full_galaxynexus_blank_port_span5.png) no-repeat scroll top left; + padding: 75px 31px 76px 33px; + overflow: hidden; + + &, + & video, + & img { + width: 216px; + height: 384px; + } +} + +/* landing page disclosures */ + +.landing-page-link { + text-decoration: none; + font-weight: $boldweight; + color: $text_color_dark; + + &:after { + @include disclosure(right); + display: inline-block; + margin-left: 5px; + } +} + +/* tooltips */ + +$tooltip_back_color: rgba(0,0,0,0.9); + +.tooltip-box { + position: absolute; + background-color: $tooltip_back_color; + border-radius: 2px; + @include fontheight($small_text_size, $default_line_height); + color: #fff; + padding: 6px 10px; + max-width: 250px; + z-index: 10000; + + &.below:after { + position: absolute; + content: ''; + line-height: 0; + display: block; + top: -10px; + left: 5px; + border: 5px solid transparent; + border-bottom-color: $tooltip_back_color; + } +} + +/* video note */ + +.video-instructions { + margin-top: 10px; + margin-bottom: 10px; + + &:before { + content: ''; + background: transparent url(ico_movie_inline.png) no-repeat scroll top left; + display: inline-block; + width: 12px; + height: 12px; + margin-right: 8px; + } + + &:after { + content: 'Click to replay movie.'; + } +} + +/* download buttons */ + +.download-button { + display: block; + margin-bottom: 5px; + text-decoration: none; + background-color: $ics_blue; + color: #fff !important; + font-weight: $boldweight; + box-shadow: 0 1px 1px $lighter_shadow_color; + padding: 6px 12px; + border-radius: 2px; + + &:hover, + &:focus { + background-color: $ics_blue_dark; + color: #fff !important; + } + + &:active { + background-color: $ics_blue_darkest; + } +}
\ No newline at end of file diff --git a/tools/droiddoc/templates-sdk/assets/design/disclosure_down.png b/tools/droiddoc/templates-sdk/assets/design/disclosure_down.png Binary files differnew file mode 100644 index 0000000..4b3ff4d --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/disclosure_down.png diff --git a/tools/droiddoc/templates-sdk/assets/design/disclosure_left.png b/tools/droiddoc/templates-sdk/assets/design/disclosure_left.png Binary files differnew file mode 100644 index 0000000..607845e --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/disclosure_left.png diff --git a/tools/droiddoc/templates-sdk/assets/design/disclosure_right.png b/tools/droiddoc/templates-sdk/assets/design/disclosure_right.png Binary files differnew file mode 100644 index 0000000..f3bceb1 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/disclosure_right.png diff --git a/tools/droiddoc/templates-sdk/assets/design/disclosure_up.png b/tools/droiddoc/templates-sdk/assets/design/disclosure_up.png Binary files differnew file mode 100644 index 0000000..5ff6d9d --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/disclosure_up.png diff --git a/tools/droiddoc/templates-sdk/assets/design/ico_action.png b/tools/droiddoc/templates-sdk/assets/design/ico_action.png Binary files differnew file mode 100644 index 0000000..30e4cc7 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/ico_action.png diff --git a/tools/droiddoc/templates-sdk/assets/design/ico_good.png b/tools/droiddoc/templates-sdk/assets/design/ico_good.png Binary files differnew file mode 100644 index 0000000..afebe1c --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/ico_good.png diff --git a/tools/droiddoc/templates-sdk/assets/design/ico_movie_inline.png b/tools/droiddoc/templates-sdk/assets/design/ico_movie_inline.png Binary files differnew file mode 100644 index 0000000..7cfb5c5 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/ico_movie_inline.png diff --git a/tools/droiddoc/templates-sdk/assets/design/ico_phone_tablet.png b/tools/droiddoc/templates-sdk/assets/design/ico_phone_tablet.png Binary files differnew file mode 100644 index 0000000..003b876 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/ico_phone_tablet.png diff --git a/tools/droiddoc/templates-sdk/assets/design/ico_use.png b/tools/droiddoc/templates-sdk/assets/design/ico_use.png Binary files differnew file mode 100644 index 0000000..9d868b3 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/ico_use.png diff --git a/tools/droiddoc/templates-sdk/assets/design/ico_web.png b/tools/droiddoc/templates-sdk/assets/design/ico_web.png Binary files differnew file mode 100644 index 0000000..0848e3c --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/ico_web.png diff --git a/tools/droiddoc/templates-sdk/assets/design/ico_wrong.png b/tools/droiddoc/templates-sdk/assets/design/ico_wrong.png Binary files differnew file mode 100644 index 0000000..b7d04ce --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/ico_wrong.png diff --git a/tools/droiddoc/templates-sdk/assets/design/open_new_page.png b/tools/droiddoc/templates-sdk/assets/design/open_new_page.png Binary files differnew file mode 100644 index 0000000..6197e3a --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/design/open_new_page.png diff --git a/tools/droiddoc/templates-sdk/assets/images/home/google-plus-small.png b/tools/droiddoc/templates-sdk/assets/images/home/google-plus-small.png Binary files differnew file mode 100644 index 0000000..5bb7d7a --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/home/google-plus-small.png diff --git a/tools/droiddoc/templates-sdk/assets/images/home/google-plus.png b/tools/droiddoc/templates-sdk/assets/images/home/google-plus.png Binary files differnew file mode 100644 index 0000000..90871e1 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/home/google-plus.png diff --git a/tools/droiddoc/templates-sdk/assets/images/icon_play.png b/tools/droiddoc/templates-sdk/assets/images/icon_play.png Binary files differnew file mode 100644 index 0000000..8bfdc7b --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/icon_play.png diff --git a/tools/droiddoc/templates-sdk/assets/jquery-1.6.2.min.js b/tools/droiddoc/templates-sdk/assets/jquery-1.6.2.min.js new file mode 100644 index 0000000..8cdc80e --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/jquery-1.6.2.min.js @@ -0,0 +1,18 @@ +/*! + * jQuery JavaScript Library v1.6.2 + * http://jquery.com/ + * + * Copyright 2011, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2011, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Thu Jun 30 14:16:56 2011 -0400 + */ +(function(a,b){function cv(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cs(a){if(!cg[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ch||(ch=c.createElement("iframe"),ch.frameBorder=ch.width=ch.height=0),b.appendChild(ch);if(!ci||!ch.createElement)ci=(ch.contentWindow||ch.contentDocument).document,ci.write((c.compatMode==="CSS1Compat"?"<!doctype html>":"")+"<html><body>"),ci.close();d=ci.createElement(a),ci.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ch)}cg[a]=e}return cg[a]}function cr(a,b){var c={};f.each(cm.concat.apply([],cm.slice(0,b)),function(){c[this]=a});return c}function cq(){cn=b}function cp(){setTimeout(cq,0);return cn=f.now()}function cf(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ce(){try{return new a.XMLHttpRequest}catch(b){}}function b$(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g<i;g++){if(g===1)for(h in a.converters)typeof h=="string"&&(e[h.toLowerCase()]=a.converters[h]);l=k,k=d[g];if(k==="*")k=l;else if(l!=="*"&&l!==k){m=l+" "+k,n=e[m]||e["* "+k];if(!n){p=b;for(o in e){j=o.split(" ");if(j[0]===l||j[0]==="*"){p=e[j[1]+" "+k];if(p){o=e[o],o===!0?n=p:p===!0&&(n=o);break}}}}!n&&!p&&f.error("No conversion from "+m.replace(" "," to ")),n!==!0&&(c=n?n(c):p(o(c)))}}return c}function bZ(a,c,d){var e=a.contents,f=a.dataTypes,g=a.responseFields,h,i,j,k;for(i in g)i in d&&(c[g[i]]=d[i]);while(f[0]==="*")f.shift(),h===b&&(h=a.mimeType||c.getResponseHeader("content-type"));if(h)for(i in e)if(e[i]&&e[i].test(h)){f.unshift(i);break}if(f[0]in d)j=f[0];else{for(i in d){if(!f[0]||a.converters[i+" "+f[0]]){j=i;break}k||(k=i)}j=j||k}if(j){j!==f[0]&&f.unshift(j);return d[j]}}function bY(a,b,c,d){if(f.isArray(b))f.each(b,function(b,e){c||bC.test(a)?d(a,e):bY(a+"["+(typeof e=="object"||f.isArray(e)?b:"")+"]",e,c,d)});else if(!c&&b!=null&&typeof b=="object")for(var e in b)bY(a+"["+e+"]",b[e],c,d);else d(a,b)}function bX(a,c,d,e,f,g){f=f||c.dataTypes[0],g=g||{},g[f]=!0;var h=a[f],i=0,j=h?h.length:0,k=a===bR,l;for(;i<j&&(k||!l);i++)l=h[i](c,d,e),typeof l=="string"&&(!k||g[l]?l=b:(c.dataTypes.unshift(l),l=bX(a,c,d,e,l,g)));(k||!l)&&!g["*"]&&(l=bX(a,c,d,e,"*",g));return l}function bW(a){return function(b,c){typeof b!="string"&&(c=b,b="*");if(f.isFunction(c)){var d=b.toLowerCase().split(bN),e=0,g=d.length,h,i,j;for(;e<g;e++)h=d[e],j=/^\+/.test(h),j&&(h=h.substr(1)||"*"),i=a[h]=a[h]||[],i[j?"unshift":"push"](c)}}}function bA(a,b,c){var d=b==="width"?a.offsetWidth:a.offsetHeight,e=b==="width"?bv:bw;if(d>0){c!=="border"&&f.each(e,function(){c||(d-=parseFloat(f.css(a,"padding"+this))||0),c==="margin"?d+=parseFloat(f.css(a,c+this))||0:d-=parseFloat(f.css(a,"border"+this+"Width"))||0});return d+"px"}d=bx(a,b,b);if(d<0||d==null)d=a.style[b]||0;d=parseFloat(d)||0,c&&f.each(e,function(){d+=parseFloat(f.css(a,"padding"+this))||0,c!=="padding"&&(d+=parseFloat(f.css(a,"border"+this+"Width"))||0),c==="margin"&&(d+=parseFloat(f.css(a,c+this))||0)});return d+"px"}function bm(a,b){b.src?f.ajax({url:b.src,async:!1,dataType:"script"}):f.globalEval((b.text||b.textContent||b.innerHTML||"").replace(be,"/*$0*/")),b.parentNode&&b.parentNode.removeChild(b)}function bl(a){f.nodeName(a,"input")?bk(a):"getElementsByTagName"in a&&f.grep(a.getElementsByTagName("input"),bk)}function bk(a){if(a.type==="checkbox"||a.type==="radio")a.defaultChecked=a.checked}function bj(a){return"getElementsByTagName"in a?a.getElementsByTagName("*"):"querySelectorAll"in a?a.querySelectorAll("*"):[]}function bi(a,b){var c;if(b.nodeType===1){b.clearAttributes&&b.clearAttributes(),b.mergeAttributes&&b.mergeAttributes(a),c=b.nodeName.toLowerCase();if(c==="object")b.outerHTML=a.outerHTML;else if(c!=="input"||a.type!=="checkbox"&&a.type!=="radio"){if(c==="option")b.selected=a.defaultSelected;else if(c==="input"||c==="textarea")b.defaultValue=a.defaultValue}else a.checked&&(b.defaultChecked=b.checked=a.checked),b.value!==a.value&&(b.value=a.value);b.removeAttribute(f.expando)}}function bh(a,b){if(b.nodeType===1&&!!f.hasData(a)){var c=f.expando,d=f.data(a),e=f.data(b,d);if(d=d[c]){var g=d.events;e=e[c]=f.extend({},d);if(g){delete e.handle,e.events={};for(var h in g)for(var i=0,j=g[h].length;i<j;i++)f.event.add(b,h+(g[h][i].namespace?".":"")+g[h][i].namespace,g[h][i],g[h][i].data)}}}}function bg(a,b){return f.nodeName(a,"table")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function W(a,b,c){b=b||0;if(f.isFunction(b))return f.grep(a,function(a,d){var e=!!b.call(a,d,a);return e===c});if(b.nodeType)return f.grep(a,function(a,d){return a===b===c});if(typeof b=="string"){var d=f.grep(a,function(a){return a.nodeType===1});if(R.test(b))return f.filter(b,d,!c);b=f.filter(b,d)}return f.grep(a,function(a,d){return f.inArray(a,b)>=0===c})}function V(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function N(a,b){return(a&&a!=="*"?a+".":"")+b.replace(z,"`").replace(A,"&")}function M(a){var b,c,d,e,g,h,i,j,k,l,m,n,o,p=[],q=[],r=f._data(this,"events");if(!(a.liveFired===this||!r||!r.live||a.target.disabled||a.button&&a.type==="click")){a.namespace&&(n=new RegExp("(^|\\.)"+a.namespace.split(".").join("\\.(?:.*\\.)?")+"(\\.|$)")),a.liveFired=this;var s=r.live.slice(0);for(i=0;i<s.length;i++)g=s[i],g.origType.replace(x,"")===a.type?q.push(g.selector):s.splice(i--,1);e=f(a.target).closest(q,a.currentTarget);for(j=0,k=e.length;j<k;j++){m=e[j];for(i=0;i<s.length;i++){g=s[i];if(m.selector===g.selector&&(!n||n.test(g.namespace))&&!m.elem.disabled){h=m.elem,d=null;if(g.preType==="mouseenter"||g.preType==="mouseleave")a.type=g.preType,d=f(a.relatedTarget).closest(g.selector)[0],d&&f.contains(h,d)&&(d=h);(!d||d!==h)&&p.push({elem:h,handleObj:g,level:m.level})}}}for(j=0,k=p.length;j<k;j++){e=p[j];if(c&&e.level>c)break;a.currentTarget=e.elem,a.data=e.handleObj.data,a.handleObj=e.handleObj,o=e.handleObj.origHandler.apply(e.elem,arguments);if(o===!1||a.isPropagationStopped()){c=e.level,o===!1&&(b=!1);if(a.isImmediatePropagationStopped())break}}return b}}function K(a,c,d){var e=f.extend({},d[0]);e.type=a,e.originalEvent={},e.liveFired=b,f.event.handle.call(c,e),e.isDefaultPrevented()&&d[0].preventDefault()}function E(){return!0}function D(){return!1}function m(a,c,d){var e=c+"defer",g=c+"queue",h=c+"mark",i=f.data(a,e,b,!0);i&&(d==="queue"||!f.data(a,g,b,!0))&&(d==="mark"||!f.data(a,h,b,!0))&&setTimeout(function(){!f.data(a,g,b,!0)&&!f.data(a,h,b,!0)&&(f.removeData(a,e,!0),i.resolve())},0)}function l(a){for(var b in a)if(b!=="toJSON")return!1;return!0}function k(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(j,"$1-$2").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNaN(d)?i.test(d)?f.parseJSON(d):d:parseFloat(d)}catch(g){}f.data(a,c,d)}else d=b}return d}var c=a.document,d=a.navigator,e=a.location,f=function(){function J(){if(!e.isReady){try{c.documentElement.doScroll("left")}catch(a){setTimeout(J,1);return}e.ready()}}var e=function(a,b){return new e.fn.init(a,b,h)},f=a.jQuery,g=a.$,h,i=/^(?:[^<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/\d/,n=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,o=/^[\],:{}\s]*$/,p=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,q=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,r=/(?:^|:|,)(?:\s*\[)+/g,s=/(webkit)[ \/]([\w.]+)/,t=/(opera)(?:.*version)?[ \/]([\w.]+)/,u=/(msie) ([\w.]+)/,v=/(mozilla)(?:.*? rv:([\w.]+))?/,w=/-([a-z])/ig,x=function(a,b){return b.toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=n.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.6.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.done(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j<k;j++)if((a=arguments[j])!=null)for(c in a){d=i[c],f=a[c];if(i===f)continue;l&&f&&(e.isPlainObject(f)||(g=e.isArray(f)))?(g?(g=!1,h=d&&e.isArray(d)?d:[]):h=d&&e.isPlainObject(d)?d:{},i[c]=e.extend(l,h,f)):f!==b&&(i[c]=f)}return i},e.extend({noConflict:function(b){a.$===e&&(a.$=g),b&&a.jQuery===e&&(a.jQuery=f);return e},isReady:!1,readyWait:1,holdReady:function(a){a?e.readyWait++:e.ready(!0)},ready:function(a){if(a===!0&&!--e.readyWait||a!==!0&&!e.isReady){if(!c.body)return setTimeout(e.ready,1);e.isReady=!0;if(a!==!0&&--e.readyWait>0)return;A.resolveWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").unbind("ready")}},bindReady:function(){if(!A){A=e._Deferred();if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a&&typeof a=="object"&&"setInterval"in a},isNaN:function(a){return a==null||!m.test(a)||isNaN(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1;var c;for(c in a);return c===b||D.call(a,c)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw a},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(o.test(b.replace(p,"@").replace(q,"]").replace(r,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(b,c,d){a.DOMParser?(d=new DOMParser,c=d.parseFromString(b,"text/xml")):(c=new ActiveXObject("Microsoft.XMLDOM"),c.async="false",c.loadXML(b)),d=c.documentElement,(!d||!d.nodeName||d.nodeName==="parsererror")&&e.error("Invalid XML: "+b);return c},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g<h;)if(c.apply(a[g++],d)===!1)break}else if(i){for(f in a)if(c.call(a[f],f,a[f])===!1)break}else for(;g<h;)if(c.call(a[g],g,a[g++])===!1)break;return a},trim:G?function(a){return a==null?"":G.call(a)}:function(a){return a==null?"":(a+"").replace(k,"").replace(l,"")},makeArray:function(a,b){var c=b||[];if(a!=null){var d=e.type(a);a.length==null||d==="string"||d==="function"||d==="regexp"||e.isWindow(a)?E.call(c,a):e.merge(c,a)}return c},inArray:function(a,b){if(H)return H.call(b,a);for(var c=0,d=b.length;c<d;c++)if(b[c]===a)return c;return-1},merge:function(a,c){var d=a.length,e=0;if(typeof c.length=="number")for(var f=c.length;e<f;e++)a[d++]=c[e];else while(c[e]!==b)a[d++]=c[e++];a.length=d;return a},grep:function(a,b,c){var d=[],e;c=!!c;for(var f=0,g=a.length;f<g;f++)e=!!b(a[f],f),c!==e&&d.push(a[f]);return d},map:function(a,c,d){var f,g,h=[],i=0,j=a.length,k=a instanceof e||j!==b&&typeof j=="number"&&(j>0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i<j;i++)f=c(a[i],i,d),f!=null&&(h[h.length]=f);else for(g in a)f=c(a[g],g,d),f!=null&&(h[h.length]=f);return h.concat.apply([],h)},guid:1,proxy:function(a,c){if(typeof c=="string"){var d=a[c];c=a,a=d}if(!e.isFunction(a))return b;var f=F.call(arguments,2),g=function(){return a.apply(c,f.concat(F.call(arguments)))};g.guid=a.guid=a.guid||g.guid||e.guid++;return g},access:function(a,c,d,f,g,h){var i=a.length;if(typeof c=="object"){for(var j in c)e.access(a,j,c[j],f,g,d);return a}if(d!==b){f=!h&&f&&e.isFunction(d);for(var k=0;k<i;k++)g(a[k],c,f?d.call(a[k],k,g(a[k],c)):d,h);return a}return i?g(a[0],c):b},now:function(){return(new Date).getTime()},uaMatch:function(a){a=a.toLowerCase();var b=s.exec(a)||t.exec(a)||u.exec(a)||a.indexOf("compatible")<0&&v.exec(a)||[];return{browser:b[1]||"",version:b[2]||"0"}},sub:function(){function a(b,c){return new a.fn.init(b,c)}e.extend(!0,a,this),a.superclass=this,a.fn=a.prototype=this(),a.fn.constructor=a,a.sub=this.sub,a.fn.init=function(d,f){f&&f instanceof e&&!(f instanceof a)&&(f=a(f));return e.fn.init.call(this,d,f,b)},a.fn.init.prototype=a.fn;var b=a(c);return a},browser:{}}),e.each("Boolean Number String Function Array Date RegExp Object".split(" "),function(a,b){I["[object "+b+"]"]=b.toLowerCase()}),z=e.uaMatch(y),z.browser&&(e.browser[z.browser]=!0,e.browser.version=z.version),e.browser.webkit&&(e.browser.safari=!0),j.test(" ")&&(k=/^[\s\xA0]+/,l=/[\s\xA0]+$/),h=e(c),c.addEventListener?B=function(){c.removeEventListener("DOMContentLoaded",B,!1),e.ready()}:c.attachEvent&&(B=function(){c.readyState==="complete"&&(c.detachEvent("onreadystatechange",B),e.ready())});return e}(),g="done fail isResolved isRejected promise then always pipe".split(" "),h=[].slice;f.extend({_Deferred:function(){var a=[],b,c,d,e={done:function(){if(!d){var c=arguments,g,h,i,j,k;b&&(k=b,b=0);for(g=0,h=c.length;g<h;g++)i=c[g],j=f.type(i),j==="array"?e.done.apply(e,i):j==="function"&&a.push(i);k&&e.resolveWith(k[0],k[1])}return this},resolveWith:function(e,f){if(!d&&!b&&!c){f=f||[],c=1;try{while(a[0])a.shift().apply(e,f)}finally{b=[e,f],c=0}}return this},resolve:function(){e.resolveWith(this,arguments);return this},isResolved:function(){return!!c||!!b},cancel:function(){d=1,a=[];return this}};return e},Deferred:function(a){var b=f._Deferred(),c=f._Deferred(),d;f.extend(b,{then:function(a,c){b.done(a).fail(c);return this},always:function(){return b.done.apply(b,arguments).fail.apply(this,arguments)},fail:c.done,rejectWith:c.resolveWith,reject:c.resolve,isRejected:c.isResolved,pipe:function(a,c){return f.Deferred(function(d){f.each({done:[a,"resolve"],fail:[c,"reject"]},function(a,c){var e=c[0],g=c[1],h;f.isFunction(e)?b[a](function(){h=e.apply(this,arguments),h&&f.isFunction(h.promise)?h.promise().then(d.resolve,d.reject):d[g](h)}):b[a](d[g])})}).promise()},promise:function(a){if(a==null){if(d)return d;d=a={}}var c=g.length;while(c--)a[g[c]]=b[g[c]];return a}}),b.done(c.cancel).fail(b.cancel),delete b.cancel,a&&a.call(b,b);return b},when:function(a){function i(a){return function(c){b[a]=arguments.length>1?h.call(arguments,0):c,--e||g.resolveWith(g,h.call(b,0))}}var b=arguments,c=0,d=b.length,e=d,g=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred();if(d>1){for(;c<d;c++)b[c]&&f.isFunction(b[c].promise)?b[c].promise().then(i(c),g.reject):--e;e||g.resolveWith(g,b)}else g!==a&&g.resolveWith(g,d?[a]:[]);return g.promise()}}),f.support=function(){var a=c.createElement("div"),b=c.documentElement,d,e,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u;a.setAttribute("className","t"),a.innerHTML=" <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>",d=a.getElementsByTagName("*"),e=a.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=a.getElementsByTagName("input")[0],k={leadingWhitespace:a.firstChild.nodeType===3,tbody:!a.getElementsByTagName("tbody").length,htmlSerialize:!!a.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55$/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:a.className!=="t",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0},i.checked=!0,k.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,k.optDisabled=!h.disabled;try{delete a.test}catch(v){k.deleteExpando=!1}!a.addEventListener&&a.attachEvent&&a.fireEvent&&(a.attachEvent("onclick",function(){k.noCloneEvent=!1}),a.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),k.radioValue=i.value==="t",i.setAttribute("checked","checked"),a.appendChild(i),l=c.createDocumentFragment(),l.appendChild(a.firstChild),k.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,a.innerHTML="",a.style.width=a.style.paddingLeft="1px",m=c.getElementsByTagName("body")[0],o=c.createElement(m?"div":"body"),p={visibility:"hidden",width:0,height:0,border:0,margin:0},m&&f.extend(p,{position:"absolute",left:-1e3,top:-1e3});for(t in p)o.style[t]=p[t];o.appendChild(a),n=m||b,n.insertBefore(o,n.firstChild),k.appendChecked=i.checked,k.boxModel=a.offsetWidth===2,"zoom"in a.style&&(a.style.display="inline",a.style.zoom=1,k.inlineBlockNeedsLayout=a.offsetWidth===2,a.style.display="",a.innerHTML="<div style='width:4px;'></div>",k.shrinkWrapBlocks=a.offsetWidth!==2),a.innerHTML="<table><tr><td style='padding:0;border:0;display:none'></td><td>t</td></tr></table>",q=a.getElementsByTagName("td"),u=q[0].offsetHeight===0,q[0].style.display="",q[1].style.display="none",k.reliableHiddenOffsets=u&&q[0].offsetHeight===0,a.innerHTML="",c.defaultView&&c.defaultView.getComputedStyle&&(j=c.createElement("div"),j.style.width="0",j.style.marginRight="0",a.appendChild(j),k.reliableMarginRight=(parseInt((c.defaultView.getComputedStyle(j,null)||{marginRight:0}).marginRight,10)||0)===0),o.innerHTML="",n.removeChild(o);if(a.attachEvent)for(t in{submit:1,change:1,focusin:1})s="on"+t,u=s in a,u||(a.setAttribute(s,"return;"),u=typeof a[s]=="function"),k[t+"Bubbles"]=u;o=l=g=h=m=j=a=i=null;return k}(),f.boxModel=f.support.boxModel;var i=/^(?:\{.*\}|\[.*\])$/,j=/([a-z])([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!l(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g=f.expando,h=typeof c=="string",i,j=a.nodeType,k=j?f.cache:a,l=j?a[f.expando]:a[f.expando]&&f.expando;if((!l||e&&l&&!k[l][g])&&h&&d===b)return;l||(j?a[f.expando]=l=++f.uuid:l=f.expando),k[l]||(k[l]={},j||(k[l].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?k[l][g]=f.extend(k[l][g],c):k[l]=f.extend(k[l],c);i=k[l],e&&(i[g]||(i[g]={}),i=i[g]),d!==b&&(i[f.camelCase(c)]=d);if(c==="events"&&!i[c])return i[g]&&i[g].events;return h?i[f.camelCase(c)]||i[c]:i}},removeData:function(b,c,d){if(!!f.acceptData(b)){var e=f.expando,g=b.nodeType,h=g?f.cache:b,i=g?b[f.expando]:f.expando;if(!h[i])return;if(c){var j=d?h[i][e]:h[i];if(j){delete j[c];if(!l(j))return}}if(d){delete h[i][e];if(!l(h[i]))return}var k=h[i][e];f.support.deleteExpando||h!=a?delete h[i]:h[i]=null,k?(h[i]={},g||(h[i].toJSON=f.noop),h[i][e]=k):g&&(f.support.deleteExpando?delete b[f.expando]:b.removeAttribute?b.removeAttribute(f.expando):b[f.expando]=null)}},_data:function(a,b,c){return f.data(a,b,c,!0)},acceptData:function(a){if(a.nodeName){var b=f.noData[a.nodeName.toLowerCase()];if(b)return b!==!0&&a.getAttribute("classid")===b}return!0}}),f.fn.extend({data:function(a,c){var d=null;if(typeof a=="undefined"){if(this.length){d=f.data(this[0]);if(this[0].nodeType===1){var e=this[0].attributes,g;for(var h=0,i=e.length;h<i;h++)g=e[h].name,g.indexOf("data-")===0&&(g=f.camelCase(g.substring(5)),k(this[0],g,d[g]))}}return d}if(typeof a=="object")return this.each(function(){f.data(this,a)});var j=a.split(".");j[1]=j[1]?"."+j[1]:"";if(c===b){d=this.triggerHandler("getData"+j[1]+"!",[j[0]]),d===b&&this.length&&(d=f.data(this[0],a),d=k(this[0],a,d));return d===b&&j[1]?this.data(j[0]):d}return this.each(function(){var b=f(this),d=[j[0],c];b.triggerHandler("setData"+j[1]+"!",d),f.data(this,a,c),b.triggerHandler("changeData"+j[1]+"!",d)})},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,c){a&&(c=(c||"fx")+"mark",f.data(a,c,(f.data(a,c,b,!0)||0)+1,!0))},_unmark:function(a,c,d){a!==!0&&(d=c,c=a,a=!1);if(c){d=d||"fx";var e=d+"mark",g=a?0:(f.data(c,e,b,!0)||1)-1;g?f.data(c,e,g,!0):(f.removeData(c,e,!0),m(c,d,"mark"))}},queue:function(a,c,d){if(a){c=(c||"fx")+"queue";var e=f.data(a,c,b,!0);d&&(!e||f.isArray(d)?e=f.data(a,c,f.makeArray(d),!0):e.push(d));return e||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e;d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),d.call(a,function(){f.dequeue(a,b)})),c.length||(f.removeData(a,b+"queue",!0),m(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){typeof a!="string"&&(c=a,a="fx");if(c===b)return f.queue(this[0],a);return this.each(function(){var b=f.queue(this,a,c);a==="fx"&&b[0]!=="inprogress"&&f.dequeue(this,a)})},dequeue:function(a){return this.each(function(){f.dequeue(this,a)})},delay:function(a,b){a=f.fx?f.fx.speeds[a]||a:a,b=b||"fx";return this.queue(b,function(){var c=this;setTimeout(function(){f.dequeue(c,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,c){function m(){--h||d.resolveWith(e,[e])}typeof a!="string"&&(c=a,a=b),a=a||"fx";var d=f.Deferred(),e=this,g=e.length,h=1,i=a+"defer",j=a+"queue",k=a+"mark",l;while(g--)if(l=f.data(e[g],i,b,!0)||(f.data(e[g],j,b,!0)||f.data(e[g],k,b,!0))&&f.data(e[g],i,f._Deferred(),!0))h++,l.done(m);m();return d.promise()}});var n=/[\n\t\r]/g,o=/\s+/,p=/\r/g,q=/^(?:button|input)$/i,r=/^(?:button|input|object|select|textarea)$/i,s=/^a(?:rea)?$/i,t=/^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,u=/\:|^on/,v,w;f.fn.extend({attr:function(a,b){return f.access(this,a,b,!0,f.attr)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,a,b,!0,f.prop)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(o);for(c=0,d=this.length;c<d;c++){e=this[c];if(e.nodeType===1)if(!e.className&&b.length===1)e.className=a;else{g=" "+e.className+" ";for(h=0,i=b.length;h<i;h++)~g.indexOf(" "+b[h]+" ")||(g+=b[h]+" ");e.className=f.trim(g)}}}return this},removeClass:function(a){var c,d,e,g,h,i,j;if(f.isFunction(a))return this.each(function(b){f(this).removeClass(a.call(this,b,this.className))});if(a&&typeof a=="string"||a===b){c=(a||"").split(o);for(d=0,e=this.length;d<e;d++){g=this[d];if(g.nodeType===1&&g.className)if(a){h=(" "+g.className+" ").replace(n," ");for(i=0,j=c.length;i<j;i++)h=h.replace(" "+c[i]+" "," ");g.className=f.trim(h)}else g.className=""}}return this},toggleClass:function(a,b){var c=typeof a,d=typeof b=="boolean";if(f.isFunction(a))return this.each(function(c){f(this).toggleClass(a.call(this,c,this.className,b),b)});return this.each(function(){if(c==="string"){var e,g=0,h=f(this),i=b,j=a.split(o);while(e=j[g++])i=d?i:!h.hasClass(e),h[i?"addClass":"removeClass"](e)}else if(c==="undefined"||c==="boolean")this.className&&f._data(this,"__className__",this.className),this.className=this.className||a===!1?"":f._data(this,"__className__")||""})},hasClass:function(a){var b=" "+a+" ";for(var c=0,d=this.length;c<d;c++)if((" "+this[c].className+" ").replace(n," ").indexOf(b)>-1)return!0;return!1},val:function(a){var c,d,e=this[0];if(!arguments.length){if(e){c=f.valHooks[e.nodeName.toLowerCase()]||f.valHooks[e.type];if(c&&"get"in c&&(d=c.get(e,"value"))!==b)return d;d=e.value;return typeof d=="string"?d.replace(p,""):d==null?"":d}return b}var g=f.isFunction(a);return this.each(function(d){var e=f(this),h;if(this.nodeType===1){g?h=a.call(this,d,e.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.nodeName.toLowerCase()]||f.valHooks[this.type];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c=a.selectedIndex,d=[],e=a.options,g=a.type==="select-one";if(c<0)return null;for(var h=g?c:0,i=g?c+1:e.length;h<i;h++){var j=e[h];if(j.selected&&(f.support.optDisabled?!j.disabled:j.getAttribute("disabled")===null)&&(!j.parentNode.disabled||!f.nodeName(j.parentNode,"optgroup"))){b=f(j).val();if(g)return b;d.push(b)}}if(g&&!d.length&&e.length)return f(e[c]).val();return d},set:function(a,b){var c=f.makeArray(b);f(a).find("option").each(function(){this.selected=f.inArray(f(this).val(),c)>=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attrFix:{tabindex:"tabIndex"},attr:function(a,c,d,e){var g=a.nodeType;if(!a||g===3||g===8||g===2)return b;if(e&&c in f.attrFn)return f(a)[c](d);if(!("getAttribute"in a))return f.prop(a,c,d);var h,i,j=g!==1||!f.isXMLDoc(a);j&&(c=f.attrFix[c]||c,i=f.attrHooks[c],i||(t.test(c)?i=w:v&&c!=="className"&&(f.nodeName(a,"form")||u.test(c))&&(i=v)));if(d!==b){if(d===null){f.removeAttr(a,c);return b}if(i&&"set"in i&&j&&(h=i.set(a,d,c))!==b)return h;a.setAttribute(c,""+d);return d}if(i&&"get"in i&&j&&(h=i.get(a,c))!==null)return h;h=a.getAttribute(c);return h===null?b:h},removeAttr:function(a,b){var c;a.nodeType===1&&(b=f.attrFix[b]||b,f.support.getSetAttribute?a.removeAttribute(b):(f.attr(a,b,""),a.removeAttributeNode(a.getAttributeNode(b))),t.test(b)&&(c=f.propFix[b]||b)in a&&(a[c]=!1))},attrHooks:{type:{set:function(a,b){if(q.test(a.nodeName)&&a.parentNode)f.error("type property can't be changed");else if(!f.support.radioValue&&b==="radio"&&f.nodeName(a,"input")){var c=a.value;a.setAttribute("type",b),c&&(a.value=c);return b}}},tabIndex:{get:function(a){var c=a.getAttributeNode("tabIndex");return c&&c.specified?parseInt(c.value,10):r.test(a.nodeName)||s.test(a.nodeName)&&a.href?0:b}},value:{get:function(a,b){if(v&&f.nodeName(a,"button"))return v.get(a,b);return b in a?a.value:null},set:function(a,b,c){if(v&&f.nodeName(a,"button"))return v.set(a,b,c);a.value=b}}},propFix:{tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},prop:function(a,c,d){var e=a.nodeType;if(!a||e===3||e===8||e===2)return b;var g,h,i=e!==1||!f.isXMLDoc(a);i&&(c=f.propFix[c]||c,h=f.propHooks[c]);return d!==b?h&&"set"in h&&(g=h.set(a,d,c))!==b?g:a[c]=d:h&&"get"in h&&(g=h.get(a,c))!==b?g:a[c]},propHooks:{}}),w={get:function(a,c){return f.prop(a,c)?c.toLowerCase():b},set:function(a,b,c){var d;b===!1?f.removeAttr(a,c):(d=f.propFix[c]||c,d in a&&(a[d]=!0),a.setAttribute(c,c.toLowerCase()));return c}},f.support.getSetAttribute||(f.attrFix=f.propFix,v=f.attrHooks.name=f.attrHooks.title=f.valHooks.button={get:function(a,c){var d;d=a.getAttributeNode(c);return d&&d.nodeValue!==""?d.nodeValue:b},set:function(a,b,c){var d=a.getAttributeNode(c);if(d){d.nodeValue=b;return b}}},f.each(["width","height"],function(a,b){f.attrHooks[b]=f.extend(f.attrHooks[b],{set:function(a,c){if(c===""){a.setAttribute(b,"auto");return c}}})})),f.support.hrefNormalized||f.each(["href","src","width","height"],function(a,c){f.attrHooks[c]=f.extend(f.attrHooks[c],{get:function(a){var d=a.getAttribute(c,2);return d===null?b:d}})}),f.support.style||(f.attrHooks.style={get:function(a){return a.style.cssText.toLowerCase()||b},set:function(a,b){return a.style.cssText=""+b}}),f.support.optSelected||(f.propHooks.selected=f.extend(f.propHooks.selected,{get:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}})),f.support.checkOn||f.each(["radio","checkbox"],function(){f.valHooks[this]={get:function(a){return a.getAttribute("value")===null?"on":a.value}}}),f.each(["radio","checkbox"],function(){f.valHooks[this]=f.extend(f.valHooks[this],{set:function(a,b){if(f.isArray(b))return a.checked=f.inArray(f(a).val(),b)>=0}})});var x=/\.(.*)$/,y=/^(?:textarea|input|select)$/i,z=/\./g,A=/ /g,B=/[^\w\s.|`]/g,C=function(a){return a.replace(B,"\\$&")};f.event={add:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){if(d===!1)d=D;else if(!d)return;var g,h;d.handler&&(g=d,d=g.handler),d.guid||(d.guid=f.guid++);var i=f._data(a);if(!i)return;var j=i.events,k=i.handle;j||(i.events=j={}),k||(i.handle=k=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.handle.apply(k.elem,arguments):b}),k.elem=a,c=c.split(" ");var l,m=0,n;while(l=c[m++]){h=g?f.extend({},g):{handler:d,data:e},l.indexOf(".")>-1?(n=l.split("."),l=n.shift(),h.namespace=n.slice(0).sort().join(".")):(n=[],h.namespace=""),h.type=l,h.guid||(h.guid=d.guid);var o=j[l],p=f.event.special[l]||{};if(!o){o=j[l]=[];if(!p.setup||p.setup.call(a,e,n,k)===!1)a.addEventListener?a.addEventListener(l,k,!1):a.attachEvent&&a.attachEvent("on"+l,k)}p.add&&(p.add.call(a,h),h.handler.guid||(h.handler.guid=d.guid)),o.push(h),f.event.global[l]=!0}a=null}},global:{},remove:function(a,c,d,e){if(a.nodeType!==3&&a.nodeType!==8){d===!1&&(d=D);var g,h,i,j,k=0,l,m,n,o,p,q,r,s=f.hasData(a)&&f._data(a),t=s&&s.events;if(!s||!t)return;c&&c.type&&(d=c.handler,c=c.type);if(!c||typeof c=="string"&&c.charAt(0)==="."){c=c||"";for(h in t)f.event.remove(a,h+c);return}c=c.split(" ");while(h=c[k++]){r=h,q=null,l=h.indexOf(".")<0,m=[],l||(m=h.split("."),h=m.shift(),n=new RegExp("(^|\\.)"+f.map(m.slice(0).sort(),C).join("\\.(?:.*\\.)?")+"(\\.|$)")),p=t[h];if(!p)continue;if(!d){for(j=0;j<p.length;j++){q=p[j];if(l||n.test(q.namespace))f.event.remove(a,r,q.handler,j),p.splice(j--,1)}continue}o=f.event.special[h]||{};for(j=e||0;j<p.length;j++){q=p[j];if(d.guid===q.guid){if(l||n.test(q.namespace))e==null&&p.splice(j--,1),o.remove&&o.remove.call(a,q);if(e!=null)break}}if(p.length===0||e!=null&&p.length===1)(!o.teardown||o.teardown.call(a,m)===!1)&&f.removeEvent(a,h,s.handle),g=null,delete t[h]}if(f.isEmptyObject(t)){var u=s.handle;u&&(u.elem=null),delete s.events,delete s.handle,f.isEmptyObject(s)&&f.removeData(a,b,!0)}}},customEvent:{getData:!0,setData:!0,changeData:!0},trigger:function(c,d,e,g){var h=c.type||c,i=[],j;h.indexOf("!")>=0&&(h=h.slice(0,-1),j=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i. +shift(),i.sort());if(!!e&&!f.event.customEvent[h]||!!f.event.global[h]){c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.exclusive=j,c.namespace=i.join("."),c.namespace_re=new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)");if(g||!e)c.preventDefault(),c.stopPropagation();if(!e){f.each(f.cache,function(){var a=f.expando,b=this[a];b&&b.events&&b.events[h]&&f.event.trigger(c,d,b.handle.elem)});return}if(e.nodeType===3||e.nodeType===8)return;c.result=b,c.target=e,d=d!=null?f.makeArray(d):[],d.unshift(c);var k=e,l=h.indexOf(":")<0?"on"+h:"";do{var m=f._data(k,"handle");c.currentTarget=k,m&&m.apply(k,d),l&&f.acceptData(k)&&k[l]&&k[l].apply(k,d)===!1&&(c.result=!1,c.preventDefault()),k=k.parentNode||k.ownerDocument||k===c.target.ownerDocument&&a}while(k&&!c.isPropagationStopped());if(!c.isDefaultPrevented()){var n,o=f.event.special[h]||{};if((!o._default||o._default.call(e.ownerDocument,c)===!1)&&(h!=="click"||!f.nodeName(e,"a"))&&f.acceptData(e)){try{l&&e[h]&&(n=e[l],n&&(e[l]=null),f.event.triggered=h,e[h]())}catch(p){}n&&(e[l]=n),f.event.triggered=b}}return c.result}},handle:function(c){c=f.event.fix(c||a.event);var d=((f._data(this,"events")||{})[c.type]||[]).slice(0),e=!c.exclusive&&!c.namespace,g=Array.prototype.slice.call(arguments,0);g[0]=c,c.currentTarget=this;for(var h=0,i=d.length;h<i;h++){var j=d[h];if(e||c.namespace_re.test(j.namespace)){c.handler=j.handler,c.data=j.data,c.handleObj=j;var k=j.handler.apply(this,g);k!==b&&(c.result=k,k===!1&&(c.preventDefault(),c.stopPropagation()));if(c.isImmediatePropagationStopped())break}}return c.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "),fix:function(a){if(a[f.expando])return a;var d=a;a=f.Event(d);for(var e=this.props.length,g;e;)g=this.props[--e],a[g]=d[g];a.target||(a.target=a.srcElement||c),a.target.nodeType===3&&(a.target=a.target.parentNode),!a.relatedTarget&&a.fromElement&&(a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement);if(a.pageX==null&&a.clientX!=null){var h=a.target.ownerDocument||c,i=h.documentElement,j=h.body;a.pageX=a.clientX+(i&&i.scrollLeft||j&&j.scrollLeft||0)-(i&&i.clientLeft||j&&j.clientLeft||0),a.pageY=a.clientY+(i&&i.scrollTop||j&&j.scrollTop||0)-(i&&i.clientTop||j&&j.clientTop||0)}a.which==null&&(a.charCode!=null||a.keyCode!=null)&&(a.which=a.charCode!=null?a.charCode:a.keyCode),!a.metaKey&&a.ctrlKey&&(a.metaKey=a.ctrlKey),!a.which&&a.button!==b&&(a.which=a.button&1?1:a.button&2?3:a.button&4?2:0);return a},guid:1e8,proxy:f.proxy,special:{ready:{setup:f.bindReady,teardown:f.noop},live:{add:function(a){f.event.add(this,N(a.origType,a.selector),f.extend({},a,{handler:M,guid:a.handler.guid}))},remove:function(a){f.event.remove(this,N(a.origType,a.selector),a)}},beforeunload:{setup:function(a,b,c){f.isWindow(this)&&(this.onbeforeunload=c)},teardown:function(a,b){this.onbeforeunload===b&&(this.onbeforeunload=null)}}}},f.removeEvent=c.removeEventListener?function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c,!1)}:function(a,b,c){a.detachEvent&&a.detachEvent("on"+b,c)},f.Event=function(a,b){if(!this.preventDefault)return new f.Event(a,b);a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||a.returnValue===!1||a.getPreventDefault&&a.getPreventDefault()?E:D):this.type=a,b&&f.extend(this,b),this.timeStamp=f.now(),this[f.expando]=!0},f.Event.prototype={preventDefault:function(){this.isDefaultPrevented=E;var a=this.originalEvent;!a||(a.preventDefault?a.preventDefault():a.returnValue=!1)},stopPropagation:function(){this.isPropagationStopped=E;var a=this.originalEvent;!a||(a.stopPropagation&&a.stopPropagation(),a.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=E,this.stopPropagation()},isDefaultPrevented:D,isPropagationStopped:D,isImmediatePropagationStopped:D};var F=function(a){var b=a.relatedTarget,c=!1,d=a.type;a.type=a.data,b!==this&&(b&&(c=f.contains(this,b)),c||(f.event.handle.apply(this,arguments),a.type=d))},G=function(a){a.type=a.data,f.event.handle.apply(this,arguments)};f.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){f.event.special[a]={setup:function(c){f.event.add(this,b,c&&c.selector?G:F,a)},teardown:function(a){f.event.remove(this,b,a&&a.selector?G:F)}}}),f.support.submitBubbles||(f.event.special.submit={setup:function(a,b){if(!f.nodeName(this,"form"))f.event.add(this,"click.specialSubmit",function(a){var b=a.target,c=b.type;(c==="submit"||c==="image")&&f(b).closest("form").length&&K("submit",this,arguments)}),f.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,c=b.type;(c==="text"||c==="password")&&f(b).closest("form").length&&a.keyCode===13&&K("submit",this,arguments)});else return!1},teardown:function(a){f.event.remove(this,".specialSubmit")}});if(!f.support.changeBubbles){var H,I=function(a){var b=a.type,c=a.value;b==="radio"||b==="checkbox"?c=a.checked:b==="select-multiple"?c=a.selectedIndex>-1?f.map(a.options,function(a){return a.selected}).join("-"):"":f.nodeName(a,"select")&&(c=a.selectedIndex);return c},J=function(c){var d=c.target,e,g;if(!!y.test(d.nodeName)&&!d.readOnly){e=f._data(d,"_change_data"),g=I(d),(c.type!=="focusout"||d.type!=="radio")&&f._data(d,"_change_data",g);if(e===b||g===e)return;if(e!=null||g)c.type="change",c.liveFired=b,f.event.trigger(c,arguments[1],d)}};f.event.special.change={filters:{focusout:J,beforedeactivate:J,click:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(c==="radio"||c==="checkbox"||f.nodeName(b,"select"))&&J.call(this,a)},keydown:function(a){var b=a.target,c=f.nodeName(b,"input")?b.type:"";(a.keyCode===13&&!f.nodeName(b,"textarea")||a.keyCode===32&&(c==="checkbox"||c==="radio")||c==="select-multiple")&&J.call(this,a)},beforeactivate:function(a){var b=a.target;f._data(b,"_change_data",I(b))}},setup:function(a,b){if(this.type==="file")return!1;for(var c in H)f.event.add(this,c+".specialChange",H[c]);return y.test(this.nodeName)},teardown:function(a){f.event.remove(this,".specialChange");return y.test(this.nodeName)}},H=f.event.special.change.filters,H.focus=H.beforeactivate}f.support.focusinBubbles||f.each({focus:"focusin",blur:"focusout"},function(a,b){function e(a){var c=f.event.fix(a);c.type=b,c.originalEvent={},f.event.trigger(c,null,c.target),c.isDefaultPrevented()&&a.preventDefault()}var d=0;f.event.special[b]={setup:function(){d++===0&&c.addEventListener(a,e,!0)},teardown:function(){--d===0&&c.removeEventListener(a,e,!0)}}}),f.each(["bind","one"],function(a,c){f.fn[c]=function(a,d,e){var g;if(typeof a=="object"){for(var h in a)this[c](h,d,a[h],e);return this}if(arguments.length===2||d===!1)e=d,d=b;c==="one"?(g=function(a){f(this).unbind(a,g);return e.apply(this,arguments)},g.guid=e.guid||f.guid++):g=e;if(a==="unload"&&c!=="one")this.one(a,d,e);else for(var i=0,j=this.length;i<j;i++)f.event.add(this[i],a,g,d);return this}}),f.fn.extend({unbind:function(a,b){if(typeof a=="object"&&!a.preventDefault)for(var c in a)this.unbind(c,a[c]);else for(var d=0,e=this.length;d<e;d++)f.event.remove(this[d],a,b);return this},delegate:function(a,b,c,d){return this.live(b,c,d,a)},undelegate:function(a,b,c){return arguments.length===0?this.unbind("live"):this.die(b,null,c,a)},trigger:function(a,b){return this.each(function(){f.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0])return f.event.trigger(a,b,this[0],!0)},toggle:function(a){var b=arguments,c=a.guid||f.guid++,d=0,e=function(c){var e=(f.data(this,"lastToggle"+a.guid)||0)%d;f.data(this,"lastToggle"+a.guid,e+1),c.preventDefault();return b[e].apply(this,arguments)||!1};e.guid=c;while(d<b.length)b[d++].guid=c;return this.click(e)},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var L={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};f.each(["live","die"],function(a,c){f.fn[c]=function(a,d,e,g){var h,i=0,j,k,l,m=g||this.selector,n=g?this:f(this.context);if(typeof a=="object"&&!a.preventDefault){for(var o in a)n[c](o,d,a[o],m);return this}if(c==="die"&&!a&&g&&g.charAt(0)==="."){n.unbind(g);return this}if(d===!1||f.isFunction(d))e=d||D,d=b;a=(a||"").split(" ");while((h=a[i++])!=null){j=x.exec(h),k="",j&&(k=j[0],h=h.replace(x,""));if(h==="hover"){a.push("mouseenter"+k,"mouseleave"+k);continue}l=h,L[h]?(a.push(L[h]+k),h=h+k):h=(L[h]||h)+k;if(c==="live")for(var p=0,q=n.length;p<q;p++)f.event.add(n[p],"live."+N(h,m),{data:d,selector:m,handler:e,origType:h,origHandler:e,preType:l});else n.unbind("live."+N(h,m),e)}return this}}),f.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "),function(a,b){f.fn[b]=function(a,c){c==null&&(c=a,a=null);return arguments.length>0?this.bind(b,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0)}),function(){function u(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}if(i.nodeType===1){f||(i.sizcache=c,i.sizset=g);if(typeof b!="string"){if(i===b){j=!0;break}}else if(k.filter(b,[i]).length>0){j=i;break}}i=i[a]}d[g]=j}}}function t(a,b,c,d,e,f){for(var g=0,h=d.length;g<h;g++){var i=d[g];if(i){var j=!1;i=i[a];while(i){if(i.sizcache===c){j=d[i.sizset];break}i.nodeType===1&&!f&&(i.sizcache=c,i.sizset=g);if(i.nodeName.toLowerCase()===b){j=i;break}i=i[a]}d[g]=j}}}var a=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d=0,e=Object.prototype.toString,g=!1,h=!0,i=/\\/g,j=/\W/;[0,0].sort(function(){h=!1;return 0});var k=function(b,d,f,g){f=f||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return f;var i,j,n,o,q,r,s,t,u=!0,w=k.isXML(d),x=[],y=b;do{a.exec(""),i=a.exec(y);if(i){y=i[3],x.push(i[1]);if(i[2]){o=i[3];break}}}while(i);if(x.length>1&&m.exec(b))if(x.length===2&&l.relative[x[0]])j=v(x[0]+x[1],d);else{j=l.relative[x[0]]?[d]:k(x.shift(),d);while(x.length)b=x.shift(),l.relative[b]&&(b+=x.shift()),j=v(b,j)}else{!g&&x.length>1&&d.nodeType===9&&!w&&l.match.ID.test(x[0])&&!l.match.ID.test(x[x.length-1])&&(q=k.find(x.shift(),d,w),d=q.expr?k.filter(q.expr,q.set)[0]:q.set[0]);if(d){q=g?{expr:x.pop(),set:p(g)}:k.find(x.pop(),x.length===1&&(x[0]==="~"||x[0]==="+")&&d.parentNode?d.parentNode:d,w),j=q.expr?k.filter(q.expr,q.set):q.set,x.length>0?n=p(j):u=!1;while(x.length)r=x.pop(),s=r,l.relative[r]?s=x.pop():r="",s==null&&(s=d),l.relative[r](n,s,w)}else n=x=[]}n||(n=j),n||k.error(r||b);if(e.call(n)==="[object Array]")if(!u)f.push.apply(f,n);else if(d&&d.nodeType===1)for(t=0;n[t]!=null;t++)n[t]&&(n[t]===!0||n[t].nodeType===1&&k.contains(d,n[t]))&&f.push(j[t]);else for(t=0;n[t]!=null;t++)n[t]&&n[t].nodeType===1&&f.push(j[t]);else p(n,f);o&&(k(o,h,f,g),k.uniqueSort(f));return f};k.uniqueSort=function(a){if(r){g=h,a.sort(r);if(g)for(var b=1;b<a.length;b++)a[b]===a[b-1]&&a.splice(b--,1)}return a},k.matches=function(a,b){return k(a,null,null,b)},k.matchesSelector=function(a,b){return k(b,null,null,[a]).length>0},k.find=function(a,b,c){var d;if(!a)return[];for(var e=0,f=l.order.length;e<f;e++){var g,h=l.order[e];if(g=l.leftMatch[h].exec(a)){var j=g[1];g.splice(1,1);if(j.substr(j.length-1)!=="\\"){g[1]=(g[1]||"").replace(i,""),d=l.find[h](g,b,c);if(d!=null){a=a.replace(l.match[h],"");break}}}}d||(d=typeof b.getElementsByTagName!="undefined"?b.getElementsByTagName("*"):[]);return{set:d,expr:a}},k.filter=function(a,c,d,e){var f,g,h=a,i=[],j=c,m=c&&c[0]&&k.isXML(c[0]);while(a&&c.length){for(var n in l.filter)if((f=l.leftMatch[n].exec(a))!=null&&f[2]){var o,p,q=l.filter[n],r=f[1];g=!1,f.splice(1,1);if(r.substr(r.length-1)==="\\")continue;j===i&&(i=[]);if(l.preFilter[n]){f=l.preFilter[n](f,j,d,i,e,m);if(!f)g=o=!0;else if(f===!0)continue}if(f)for(var s=0;(p=j[s])!=null;s++)if(p){o=q(p,f,s,j);var t=e^!!o;d&&o!=null?t?g=!0:j[s]=!1:t&&(i.push(p),g=!0)}if(o!==b){d||(j=i),a=a.replace(l.match[n],"");if(!g)return[];break}}if(a===h)if(g==null)k.error(a);else break;h=a}return j},k.error=function(a){throw"Syntax error, unrecognized expression: "+a};var l=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,CLASS:/\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(a){return a.getAttribute("href")},type:function(a){return a.getAttribute("type")}},relative:{"+":function(a,b){var c=typeof b=="string",d=c&&!j.test(b),e=c&&!d;d&&(b=b.toLowerCase());for(var f=0,g=a.length,h;f<g;f++)if(h=a[f]){while((h=h.previousSibling)&&h.nodeType!==1);a[f]=e||h&&h.nodeName.toLowerCase()===b?h||!1:h===b}e&&k.filter(b,a,!0)},">":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!j.test(b)){b=b.toLowerCase();for(;e<f;e++){c=a[e];if(c){var g=c.parentNode;a[e]=g.nodeName.toLowerCase()===b?g:!1}}}else{for(;e<f;e++)c=a[e],c&&(a[e]=d?c.parentNode:c.parentNode===b);d&&k.filter(b,a,!0)}},"":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("parentNode",b,f,a,e,c)},"~":function(a,b,c){var e,f=d++,g=u;typeof b=="string"&&!j.test(b)&&(b=b.toLowerCase(),e=b,g=t),g("previousSibling",b,f,a,e,c)}},find:{ID:function(a,b,c){if(typeof b.getElementById!="undefined"&&!c){var d=b.getElementById(a[1]);return d&&d.parentNode?[d]:[]}},NAME:function(a,b){if(typeof b.getElementsByName!="undefined"){var c=[],d=b.getElementsByName(a[1]);for(var e=0,f=d.length;e<f;e++)d[e].getAttribute("name")===a[1]&&c.push(d[e]);return c.length===0?null:c}},TAG:function(a,b){if(typeof b.getElementsByTagName!="undefined")return b.getElementsByTagName(a[1])}},preFilter:{CLASS:function(a,b,c,d,e,f){a=" "+a[1].replace(i,"")+" ";if(f)return a;for(var g=0,h;(h=b[g])!=null;g++)h&&(e^(h.className&&(" "+h.className+" ").replace(/[\t\n\r]/g," ").indexOf(a)>=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(i,"")},TAG:function(a,b){return a[1].replace(i,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||k.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&k.error(a[0]);a[0]=d++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(i,"");!f&&l.attrMap[g]&&(a[1]=l.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(i,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=k(b[3],null,null,c);else{var g=k.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(l.match.POS.test(b[0])||l.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!k(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return b<c[3]-0},gt:function(a,b,c){return b>c[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=l.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||k.getText([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h<i;h++)if(g[h]===a)return!1;return!0}k.error(e)},CHILD:function(a,b){var c=b[1],d=a;switch(c){case"only":case"first":while(d=d.previousSibling)if(d.nodeType===1)return!1;if(c==="first")return!0;d=a;case"last":while(d=d.nextSibling)if(d.nodeType===1)return!1;return!0;case"nth":var e=b[2],f=b[3];if(e===1&&f===0)return!0;var g=b[0],h=a.parentNode;if(h&&(h.sizcache!==g||!a.nodeIndex)){var i=0;for(d=h.firstChild;d;d=d.nextSibling)d.nodeType===1&&(d.nodeIndex=++i);h.sizcache=g}var j=a.nodeIndex-f;return e===0?j===0:j%e===0&&j/e>=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=l.attrHandle[c]?l.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=l.setFilters[e];if(f)return f(a,c,b,d)}}},m=l.match.POS,n=function(a,b){return"\\"+(b-0+1)};for(var o in l.match)l.match[o]=new RegExp(l.match[o].source+/(?![^\[]*\])(?![^\(]*\))/.source),l.leftMatch[o]=new RegExp(/(^(?:.|\r|\n)*?)/.source+l.match[o].source.replace(/\\(\d+)/g,n));var p=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(q){p=function(a,b){var c=0,d=b||[];if(e.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var f=a.length;c<f;c++)d.push(a[c]);else for(;a[c];c++)d.push(a[c]);return d}}var r,s;c.documentElement.compareDocumentPosition?r=function(a,b){if(a===b){g=!0;return 0}if(!a.compareDocumentPosition||!b.compareDocumentPosition)return a.compareDocumentPosition?-1:1;return a.compareDocumentPosition(b)&4?-1:1}:(r=function(a,b){if(a===b){g=!0;return 0}if(a.sourceIndex&&b.sourceIndex)return a.sourceIndex-b.sourceIndex;var c,d,e=[],f=[],h=a.parentNode,i=b.parentNode,j=h;if(h===i)return s(a,b);if(!h)return-1;if(!i)return 1;while(j)e.unshift(j),j=j.parentNode;j=i;while(j)f.unshift(j),j=j.parentNode;c=e.length,d=f.length;for(var k=0;k<c&&k<d;k++)if(e[k]!==f[k])return s(e[k],f[k]);return k===c?s(a,f[k],-1):s(e[k],b,1)},s=function(a,b,c){if(a===b)return c;var d=a.nextSibling;while(d){if(d===b)return-1;d=d.nextSibling}return 1}),k.getText=function(a){var b="",c;for(var d=0;a[d];d++)c=a[d],c.nodeType===3||c.nodeType===4?b+=c.nodeValue:c.nodeType!==8&&(b+=k.getText(c.childNodes));return b},function(){var a=c.createElement("div"),d="script"+(new Date).getTime(),e=c.documentElement;a.innerHTML="<a name='"+d+"'/>",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(l.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},l.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(l.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="<a href='#'></a>",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(l.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=k,b=c.createElement("div"),d="__sizzle__";b.innerHTML="<p class='TEST'></p>";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){k=function(b,e,f,g){e=e||c;if(!g&&!k.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return p(e.getElementsByTagName(b),f);if(h[2]&&l.find.CLASS&&e.getElementsByClassName)return p(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return p([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return p([],f);if(i.id===h[3])return p([i],f)}try{return p(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var m=e,n=e.getAttribute("id"),o=n||d,q=e.parentNode,r=/^\s*[+~]/.test(b);n?o=o.replace(/'/g,"\\$&"):e.setAttribute("id",o),r&&q&&(e=e.parentNode);try{if(!r||q)return p(e.querySelectorAll("[id='"+o+"'] "+b),f)}catch(s){}finally{n||m.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)k[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}k.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!k.isXML(a))try{if(e||!l.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return k(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="<div class='test e'></div><div class='test'></div>";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;l.order.splice(1,0,"CLASS"),l.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?k.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?k.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:k.contains=function(){return!1},k.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var v=function(a,b){var c,d=[],e="",f=b.nodeType?[b]:b;while(c=l.match.PSEUDO.exec(a))e+=c[0],a=a.replace(l.match.PSEUDO,"");a=l.relative[a]?a+"*":a;for(var g=0,h=f.length;g<h;g++)k(a,f[g],d);return k.filter(e,d)};f.find=k,f.expr=k.selectors,f.expr[":"]=f.expr.filters,f.unique=k.uniqueSort,f.text=k.getText,f.isXMLDoc=k.isXML,f.contains=k.contains}();var O=/Until$/,P=/^(?:parents|prevUntil|prevAll)/,Q=/,/,R=/^.[^:#\[\.,]*$/,S=Array.prototype.slice,T=f.expr.match.POS,U={children:!0,contents:!0,next:!0,prev:!0};f.fn.extend({find:function(a){var b=this,c,d;if(typeof a!="string")return f(a).filter(function(){for(c=0,d=b.length;c<d;c++)if(f.contains(b[c],this))return!0});var e=this.pushStack("","find",a),g,h,i;for(c=0,d=this.length;c<d;c++){g=e.length,f.find(a,this[c],e);if(c>0)for(h=g;h<e.length;h++)for(i=0;i<g;i++)if(e[i]===e[h]){e.splice(h--,1);break}}return e},has:function(a){var b=f(a);return this.filter(function(){for(var a=0,c=b.length;a<c;a++)if(f.contains(this,b[a]))return!0})},not:function(a){return this.pushStack(W(this,a,!1),"not",a)},filter:function(a){return this.pushStack(W(this,a,!0),"filter",a)},is:function(a){return!!a&&(typeof a=="string"?f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h,i,j={},k=1;if(g&&a.length){for(d=0,e=a.length;d<e;d++)i=a[d],j[i]||(j[i]=T.test(i)?f(i,b||this.context):i);while(g&&g.ownerDocument&&g!==b){for(i in j)h=j[i],(h.jquery?h.index(g)>-1:f(g).is(h))&&c.push({selector:i,elem:g,level:k});g=g.parentNode,k++}}return c}var l=T.test(a)||typeof a!="string"?f(a,b||this.context):0;for(d=0,e=this.length;d<e;d++){g=this[d];while(g){if(l?l.index(g)>-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a||typeof a=="string")return f.inArray(this[0],a?f(a):this.parent().children());return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(V(c[0])||V(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling(a.parentNode.firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c),g=S.call(arguments);O.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!U[a]?f.unique(e):e,(this.length>1||Q.test(d))&&P.test(a)&&(e=e.reverse());return this.pushStack(e,a,g.join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var X=/ jQuery\d+="(?:\d+|null)"/g,Y=/^\s+/,Z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,$=/<([\w:]+)/,_=/<tbody/i,ba=/<|&#?\w+;/,bb=/<(?:script|object|embed|option|style)/i,bc=/checked\s*(?:[^=]|=\s*.checked.)/i,bd=/\/(java|ecma)script/i,be=/^\s*<!(?:\[CDATA\[|\-\-)/,bf={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};bf.optgroup=bf.option,bf.tbody=bf.tfoot=bf.colgroup=bf.caption=bf.thead,bf.th=bf.td,f.support.htmlSerialize||(bf._default=[1,"div<div>","</div>"]),f.fn.extend({text:function(a){if(f.isFunction(a))return this.each(function(b){var c=f(this);c.text(a.call(this,b,c.text()))});if(typeof a!="object"&&a!==b)return this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a));return f.text(this)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){f(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f(arguments[0]).toArray());return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){if(a===b)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(X,""):null;if(typeof a=="string"&&!bb.test(a)&&(f.support.leadingWhitespace||!Y.test(a))&&!bf[($.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Z,"<$1></$2>");try{for(var c=0,d=this.length;c<d;c++)this[c].nodeType===1&&(f.cleanData(this[c].getElementsByTagName("*")),this[c].innerHTML=a)}catch(e){this.empty().append(a)}}else f.isFunction(a)?this.each(function(b){var c=f(this);c.html(a.call(this,b,c.html()))}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&&this[0].parentNode){if(f.isFunction(a))return this.each(function(b){var c=f(this),d=c.html();c.replaceWith(a.call(this,b,d))});typeof a!="string"&&(a=f(a).detach());return this.each(function(){var b=this.nextSibling,c=this.parentNode;f(this).remove(),b?f(b).before(a):f(c).append(a)})}return this.length?this.pushStack(f(f.isFunction(a)?a():a),"replaceWith",a):this},detach:function(a){return this.remove(a,!0)},domManip:function(a,c,d){var e,g,h,i,j=a[0],k=[];if(!f.support.checkClone&&arguments.length===3&&typeof j=="string"&&bc.test(j))return this.each(function(){f(this).domManip(a,c,d,!0)});if(f.isFunction(j))return this.each(function(e){var g=f(this);a[0]=j.call(this,e,c?g.html():b),g.domManip(a,c,d)});if(this[0]){i=j&&j.parentNode,f.support.parentNode&&i&&i.nodeType===11&&i.childNodes.length===this.length?e={fragment:i}:e=f.buildFragment(a,this,k),h=e.fragment,h.childNodes.length===1?g=h=h.firstChild:g=h.firstChild;if(g){c=c&&f.nodeName(g,"tr");for(var l=0,m=this.length,n=m-1;l<m;l++)d.call(c?bg(this[l],g):this[l],e.cacheable||m>1&&l<n?f.clone(h,!0,!0):h)}k.length&&f.each(k,bm)}return this}}),f.buildFragment=function(a,b,d){var e,g,h,i;b&&b[0]&&(i=b[0].ownerDocument||b[0]),i.createDocumentFragment||(i=c),a.length===1&&typeof a[0]=="string"&&a[0].length<512&&i===c&&a[0].charAt(0)==="<"&&!bb.test(a[0])&&(f.support.checkClone||!bc.test(a[0]))&&(g=!0,h=f.fragments[a[0]],h&&h!==1&&(e=h)),e||(e=i.createDocumentFragment(),f.clean(a,i,e,d)),g&&(f.fragments[a[0]]=h?e:1);return{fragment:e,cacheable:g}},f.fragments={},f.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){f.fn[a]=function(c){var d=[],e=f(c),g=this.length===1&&this[0].parentNode;if(g&&g.nodeType===11&&g.childNodes.length===1&&e.length===1){e[b](this[0]);return this}for(var h=0,i=e.length;h<i;h++){var j=(h>0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j +)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d=a.cloneNode(!0),e,g,h;if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bi(a,d),e=bj(a),g=bj(d);for(h=0;e[h];++h)bi(e[h],g[h])}if(b){bh(a,d);if(c){e=bj(a),g=bj(d);for(h=0;e[h];++h)bh(e[h],g[h])}}e=g=null;return d},clean:function(a,b,d,e){var g;b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);var h=[],i;for(var j=0,k;(k=a[j])!=null;j++){typeof k=="number"&&(k+="");if(!k)continue;if(typeof k=="string")if(!ba.test(k))k=b.createTextNode(k);else{k=k.replace(Z,"<$1></$2>");var l=($.exec(k)||["",""])[1].toLowerCase(),m=bf[l]||bf._default,n=m[0],o=b.createElement("div");o.innerHTML=m[1]+k+m[2];while(n--)o=o.lastChild;if(!f.support.tbody){var p=_.test(k),q=l==="table"&&!p?o.firstChild&&o.firstChild.childNodes:m[1]==="<table>"&&!p?o.childNodes:[];for(i=q.length-1;i>=0;--i)f.nodeName(q[i],"tbody")&&!q[i].childNodes.length&&q[i].parentNode.removeChild(q[i])}!f.support.leadingWhitespace&&Y.test(k)&&o.insertBefore(b.createTextNode(Y.exec(k)[0]),o.firstChild),k=o.childNodes}var r;if(!f.support.appendChecked)if(k[0]&&typeof (r=k.length)=="number")for(i=0;i<r;i++)bl(k[i]);else bl(k);k.nodeType?h.push(k):h=f.merge(h,k)}if(d){g=function(a){return!a.type||bd.test(a.type)};for(j=0;h[j];j++)if(e&&f.nodeName(h[j],"script")&&(!h[j].type||h[j].type.toLowerCase()==="text/javascript"))e.push(h[j].parentNode?h[j].parentNode.removeChild(h[j]):h[j]);else{if(h[j].nodeType===1){var s=f.grep(h[j].getElementsByTagName("script"),g);h.splice.apply(h,[j+1,0].concat(s))}d.appendChild(h[j])}}return h},cleanData:function(a){var b,c,d=f.cache,e=f.expando,g=f.event.special,h=f.support.deleteExpando;for(var i=0,j;(j=a[i])!=null;i++){if(j.nodeName&&f.noData[j.nodeName.toLowerCase()])continue;c=j[f.expando];if(c){b=d[c]&&d[c][e];if(b&&b.events){for(var k in b.events)g[k]?f.event.remove(j,k):f.removeEvent(j,k,b.handle);b.handle&&(b.handle.elem=null)}h?delete j[f.expando]:j.removeAttribute&&j.removeAttribute(f.expando),delete d[c]}}}});var bn=/alpha\([^)]*\)/i,bo=/opacity=([^)]*)/,bp=/([A-Z]|^ms)/g,bq=/^-?\d+(?:px)?$/i,br=/^-?\d/,bs=/^[+\-]=/,bt=/[^+\-\.\de]+/g,bu={position:"absolute",visibility:"hidden",display:"block"},bv=["Left","Right"],bw=["Top","Bottom"],bx,by,bz;f.fn.css=function(a,c){if(arguments.length===2&&c===b)return this;return f.access(this,a,c,!0,function(a,c,d){return d!==b?f.style(a,c,d):f.css(a,c)})},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=bx(a,"opacity","opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d;if(h==="number"&&isNaN(d)||d==null)return;h==="string"&&bs.test(d)&&(d=+d.replace(bt,"")+parseFloat(f.css(a,c)),h="number"),h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(bx)return bx(a,c)},swap:function(a,b,c){var d={};for(var e in b)d[e]=a.style[e],a.style[e]=b[e];c.call(a);for(e in b)a.style[e]=d[e]}}),f.curCSS=f.css,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){var e;if(c){if(a.offsetWidth!==0)return bA(a,b,d);f.swap(a,bu,function(){e=bA(a,b,d)});return e}},set:function(a,b){if(!bq.test(b))return b;b=parseFloat(b);if(b>=0)return b+"px"}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bo.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle;c.zoom=1;var e=f.isNaN(b)?"":"alpha(opacity="+b*100+")",g=d&&d.filter||c.filter||"";c.filter=bn.test(g)?g.replace(bn,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){var c;f.swap(a,{display:"inline-block"},function(){b?c=bx(a,"margin-right","marginRight"):c=a.style.marginRight});return c}})}),c.defaultView&&c.defaultView.getComputedStyle&&(by=function(a,c){var d,e,g;c=c.replace(bp,"-$1").toLowerCase();if(!(e=a.ownerDocument.defaultView))return b;if(g=e.getComputedStyle(a,null))d=g.getPropertyValue(c),d===""&&!f.contains(a.ownerDocument.documentElement,a)&&(d=f.style(a,c));return d}),c.documentElement.currentStyle&&(bz=function(a,b){var c,d=a.currentStyle&&a.currentStyle[b],e=a.runtimeStyle&&a.runtimeStyle[b],f=a.style;!bq.test(d)&&br.test(d)&&(c=f.left,e&&(a.runtimeStyle.left=a.currentStyle.left),f.left=b==="fontSize"?"1em":d||0,d=f.pixelLeft+"px",f.left=c,e&&(a.runtimeStyle.left=e));return d===""?"auto":d}),bx=by||bz,f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)});var bB=/%20/g,bC=/\[\]$/,bD=/\r?\n/g,bE=/#.*$/,bF=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bG=/^(?:color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bH=/^(?:about|app|app\-storage|.+\-extension|file|widget):$/,bI=/^(?:GET|HEAD)$/,bJ=/^\/\//,bK=/\?/,bL=/<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,bM=/^(?:select|textarea)/i,bN=/\s+/,bO=/([?&])_=[^&]*/,bP=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bQ=f.fn.load,bR={},bS={},bT,bU;try{bT=e.href}catch(bV){bT=c.createElement("a"),bT.href="",bT=bT.href}bU=bP.exec(bT.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bQ)return bQ.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("<div>").append(c.replace(bL,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bM.test(this.nodeName)||bG.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bD,"\r\n")}}):{name:b.name,value:c.replace(bD,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.bind(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?f.extend(!0,a,f.ajaxSettings,b):(b=a,a=f.extend(!0,f.ajaxSettings,b));for(var c in{context:1,url:1})c in b?a[c]=b[c]:c in f.ajaxSettings&&(a[c]=f.ajaxSettings[c]);return a},ajaxSettings:{url:bT,isLocal:bH.test(bU[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":"*/*"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML}},ajaxPrefilter:bW(bR),ajaxTransport:bW(bS),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a?4:0;var o,r,u,w=l?bZ(d,v,l):b,x,y;if(a>=200&&a<300||a===304){if(d.ifModified){if(x=v.getResponseHeader("Last-Modified"))f.lastModified[k]=x;if(y=v.getResponseHeader("Etag"))f.etag[k]=y}if(a===304)c="notmodified",o=!0;else try{r=b$(d,w),c="success",o=!0}catch(z){c="parsererror",u=z}}else{u=c;if(!c||a)c="error",a<0&&(a=0)}v.status=a,v.statusText=c,o?h.resolveWith(e,[r,c,v]):h.rejectWith(e,[v,c,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.resolveWith(e,[v,c]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f._Deferred(),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bF.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.done,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bE,"").replace(bJ,bU[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bN),d.crossDomain==null&&(r=bP.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bU[1]&&r[2]==bU[2]&&(r[3]||(r[1]==="http:"?80:443))==(bU[3]||(bU[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bX(bR,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bI.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bK.test(d.url)?"&":"?")+d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bO,"$1_="+x);d.url=y+(y===d.url?(bK.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", */*; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bX(bS,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){status<2?w(-1,z):f.error(z)}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)bY(g,a[g],c,e);return d.join("&").replace(bB,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var b_=f.now(),ca=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+b_++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=b.contentType==="application/x-www-form-urlencoded"&&typeof b.data=="string";if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(ca.test(b.url)||e&&ca.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(ca,l),b.url===j&&(e&&(k=k.replace(ca,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var cb=a.ActiveXObject?function(){for(var a in cd)cd[a](0,1)}:!1,cc=0,cd;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ce()||cf()}:ce,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,cb&&delete cd[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n),m.text=h.responseText;try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cc,cb&&(cd||(cd={},f(a).unload(cb)),cd[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cg={},ch,ci,cj=/^(?:toggle|show|hide)$/,ck=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,cl,cm=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cn,co=a.webkitRequestAnimationFrame||a.mozRequestAnimationFrame||a.oRequestAnimationFrame;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(cr("show",3),a,b,c);for(var g=0,h=this.length;g<h;g++)d=this[g],d.style&&(e=d.style.display,!f._data(d,"olddisplay")&&e==="none"&&(e=d.style.display=""),e===""&&f.css(d,"display")==="none"&&f._data(d,"olddisplay",cs(d.nodeName)));for(g=0;g<h;g++){d=this[g];if(d.style){e=d.style.display;if(e===""||e==="none")d.style.display=f._data(d,"olddisplay")||""}}return this},hide:function(a,b,c){if(a||a===0)return this.animate(cr("hide",3),a,b,c);for(var d=0,e=this.length;d<e;d++)if(this[d].style){var g=f.css(this[d],"display");g!=="none"&&!f._data(this[d],"olddisplay")&&f._data(this[d],"olddisplay",g)}for(d=0;d<e;d++)this[d].style&&(this[d].style.display="none");return this},_toggle:f.fn.toggle,toggle:function(a,b,c){var d=typeof a=="boolean";f.isFunction(a)&&f.isFunction(b)?this._toggle.apply(this,arguments):a==null||d?this.each(function(){var b=d?a:f(this).is(":hidden");f(this)[b?"show":"hide"]()}):this.animate(cr("toggle",3),a,b,c);return this},fadeTo:function(a,b,c,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=f.speed(b,c,d);if(f.isEmptyObject(a))return this.each(e.complete,[!1]);a=f.extend({},a);return this[e.queue===!1?"each":"queue"](function(){e.queue===!1&&f._mark(this);var b=f.extend({},e),c=this.nodeType===1,d=c&&f(this).is(":hidden"),g,h,i,j,k,l,m,n,o;b.animatedProperties={};for(i in a){g=f.camelCase(i),i!==g&&(a[g]=a[i],delete a[i]),h=a[g],f.isArray(h)?(b.animatedProperties[g]=h[1],h=a[g]=h[0]):b.animatedProperties[g]=b.specialEasing&&b.specialEasing[g]||b.easing||"swing";if(h==="hide"&&d||h==="show"&&!d)return b.complete.call(this);c&&(g==="height"||g==="width")&&(b.overflow=[this.style.overflow,this.style.overflowX,this.style.overflowY],f.css(this,"display")==="inline"&&f.css(this,"float")==="none"&&(f.support.inlineBlockNeedsLayout?(j=cs(this.nodeName),j==="inline"?this.style.display="inline-block":(this.style.display="inline",this.style.zoom=1)):this.style.display="inline-block"))}b.overflow!=null&&(this.style.overflow="hidden");for(i in a)k=new f.fx(this,b,i),h=a[i],cj.test(h)?k[h==="toggle"?d?"show":"hide":h]():(l=ck.exec(h),m=k.cur(),l?(n=parseFloat(l[2]),o=l[3]||(f.cssNumber[i]?"":"px"),o!=="px"&&(f.style(this,i,(n||1)+o),m=(n||1)/k.cur()*m,f.style(this,i,m+o)),l[1]&&(n=(l[1]==="-="?-1:1)*n+m),k.custom(m,n,o)):k.custom(m,h,""));return!0})},stop:function(a,b){a&&this.queue([]),this.each(function(){var a=f.timers,c=a.length;b||f._unmark(!0,this);while(c--)a[c].elem===this&&(b&&a[c](!0),a.splice(c,1))}),b||this.dequeue();return this}}),f.each({slideDown:cr("show",1),slideUp:cr("hide",1),slideToggle:cr("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){f.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),f.extend({speed:function(a,b,c){var d=a&&typeof a=="object"?f.extend({},a):{complete:c||!c&&b||f.isFunction(a)&&a,duration:a,easing:c&&b||b&&!f.isFunction(b)&&b};d.duration=f.fx.off?0:typeof d.duration=="number"?d.duration:d.duration in f.fx.speeds?f.fx.speeds[d.duration]:f.fx.speeds._default,d.old=d.complete,d.complete=function(a){f.isFunction(d.old)&&d.old.call(this),d.queue!==!1?f.dequeue(this):a!==!1&&f._unmark(this)};return d},easing:{linear:function(a,b,c,d){return c+d*a},swing:function(a,b,c,d){return(-Math.cos(a*Math.PI)/2+.5)*d+c}},timers:[],fx:function(a,b,c){this.options=b,this.elem=a,this.prop=c,b.orig=b.orig||{}}}),f.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this),(f.fx.step[this.prop]||f.fx.step._default)(this)},cur:function(){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];var a,b=f.css(this.elem,this.prop);return isNaN(a=parseFloat(b))?!b||b==="auto"?0:b:a},custom:function(a,b,c){function h(a){return d.step(a)}var d=this,e=f.fx,g;this.startTime=cn||cp(),this.start=a,this.end=b,this.unit=c||this.unit||(f.cssNumber[this.prop]?"":"px"),this.now=this.start,this.pos=this.state=0,h.elem=this.elem,h()&&f.timers.push(h)&&!cl&&(co?(cl=!0,g=function(){cl&&(co(g),e.tick())},co(g)):cl=setInterval(e.tick,e.interval))},show:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.show=!0,this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur()),f(this.elem).show()},hide:function(){this.options.orig[this.prop]=f.style(this.elem,this.prop),this.options.hide=!0,this.custom(this.cur(),0)},step:function(a){var b=cn||cp(),c=!0,d=this.elem,e=this.options,g,h;if(a||b>=e.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),e.animatedProperties[this.prop]=!0;for(g in e.animatedProperties)e.animatedProperties[g]!==!0&&(c=!1);if(c){e.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){d.style["overflow"+b]=e.overflow[a]}),e.hide&&f(d).hide();if(e.hide||e.show)for(var i in e.animatedProperties)f.style(d,i,e.orig[i]);e.complete.call(d)}return!1}e.duration==Infinity?this.now=b:(h=b-this.startTime,this.state=h/e.duration,this.pos=f.easing[e.animatedProperties[this.prop]](this.state,h,0,1,e.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){for(var a=f.timers,b=0;b<a.length;++b)a[b]()||a.splice(b--,1);a.length||f.fx.stop()},interval:13,stop:function(){clearInterval(cl),cl=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){f.style(a.elem,"opacity",a.now)},_default:function(a){a.elem.style&&a.elem.style[a.prop]!=null?a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit:a.elem[a.prop]=a.now}}}),f.expr&&f.expr.filters&&(f.expr.filters.animated=function(a){return f.grep(f.timers,function(b){return a===b.elem}).length});var ct=/^t(?:able|d|h)$/i,cu=/^(?:body|html)$/i;"getBoundingClientRect"in c.documentElement?f.fn.offset=function(a){var b=this[0],c;if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);try{c=b.getBoundingClientRect()}catch(d){}var e=b.ownerDocument,g=e.documentElement;if(!c||!f.contains(g,b))return c?{top:c.top,left:c.left}:{top:0,left:0};var h=e.body,i=cv(e),j=g.clientTop||h.clientTop||0,k=g.clientLeft||h.clientLeft||0,l=i.pageYOffset||f.support.boxModel&&g.scrollTop||h.scrollTop,m=i.pageXOffset||f.support.boxModel&&g.scrollLeft||h.scrollLeft,n=c.top+l-j,o=c.left+m-k;return{top:n,left:o}}:f.fn.offset=function(a){var b=this[0];if(a)return this.each(function(b){f.offset.setOffset(this,a,b)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return f.offset.bodyOffset(b);f.offset.initialize();var c,d=b.offsetParent,e=b,g=b.ownerDocument,h=g.documentElement,i=g.body,j=g.defaultView,k=j?j.getComputedStyle(b,null):b.currentStyle,l=b.offsetTop,m=b.offsetLeft;while((b=b.parentNode)&&b!==i&&b!==h){if(f.offset.supportsFixedPosition&&k.position==="fixed")break;c=j?j.getComputedStyle(b,null):b.currentStyle,l-=b.scrollTop,m-=b.scrollLeft,b===d&&(l+=b.offsetTop,m+=b.offsetLeft,f.offset.doesNotAddBorder&&(!f.offset.doesAddBorderForTableAndCells||!ct.test(b.nodeName))&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),e=d,d=b.offsetParent),f.offset.subtractsBorderForOverflowNotVisible&&c.overflow!=="visible"&&(l+=parseFloat(c.borderTopWidth)||0,m+=parseFloat(c.borderLeftWidth)||0),k=c}if(k.position==="relative"||k.position==="static")l+=i.offsetTop,m+=i.offsetLeft;f.offset.supportsFixedPosition&&k.position==="fixed"&&(l+=Math.max(h.scrollTop,i.scrollTop),m+=Math.max(h.scrollLeft,i.scrollLeft));return{top:l,left:m}},f.offset={initialize:function(){var a=c.body,b=c.createElement("div"),d,e,g,h,i=parseFloat(f.css(a,"marginTop"))||0,j="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>";f.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"}),b.innerHTML=j,a.insertBefore(b,a.firstChild),d=b.firstChild,e=d.firstChild,h=d.nextSibling.firstChild.firstChild,this.doesNotAddBorder=e.offsetTop!==5,this.doesAddBorderForTableAndCells=h.offsetTop===5,e.style.position="fixed",e.style.top="20px",this.supportsFixedPosition=e.offsetTop===20||e.offsetTop===15,e.style.position=e.style.top="",d.style.overflow="hidden",d.style.position="relative",this.subtractsBorderForOverflowNotVisible=e.offsetTop===-5,this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==i,a.removeChild(b),f.offset.initialize=f.noop},bodyOffset:function(a){var b=a.offsetTop,c=a.offsetLeft;f.offset.initialize(),f.offset.doesNotIncludeMarginInBodyOffset&&(b+=parseFloat(f.css(a,"marginTop"))||0,c+=parseFloat(f.css(a,"marginLeft"))||0);return{top:b,left:c}},setOffset:function(a,b,c){var d=f.css(a,"position");d==="static"&&(a.style.position="relative");var e=f(a),g=e.offset(),h=f.css(a,"top"),i=f.css(a,"left"),j=(d==="absolute"||d==="fixed")&&f.inArray("auto",[h,i])>-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cu.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cu.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each(["Left","Top"],function(a,c){var d="scroll"+c;f.fn[d]=function(c){var e,g;if(c===b){e=this[0];if(!e)return null;g=cv(e);return g?"pageXOffset"in g?g[a?"pageYOffset":"pageXOffset"]:f.support.boxModel&&g.document.documentElement[d]||g.document.body[d]:e[d]}return this.each(function(){g=cv(this),g?g.scrollTo(a?f(g).scrollLeft():c,a?c:f(g).scrollTop()):this[d]=c})}}),f.each(["Height","Width"],function(a,c){var d=c.toLowerCase();f.fn["inner"+c]=function(){var a=this[0];return a&&a.style?parseFloat(f.css(a,d,"padding")):null},f.fn["outer"+c]=function(a){var b=this[0];return b&&b.style?parseFloat(f.css(b,d,a?"margin":"border")):null},f.fn[d]=function(a){var e=this[0];if(!e)return a==null?null:this;if(f.isFunction(a))return this.each(function(b){var c=f(this);c[d](a.call(this,b,c[d]()))});if(f.isWindow(e)){var g=e.document.documentElement["client"+c];return e.document.compatMode==="CSS1Compat"&&g||e.document.body["client"+c]||g}if(e.nodeType===9)return Math.max(e.documentElement["client"+c],e.body["scroll"+c],e.documentElement["scroll"+c],e.body["offset"+c],e.documentElement["offset"+c]);if(a===b){var h=f.css(e,d),i=parseFloat(h);return f.isNaN(i)?h:i}return this.css(d,typeof a=="string"?a:a+"px")}}),a.jQuery=a.$=f})(window);
\ No newline at end of file diff --git a/tools/droiddoc/templates-sdk/assets/yui-3.3.0-reset-min.css b/tools/droiddoc/templates-sdk/assets/yui-3.3.0-reset-min.css new file mode 100644 index 0000000..00c3892 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/yui-3.3.0-reset-min.css @@ -0,0 +1,8 @@ +/* +Copyright (c) 2010, Yahoo! Inc. All rights reserved. +Code licensed under the BSD License: +http://developer.yahoo.com/yui/license.html +version: 3.3.0 +build: 3167 +*/ +html{color:#000;background:#FFF;}body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;}table{border-collapse:collapse;border-spacing:0;}fieldset,img{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}li{list-style:none;}caption,th{text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;}q:before,q:after{content:'';}abbr,acronym{border:0;font-variant:normal;}sup{vertical-align:text-top;}sub{vertical-align:text-bottom;}input,textarea,select{font-family:inherit;font-size:inherit;font-weight:inherit;}input,textarea,select{*font-size:100%;}legend{color:#000;}
\ No newline at end of file diff --git a/tools/droiddoc/templates-sdk/components/masthead.cs b/tools/droiddoc/templates-sdk/components/masthead.cs index e521489..5910107 100644 --- a/tools/droiddoc/templates-sdk/components/masthead.cs +++ b/tools/droiddoc/templates-sdk/components/masthead.cs @@ -28,7 +28,8 @@ //--> </script> </span> - <?cs /if ?> + <?cs /if ?> + <a href="<?cs var:toroot ?>design/index.html">Android Design</a> <a href="http://www.android.com">Android.com</a> </div><?cs call:default_search_box() ?><?cs diff --git a/tools/droiddoc/templates-sdk/customizations.cs b/tools/droiddoc/templates-sdk/customizations.cs index cfeab16..41559be 100644 --- a/tools/droiddoc/templates-sdk/customizations.cs +++ b/tools/droiddoc/templates-sdk/customizations.cs @@ -1,7 +1,7 @@ <?cs def:sdk_nav() ?> <div class="g-section g-tpl-240" id="body-content"> - <div class="g-unit g-first" id="side-nav"> + <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> <div id="devdoc-nav"><?cs include:"../../../../frameworks/base/docs/html/sdk/sdk_toc.cs" ?> </div> @@ -10,7 +10,7 @@ def:sdk_nav() ?> <?cs def:resources_tab_nav() ?> <div class="g-section g-tpl-200" id="body-content"> - <div class="g-unit g-first" id="side-nav"> + <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> <div id="devdoc-nav"><?cs include:"../../../../frameworks/base/docs/html/resources/resources_toc.cs" ?> </div> @@ -24,7 +24,7 @@ def:resources_tab_nav() ?> <?cs def:guide_nav() ?> <div class="g-section g-tpl-240" id="body-content"> - <div class="g-unit g-first" id="side-nav"> + <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> <div id="devdoc-nav"><?cs include:"../../../../frameworks/base/docs/html/guide/guide_toc.cs" ?> </div> @@ -35,11 +35,15 @@ def:guide_nav() ?> }); </script> <?cs /def ?> +<?cs +def:design_nav() ?> + <?cs include:"../../../../frameworks/base/docs/html/design/design_toc.cs" ?> +<?cs /def ?> <?cs # The default side navigation for the reference docs ?><?cs def:default_left_nav() ?> <div class="g-section g-tpl-240" id="body-content"> - <div class="g-unit g-first" id="side-nav"> + <div class="g-unit g-first" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> <div id="swapper"> <div id="nav-panels"> <div id="resize-packages-nav"> @@ -138,9 +142,11 @@ def:custom_copyright() ?> <?cs def:custom_footerlinks() ?> <p> - <a href="http://www.android.com/terms.html">Site Terms of Service</a> - - <a href="http://www.android.com/privacy.html">Privacy Policy</a> - - <a href="http://www.android.com/branding.html">Brand Guidelines</a> + <a href="http://www.google.com/intl/en/policies/" target="_blank">Privacy & Terms</a> - + <a href="http://www.android.com/branding.html" target="_blank">Brand Guidelines</a> - + <a +href="http://code.google.com/p/android/issues/entry?template=Developer%20Documentation" +target="_blank">Report Document Issues</a> </p><?cs /def ?> diff --git a/tools/droiddoc/templates-sdk/designpage.cs b/tools/droiddoc/templates-sdk/designpage.cs new file mode 100644 index 0000000..024f7df --- /dev/null +++ b/tools/droiddoc/templates-sdk/designpage.cs @@ -0,0 +1,94 @@ +<!DOCTYPE html> +<?cs include:"macros.cs" ?> +<html lang="en"> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title> + Android Design<?cs if:page.title ?> - <?cs var:page.title ?><?cs /if ?> + </title> + <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico"> + <link rel="stylesheet" href="http://fonts.googleapis.com/css?family=Roboto:regular,medium,thin,italic,mediumitalic"> + <link rel="stylesheet" href="<?cs var:toroot ?>assets/yui-3.3.0-reset-min.css"> + <link rel="stylesheet" href="<?cs var:toroot ?>assets/design/default.css"> + <script src="<?cs var:toroot ?>assets/jquery-1.6.2.min.js"></script> + <script>var SITE_ROOT = '<?cs var:toroot ?>design';</script> + <script src="<?cs var:toroot ?>assets/design/default.js"></script> + </head> + <body itemscope itemtype="http://schema.org/Article"> + + <div id="page-container"> + + <div id="page-header" itemscope itemtype="http://schema.org/WPHeader"><a href="<?cs var:toroot ?>design/index.html">Android Design</a></div> + + <div id="main-row"> + + <div id="nav-container" itemscope itemtype="http://schema.org/SiteNavigationElement"> + + <?cs call:design_nav() ?> + + </div> + + <div id="content"> + +<?cs if:header.hide ?> +<?cs else ?> +<div class="layout-content-row content-header <?cs if:header.justLinks ?>just-links<?cs /if ?>"> + <div class="layout-content-col span-9"> + <?cs if:header.justLinks ?> + <?cs elif:header.title ?><h2><?cs var:header.title ?></h2> + <?cs else ?><h2><?cs var:page.title ?></h2> + <?cs /if ?> + </div> + <div class="paging-links layout-content-col span-4" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <a href="#" class="prev-page-link">Previous</a> + <a href="#" class="next-page-link">Next</a> + </div> +</div> +<?cs /if ?> + +<?cs call:tag_list(root.descr) ?> + +<?cs if:footer.hide ?> +<?cs else ?> +<div class="layout-content-row content-footer" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <div class="paging-links layout-content-col span-9"> </div> + <div class="paging-links layout-content-col span-4"> + <a href="#" class="prev-page-link">Previous</a> + <a href="#" class="next-page-link">Next</a> + </div> +</div> +<?cs /if ?> + + </div> + + </div> + + <div id="page-footer" itemscope itemtype="http://schema.org/WPFooter"> + + <p id="copyright"> + Except as noted, this content is licensed under + <a href="http://creativecommons.org/licenses/by/2.5/"> + Creative Commons Attribution 2.5</a>.<br> + For details and restrictions, see the + <a href="http://developer.android.com/license.html">Content License</a>. + </p> + + <p> + <a href="http://www.android.com/terms.html">Site Terms of Service</a> – + <a href="http://www.android.com/privacy.html">Privacy Policy</a> – + <a href="http://www.android.com/branding.html">Brand Guidelines</a> + </p> + + </div> + </div> + + <script type="text/javascript"> + var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); + document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E")); + </script> + <script type="text/javascript"> + var pageTracker = _gat._getTracker("UA-5831155-1"); + pageTracker._trackPageview(); + </script> + </body> +</html> diff --git a/tools/droiddoc/templates-sdk/docpage.cs b/tools/droiddoc/templates-sdk/docpage.cs index 3c11865..c9ced96 100644 --- a/tools/droiddoc/templates-sdk/docpage.cs +++ b/tools/droiddoc/templates-sdk/docpage.cs @@ -2,19 +2,19 @@ <?cs include:"macros.cs" ?> <html> <?cs include:"head_tag.cs" ?> -<body class="gc-documentation"> +<body class="gc-documentation" itemscope itemtype="http://schema.org/Article"> <?cs include:"header.cs" ?> <div class="g-unit" id="doc-content"><a name="top"></a> <div id="jd-header" class="guide-header"> - <span class="crumb"> + <span class="crumb" itemprop="breadcrumb"> <?cs if:parent.link ?> <a href="<?cs var:parent.link ?>"><?cs var:parent.title ?></a>: <?cs else ?> <?cs /if ?> </span> -<h1><?cs var:page.title ?></h1> +<h1 itemprop="name"><?cs var:page.title ?></h1> </div> <?cs # THIS IS THE MAIN DOC CONTENT ?> @@ -61,7 +61,7 @@ <?cs /if ?><?cs # end if trainingnavtop ?> - <div class="jd-descr"> + <div class="jd-descr" itemprop="articleBody"> <?cs call:tag_list(root.descr) ?> </div> diff --git a/tools/droiddoc/templates-sdk/head_tag.cs b/tools/droiddoc/templates-sdk/head_tag.cs index fd8aad6..0ecda7b 100644 --- a/tools/droiddoc/templates-sdk/head_tag.cs +++ b/tools/droiddoc/templates-sdk/head_tag.cs @@ -1,5 +1,8 @@ <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> +<?cs if:page.metaDescription ?> +<meta name="Description" content="<?cs var:page.metaDescription ?>"> +<?cs /if ?> <link rel="shortcut icon" type="image/x-icon" href="<?cs var:toroot ?>favicon.ico" /> <title><?cs if:page.title ?><?cs diff --git a/tools/droiddoc/templates-sdk/sdkpage.cs b/tools/droiddoc/templates-sdk/sdkpage.cs index 331411f..f6c7cfa 100644 --- a/tools/droiddoc/templates-sdk/sdkpage.cs +++ b/tools/droiddoc/templates-sdk/sdkpage.cs @@ -12,7 +12,7 @@ <?cs else ?> <?cs include:"head_tag.cs" ?> <?cs /if ?> -<body class="gc-documentation"> +<body class="gc-documentation" itemscope itemtype="http://schema.org/CreativeWork"> <a name="top"></a> <?cs call:custom_masthead() ?> @@ -42,10 +42,11 @@ <div class="g-unit" id="doc-content" > <div id="jd-header" class="guide-header" > <span class="crumb"> </span> - <h1><?cs if:android.whichdoc == "online" ?>Download the <?cs /if ?><?cs var:page.title ?></h1> + <h1 itemprop="name"><?cs if:android.whichdoc == "online" ?>Download the <?cs /if ?><?cs +var:page.title ?></h1> </div> - <div id="jd-content"> + <div id="jd-content" itemprop="description"> <?cs if:sdk.not_latest_version ?> <div class="special"> diff --git a/tools/java-event-log-tags.py b/tools/java-event-log-tags.py index c63fa20..846d9cf 100755 --- a/tools/java-event-log-tags.py +++ b/tools/java-event-log-tags.py @@ -26,6 +26,7 @@ tags in the given input file. import cStringIO import getopt import os +import os.path import re import sys @@ -144,4 +145,8 @@ for t in tagfile.tags: buffer.write("}\n"); +output_dir = os.path.dirname(output_file) +if not os.path.exists(output_dir): + os.makedirs(output_dir) + event_log_tags.WriteOutput(output_file, buffer) diff --git a/tools/java-layers.py b/tools/java-layers.py deleted file mode 100755 index b3aec2b..0000000 --- a/tools/java-layers.py +++ /dev/null @@ -1,257 +0,0 @@ -#!/usr/bin/env python - -import os -import re -import sys - -def fail_with_usage(): - sys.stderr.write("usage: java-layers.py DEPENDENCY_FILE SOURCE_DIRECTORIES...\n") - sys.stderr.write("\n") - sys.stderr.write("Enforces layering between java packages. Scans\n") - sys.stderr.write("DIRECTORY and prints errors when the packages violate\n") - sys.stderr.write("the rules defined in the DEPENDENCY_FILE.\n") - sys.stderr.write("\n") - sys.stderr.write("Prints a warning when an unknown package is encountered\n") - sys.stderr.write("on the assumption that it should fit somewhere into the\n") - sys.stderr.write("layering.\n") - sys.stderr.write("\n") - sys.stderr.write("DEPENDENCY_FILE format\n") - sys.stderr.write(" - # starts comment\n") - sys.stderr.write(" - Lines consisting of two java package names: The\n") - sys.stderr.write(" first package listed must not contain any references\n") - sys.stderr.write(" to any classes present in the second package, or any\n") - sys.stderr.write(" of its dependencies.\n") - sys.stderr.write(" - Lines consisting of one java package name: The\n") - sys.stderr.write(" packge is assumed to be a high level package and\n") - sys.stderr.write(" nothing may depend on it.\n") - sys.stderr.write(" - Lines consisting of a dash (+) followed by one java\n") - sys.stderr.write(" package name: The package is considered a low level\n") - sys.stderr.write(" package and may not import any of the other packages\n") - sys.stderr.write(" listed in the dependency file.\n") - sys.stderr.write(" - Lines consisting of a plus (-) followed by one java\n") - sys.stderr.write(" package name: The package is considered \'legacy\'\n") - sys.stderr.write(" and excluded from errors.\n") - sys.stderr.write("\n") - sys.exit(1) - -class Dependency: - def __init__(self, filename, lineno, lower, top, lowlevel, legacy): - self.filename = filename - self.lineno = lineno - self.lower = lower - self.top = top - self.lowlevel = lowlevel - self.legacy = legacy - self.uppers = [] - self.transitive = set() - - def matches(self, imp): - for d in self.transitive: - if imp.startswith(d): - return True - return False - -class Dependencies: - def __init__(self, deps): - def recurse(obj, dep, visited): - global err - if dep in visited: - sys.stderr.write("%s:%d: Circular dependency found:\n" - % (dep.filename, dep.lineno)) - for v in visited: - sys.stderr.write("%s:%d: Dependency: %s\n" - % (v.filename, v.lineno, v.lower)) - err = True - return - visited.append(dep) - for upper in dep.uppers: - obj.transitive.add(upper) - if upper in deps: - recurse(obj, deps[upper], visited) - self.deps = deps - self.parts = [(dep.lower.split('.'),dep) for dep in deps.itervalues()] - # transitive closure of dependencies - for dep in deps.itervalues(): - recurse(dep, dep, []) - # disallow everything from the low level components - for dep in deps.itervalues(): - if dep.lowlevel: - for d in deps.itervalues(): - if dep != d and not d.legacy: - dep.transitive.add(d.lower) - # disallow the 'top' components everywhere but in their own package - for dep in deps.itervalues(): - if dep.top and not dep.legacy: - for d in deps.itervalues(): - if dep != d and not d.legacy: - d.transitive.add(dep.lower) - for dep in deps.itervalues(): - dep.transitive = set([x+"." for x in dep.transitive]) - if False: - for dep in deps.itervalues(): - print "-->", dep.lower, "-->", dep.transitive - - # Lookup the dep object for the given package. If pkg is a subpackage - # of one with a rule, that one will be returned. If no matches are found, - # None is returned. - def lookup(self, pkg): - # Returns the number of parts that match - def compare_parts(parts, pkg): - if len(parts) > len(pkg): - return 0 - n = 0 - for i in range(0, len(parts)): - if parts[i] != pkg[i]: - return 0 - n = n + 1 - return n - pkg = pkg.split(".") - matched = 0 - result = None - for (parts,dep) in self.parts: - x = compare_parts(parts, pkg) - if x > matched: - matched = x - result = dep - return result - -def parse_dependency_file(filename): - global err - f = file(filename) - lines = f.readlines() - f.close() - def lineno(s, i): - i[0] = i[0] + 1 - return (i[0],s) - n = [0] - lines = [lineno(x,n) for x in lines] - lines = [(n,s.split("#")[0].strip()) for (n,s) in lines] - lines = [(n,s) for (n,s) in lines if len(s) > 0] - lines = [(n,s.split()) for (n,s) in lines] - deps = {} - for n,words in lines: - if len(words) == 1: - lower = words[0] - top = True - legacy = False - lowlevel = False - if lower[0] == '+': - lower = lower[1:] - top = False - lowlevel = True - elif lower[0] == '-': - lower = lower[1:] - legacy = True - if lower in deps: - sys.stderr.write(("%s:%d: Package '%s' already defined on" - + " line %d.\n") % (filename, n, lower, deps[lower].lineno)) - err = True - else: - deps[lower] = Dependency(filename, n, lower, top, lowlevel, legacy) - elif len(words) == 2: - lower = words[0] - upper = words[1] - if lower in deps: - dep = deps[lower] - if dep.top: - sys.stderr.write(("%s:%d: Can't add dependency to top level package " - + "'%s'\n") % (filename, n, lower)) - err = True - else: - dep = Dependency(filename, n, lower, False, False, False) - deps[lower] = dep - dep.uppers.append(upper) - else: - sys.stderr.write("%s:%d: Too many words on line starting at \'%s\'\n" % ( - filename, n, words[2])) - err = True - return Dependencies(deps) - -def find_java_files(srcs): - result = [] - for d in srcs: - if d[0] == '@': - f = file(d[1:]) - result.extend([fn for fn in [s.strip() for s in f.readlines()] - if len(fn) != 0]) - f.close() - else: - for root, dirs, files in os.walk(d): - result.extend([os.sep.join((root,f)) for f in files - if f.lower().endswith(".java")]) - return result - -COMMENTS = re.compile("//.*?\n|/\*.*?\*/", re.S) -PACKAGE = re.compile("package\s+(.*)") -IMPORT = re.compile("import\s+(.*)") - -def examine_java_file(deps, filename): - global err - # Yes, this is a crappy java parser. Write a better one if you want to. - f = file(filename) - text = f.read() - f.close() - text = COMMENTS.sub("", text) - index = text.find("{") - if index < 0: - sys.stderr.write(("%s: Error: Unable to parse java. Can't find class " - + "declaration.\n") % filename) - err = True - return - text = text[0:index] - statements = [s.strip() for s in text.split(";")] - # First comes the package declaration. Then iterate while we see import - # statements. Anything else is either bad syntax that we don't care about - # because the compiler will fail, or the beginning of the class declaration. - m = PACKAGE.match(statements[0]) - if not m: - sys.stderr.write(("%s: Error: Unable to parse java. Missing package " - + "statement.\n") % filename) - err = True - return - pkg = m.group(1) - imports = [] - for statement in statements[1:]: - m = IMPORT.match(statement) - if not m: - break - imports.append(m.group(1)) - # Do the checking - if False: - print filename - print "'%s' --> %s" % (pkg, imports) - dep = deps.lookup(pkg) - if not dep: - sys.stderr.write(("%s: Error: Package does not appear in dependency file: " - + "%s\n") % (filename, pkg)) - err = True - return - for imp in imports: - if dep.matches(imp): - sys.stderr.write("%s: Illegal import in package '%s' of '%s'\n" - % (filename, pkg, imp)) - err = True - -err = False - -def main(argv): - if len(argv) < 3: - fail_with_usage() - deps = parse_dependency_file(argv[1]) - - if err: - sys.exit(1) - - java = find_java_files(argv[2:]) - for filename in java: - examine_java_file(deps, filename) - - if err: - sys.stderr.write("%s: Using this file as dependency file.\n" % argv[1]) - sys.exit(1) - - sys.exit(0) - -if __name__ == "__main__": - main(sys.argv) - diff --git a/tools/releasetools/build_image.py b/tools/releasetools/build_image.py new file mode 100755 index 0000000..15acddc --- /dev/null +++ b/tools/releasetools/build_image.py @@ -0,0 +1,139 @@ +#!/usr/bin/env python +# +# Copyright (C) 2011 The Android Open Source Project +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +""" +Build image output_image_file from input_directory and properties_file. + +Usage: build_image input_directory properties_file output_image_file + +""" +import os +import subprocess +import sys + + +def BuildImage(in_dir, prop_dict, out_file): + """Build an image to out_file from in_dir with property prop_dict. + + Args: + in_dir: path of input directory. + prop_dict: property dictionary. + out_file: path of the output image file. + + Returns: + True iff the image is built successfully. + """ + build_command = [] + fs_type = prop_dict.get("fs_type", "") + if fs_type.startswith("ext"): + build_command = ["mkuserimg.sh"] + if "extfs_sparse_flag" in prop_dict: + build_command.append(prop_dict["extfs_sparse_flag"]) + build_command.extend([in_dir, out_file, fs_type, + prop_dict["mount_point"]]) + if "partition_size" in prop_dict: + build_command.append(prop_dict["partition_size"]) + else: + build_command = ["mkyaffs2image", "-f"] + if prop_dict.get("mkyaffs2_extra_flags", None): + build_command.extend(prop_dict["mkyaffs2_extra_flags"].split()) + build_command.append(in_dir) + build_command.append(out_file) + + print "Running: ", " ".join(build_command) + p = subprocess.Popen(build_command); + p.communicate() + return p.returncode == 0 + + +def ImagePropFromGlobalDict(glob_dict, mount_point): + """Build an image property dictionary from the global dictionary. + + Args: + glob_dict: the global dictionary from the build system. + mount_point: such as "system", "data" etc. + """ + d = {} + + def copy_prop(src_p, dest_p): + if src_p in glob_dict: + d[dest_p] = str(glob_dict[src_p]) + + common_props = ( + "extfs_sparse_flag", + "mkyaffs2_extra_flags", + ) + for p in common_props: + copy_prop(p, p) + + d["mount_point"] = mount_point + if mount_point == "system": + copy_prop("fs_type", "fs_type") + copy_prop("system_size", "partition_size") + elif mount_point == "data": + copy_prop("fs_type", "fs_type") + copy_prop("userdata_size", "partition_size") + elif mount_point == "cache": + copy_prop("cache_fs_type", "fs_type") + copy_prop("cache_size", "partition_size") + + return d + + +def LoadGlobalDict(filename): + """Load "name=value" pairs from filename""" + d = {} + f = open(filename) + for line in f: + line = line.strip() + if not line or line.startswith("#"): + continue + k, v = line.split("=", 1) + d[k] = v + f.close() + return d + + +def main(argv): + if len(argv) != 3: + print __doc__ + sys.exit(1) + + in_dir = argv[0] + glob_dict_file = argv[1] + out_file = argv[2] + + glob_dict = LoadGlobalDict(glob_dict_file) + image_filename = os.path.basename(out_file) + mount_point = "" + if image_filename == "system.img": + mount_point = "system" + elif image_filename == "userdata.img": + mount_point = "data" + elif image_filename == "cache.img": + mount_point = "cache" + else: + print >> sys.stderr, "error: unknown image file name ", image_filename + exit(1) + + image_properties = ImagePropFromGlobalDict(glob_dict, mount_point) + if not BuildImage(in_dir, image_properties, out_file): + print >> sys.stderr, "error: failed to build %s from %s" % (out_file, in_dir) + exit(1) + + +if __name__ == '__main__': + main(sys.argv[1:]) diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index 4957354..8196b3c 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -138,6 +138,7 @@ def LoadInfoDict(zip): makeint("blocksize") makeint("system_size") makeint("userdata_size") + makeint("cache_size") makeint("recovery_size") makeint("boot_size") @@ -389,24 +390,27 @@ def CheckSize(data, target, info_dict): if mount_point == "/userdata": mount_point = "/data" p = info_dict["fstab"][mount_point] fs_type = p.fs_type - limit = info_dict.get(p.device + "_size", None) + device = p.device + if "/" in device: + device = device[device.rfind("/")+1:] + limit = info_dict.get(device + "_size", None) if not fs_type or not limit: return if fs_type == "yaffs2": # image size should be increased by 1/64th to account for the # spare area (64 bytes per 2k page) limit = limit / 2048 * (2048+64) - size = len(data) - pct = float(size) * 100.0 / limit - msg = "%s size (%d) is %.2f%% of limit (%d)" % (target, size, pct, limit) - if pct >= 99.0: - raise ExternalError(msg) - elif pct >= 95.0: - print - print " WARNING: ", msg - print - elif OPTIONS.verbose: - print " ", msg + size = len(data) + pct = float(size) * 100.0 / limit + msg = "%s size (%d) is %.2f%% of limit (%d)" % (target, size, pct, limit) + if pct >= 99.0: + raise ExternalError(msg) + elif pct >= 95.0: + print + print " WARNING: ", msg + print + elif OPTIONS.verbose: + print " ", msg def ReadApkCerts(tf_zip): @@ -659,6 +663,10 @@ class DeviceSpecificParams(object): assertions they like.""" return self._DoCall("FullOTA_Assertions") + def FullOTA_InstallBegin(self): + """Called at the start of full OTA installation.""" + return self._DoCall("FullOTA_InstallBegin") + def FullOTA_InstallEnd(self): """Called at the end of full OTA installation; typically this is used to install the image for the device's baseband processor.""" @@ -670,12 +678,23 @@ class DeviceSpecificParams(object): additional assertions they like.""" return self._DoCall("IncrementalOTA_Assertions") + def IncrementalOTA_VerifyBegin(self): + """Called at the start of the verification phase of incremental + OTA installation; additional checks can be placed here to abort + the script before any changes are made.""" + return self._DoCall("IncrementalOTA_VerifyBegin") + def IncrementalOTA_VerifyEnd(self): """Called at the end of the verification phase of incremental OTA installation; additional checks can be placed here to abort the script before any changes are made.""" return self._DoCall("IncrementalOTA_VerifyEnd") + def IncrementalOTA_InstallBegin(self): + """Called at the start of incremental OTA installation (after + verification is complete).""" + return self._DoCall("IncrementalOTA_InstallBegin") + def IncrementalOTA_InstallEnd(self): """Called at the end of incremental OTA installation; typically this is used to install the image for the device's baseband diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index d7b924b..8c31927 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -228,20 +228,6 @@ class EdifyGenerator(object): ",\0".join(['"' + i + '"' for i in sorted(links)]) + ");") self.script.append(self._WordWrap(cmd)) - def RetouchBinaries(self, file_list): - """Execute the retouch instructions in files listed.""" - cmd = ('retouch_binaries(' + - ', '.join(['"' + i[0] + '", "' + i[1] + '"' for i in file_list]) + - ');') - self.script.append(self._WordWrap(cmd)) - - def UndoRetouchBinaries(self, file_list): - """Undo the retouching (retouch to zero offset).""" - cmd = ('undo_retouch_binaries(' + - ', '.join(['"' + i[0] + '", "' + i[1] + '"' for i in file_list]) + - ');') - self.script.append(self._WordWrap(cmd)) - def AppendExtra(self, extra): """Append text verbatim to the output script.""" self.script.append(extra) diff --git a/tools/releasetools/img_from_target_files b/tools/releasetools/img_from_target_files index c5b9886..002e6e6 100755 --- a/tools/releasetools/img_from_target_files +++ b/tools/releasetools/img_from_target_files @@ -47,6 +47,7 @@ import zipfile if not hasattr(os, "SEEK_SET"): os.SEEK_SET = 0 +import build_image import common OPTIONS = common.OPTIONS @@ -64,27 +65,13 @@ def AddUserdata(output_zip): os.mkdir(user_dir) img = tempfile.NamedTemporaryFile() - build_command = [] + image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, + "data") fstab = OPTIONS.info_dict["fstab"] - if fstab and fstab["/data"].fs_type.startswith("ext"): - build_command = ["mkuserimg.sh"] - if "extfs_sparse_flag" in OPTIONS.info_dict: - build_command.append(OPTIONS.info_dict["extfs_sparse_flag"]) - build_command.extend([user_dir, img.name, - fstab["/data"].fs_type, "data"]) - if "userdata_size" in OPTIONS.info_dict: - build_command.append(str(OPTIONS.info_dict["userdata_size"])) - else: - build_command = ["mkyaffs2image", "-f"] - extra = OPTIONS.info_dict.get("mkyaffs2_extra_flags", None) - if extra: - build_command.extend(extra.split()) - build_command.append(user_dir) - build_command.append(img.name) - - p = common.Run(build_command); - p.communicate() - assert p.returncode == 0, "build userdata.img image failed" + if fstab: + image_props["fs_type" ] = fstab["/data"].fs_type + succ = build_image.BuildImage(user_dir, image_props, img.name) + assert succ, "build userdata.img image failed" common.CheckSize(img.name, "userdata.img", OPTIONS.info_dict) output_zip.write(img.name, "userdata.img") @@ -93,6 +80,38 @@ def AddUserdata(output_zip): os.rmdir(temp_dir) +def AddCache(output_zip): + """Create an empty cache image and store it in output_zip.""" + + image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, + "cache") + # The build system has to explicitly request for cache.img. + if "fs_type" not in image_props: + return + + print "creating cache.img..." + + # The name of the directory it is making an image out of matters to + # mkyaffs2image. So we create a temp dir, and within it we create an + # empty dir named "cache", and build the image from that. + temp_dir = tempfile.mkdtemp() + user_dir = os.path.join(temp_dir, "cache") + os.mkdir(user_dir) + img = tempfile.NamedTemporaryFile() + + fstab = OPTIONS.info_dict["fstab"] + if fstab: + image_props["fs_type" ] = fstab["/cache"].fs_type + succ = build_image.BuildImage(user_dir, image_props, img.name) + assert succ, "build cache.img image failed" + + common.CheckSize(img.name, "cache.img", OPTIONS.info_dict) + output_zip.write(img.name, "cache.img") + img.close() + os.rmdir(user_dir) + os.rmdir(temp_dir) + + def AddSystem(output_zip): """Turn the contents of SYSTEM into a system image and store it in output_zip.""" @@ -115,28 +134,14 @@ def AddSystem(output_zip): if (e.errno == errno.EEXIST): pass - build_command = [] + image_props = build_image.ImagePropFromGlobalDict(OPTIONS.info_dict, + "system") fstab = OPTIONS.info_dict["fstab"] - if fstab and fstab["/system"].fs_type.startswith("ext"): - - build_command = ["mkuserimg.sh"] - if "extfs_sparse_flag" in OPTIONS.info_dict: - build_command.append(OPTIONS.info_dict["extfs_sparse_flag"]) - build_command.extend([os.path.join(OPTIONS.input_tmp, "system"), img.name, - fstab["/system"].fs_type, "system"]) - if "system_size" in OPTIONS.info_dict: - build_command.append(str(OPTIONS.info_dict["system_size"])) - else: - build_command = ["mkyaffs2image", "-f"] - extra = OPTIONS.info_dict.get("mkyaffs2_extra_flags", None) - if extra: - build_command.extend(extra.split()) - build_command.append(os.path.join(OPTIONS.input_tmp, "system")) - build_command.append(img.name) - - p = common.Run(build_command) - p.communicate() - assert p.returncode == 0, "build system.img image failed" + if fstab: + image_props["fs_type" ] = fstab["/system"].fs_type + succ = build_image.BuildImage(os.path.join(OPTIONS.input_tmp, "system"), + image_props, img.name) + assert succ, "build system.img image failed" img.seek(os.SEEK_SET, 0) data = img.read() @@ -190,6 +195,7 @@ def main(argv): if not bootable_only: AddSystem(output_zip) AddUserdata(output_zip) + AddCache(output_zip) CopyInfo(output_zip) print "cleaning up..." diff --git a/tools/releasetools/ota_from_target_files b/tools/releasetools/ota_from_target_files index 1514ea7..7e855ce 100755 --- a/tools/releasetools/ota_from_target_files +++ b/tools/releasetools/ota_from_target_files @@ -48,9 +48,6 @@ Usage: ota_from_target_files [flags] input_target_files output_ota_package -e (--extra_script) <file> Insert the contents of file at the end of the update script. - - -a (--aslr_mode) <on|off> - Specify whether to turn on ASLR for the package (on by default). """ import sys @@ -260,15 +257,13 @@ def CopySystemFiles(input_zip, output_zip=None, substitute=None): """Copies files underneath system/ in the input zip to the output zip. Populates the Item class with their metadata, and returns a - list of symlinks as well as a list of files that will be retouched. - output_zip may be None, in which case the copy is skipped (but the - other side effects still happen). substitute is an optional dict - of {output filename: contents} to be output instead of certain input - files. + list of symlinks. output_zip may be None, in which case the copy is + skipped (but the other side effects still happen). substitute is an + optional dict of {output filename: contents} to be output instead of + certain input files. """ symlinks = [] - retouch_files = [] for info in input_zip.infolist(): if info.filename.startswith("SYSTEM/"): @@ -286,9 +281,6 @@ def CopySystemFiles(input_zip, output_zip=None, data = substitute[fn] else: data = input_zip.read(info.filename) - if info.filename.startswith("SYSTEM/lib/") and IsRegular(info): - retouch_files.append(("/system/" + basefilename, - common.sha1(data).hexdigest())) output_zip.writestr(info2, data) if fn.endswith("/"): Item.Get(fn[:-1], dir=True) @@ -296,7 +288,7 @@ def CopySystemFiles(input_zip, output_zip=None, Item.Get(fn, dir=False) symlinks.sort() - return (symlinks, retouch_files) + return symlinks def SignOutput(temp_zip_name, output_zip_name): @@ -382,6 +374,7 @@ def WriteFullOTAPackage(input_zip, output_zip): AppendAssertions(script, input_zip) device_specific.FullOTA_Assertions() + device_specific.FullOTA_InstallBegin() script.ShowProgress(0.5, 0) @@ -393,12 +386,8 @@ def WriteFullOTAPackage(input_zip, output_zip): script.UnpackPackageDir("recovery", "/system") script.UnpackPackageDir("system", "/system") - (symlinks, retouch_files) = CopySystemFiles(input_zip, output_zip) + symlinks = CopySystemFiles(input_zip, output_zip) script.MakeSymlinks(symlinks) - if OPTIONS.aslr_mode: - script.RetouchBinaries(retouch_files) - else: - script.UndoRetouchBinaries(retouch_files) boot_img = common.GetBootableImage("boot.img", "boot.img", OPTIONS.input_tmp, "BOOT") @@ -439,17 +428,13 @@ def LoadSystemFiles(z): """Load all the files from SYSTEM/... in a given target-files ZipFile, and return a dict of {filename: File object}.""" out = {} - retouch_files = [] for info in z.infolist(): if info.filename.startswith("SYSTEM/") and not IsSymlink(info): basefilename = info.filename[7:] fn = "system/" + basefilename data = z.read(info.filename) out[fn] = common.File(fn, data) - if info.filename.startswith("SYSTEM/lib/") and IsRegular(info): - retouch_files.append(("/system/" + basefilename, - out[fn].sha1)) - return (out, retouch_files) + return out def GetBuildProp(property, z): @@ -488,9 +473,9 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): info_dict=OPTIONS.info_dict) print "Loading target..." - (target_data, target_retouch_files) = LoadSystemFiles(target_zip) + target_data = LoadSystemFiles(target_zip) print "Loading source..." - (source_data, source_retouch_files) = LoadSystemFiles(source_zip) + source_data = LoadSystemFiles(source_zip) verbatim_targets = [] patch_list = [] @@ -559,6 +544,8 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): script.Print("Verifying current system...") + device_specific.IncrementalOTA_VerifyBegin() + script.ShowProgress(0.1, 0) total_verify_size = float(sum([i[2].size for i in patch_list]) + 1) if updating_boot: @@ -594,6 +581,8 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): script.Comment("---- start making changes here ----") + device_specific.IncrementalOTA_InstallBegin() + if OPTIONS.wipe_user_data: script.Print("Erasing user data...") script.FormatPartition("/data") @@ -660,7 +649,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): script.ShowProgress(0.1, 10) - (target_symlinks, target_retouch_dummies) = CopySystemFiles(target_zip, None) + target_symlinks = CopySystemFiles(target_zip, None) target_symlinks_d = dict([(i[1], i[0]) for i in target_symlinks]) temp_script = script.MakeTemporary() @@ -669,7 +658,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): # Note that this call will mess up the tree of Items, so make sure # we're done with it. - (source_symlinks, source_retouch_dummies) = CopySystemFiles(source_zip, None) + source_symlinks = CopySystemFiles(source_zip, None) source_symlinks_d = dict([(i[1], i[0]) for i in source_symlinks]) # Delete all the symlinks in source that aren't in target. This @@ -703,10 +692,6 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip): to_create.append((dest, link)) script.DeleteFiles([i[1] for i in to_create]) script.MakeSymlinks(to_create) - if OPTIONS.aslr_mode: - script.RetouchBinaries(target_retouch_files) - else: - script.UndoRetouchBinaries(target_retouch_files) # Now that the symlinks are created, we can set all the # permissions. diff --git a/tools/zipalign/Android.mk b/tools/zipalign/Android.mk index 9763bd2..8ed60df 100644 --- a/tools/zipalign/Android.mk +++ b/tools/zipalign/Android.mk @@ -15,6 +15,7 @@ LOCAL_SRC_FILES := \ LOCAL_C_INCLUDES += external/zlib LOCAL_STATIC_LIBRARIES := \ + libandroidfw \ libutils \ libcutils diff --git a/tools/zipalign/ZipEntry.cpp b/tools/zipalign/ZipEntry.cpp index bed0333..d4d366d 100644 --- a/tools/zipalign/ZipEntry.cpp +++ b/tools/zipalign/ZipEntry.cpp @@ -42,12 +42,12 @@ status_t ZipEntry::initFromCDE(FILE* fp) long posn; bool hasDD; - //LOGV("initFromCDE ---\n"); + //ALOGV("initFromCDE ---\n"); /* read the CDE */ result = mCDE.read(fp); if (result != NO_ERROR) { - LOGD("mCDE.read failed\n"); + ALOGD("mCDE.read failed\n"); return result; } @@ -56,14 +56,14 @@ status_t ZipEntry::initFromCDE(FILE* fp) /* using the info in the CDE, go load up the LFH */ posn = ftell(fp); if (fseek(fp, mCDE.mLocalHeaderRelOffset, SEEK_SET) != 0) { - LOGD("local header seek failed (%ld)\n", + ALOGD("local header seek failed (%ld)\n", mCDE.mLocalHeaderRelOffset); return UNKNOWN_ERROR; } result = mLFH.read(fp); if (result != NO_ERROR) { - LOGD("mLFH.read failed\n"); + ALOGD("mLFH.read failed\n"); return result; } @@ -81,7 +81,7 @@ status_t ZipEntry::initFromCDE(FILE* fp) hasDD = (mLFH.mGPBitFlag & kUsesDataDescr) != 0; if (hasDD) { // do something clever - //LOGD("+++ has data descriptor\n"); + //ALOGD("+++ has data descriptor\n"); } /* @@ -90,7 +90,7 @@ status_t ZipEntry::initFromCDE(FILE* fp) * prefer the CDE values.) */ if (!hasDD && !compareHeaders()) { - LOGW("WARNING: header mismatch\n"); + ALOGW("WARNING: header mismatch\n"); // keep going? } @@ -200,7 +200,7 @@ status_t ZipEntry::addPadding(int padding) if (padding <= 0) return INVALID_OPERATION; - //LOGI("HEY: adding %d pad bytes to existing %d in %s\n", + //ALOGI("HEY: adding %d pad bytes to existing %d in %s\n", // padding, mLFH.mExtraFieldLength, mCDE.mFileName); if (mLFH.mExtraFieldLength > 0) { @@ -280,50 +280,50 @@ void ZipEntry::setDataInfo(long uncompLen, long compLen, unsigned long crc32, bool ZipEntry::compareHeaders(void) const { if (mCDE.mVersionToExtract != mLFH.mVersionToExtract) { - LOGV("cmp: VersionToExtract\n"); + ALOGV("cmp: VersionToExtract\n"); return false; } if (mCDE.mGPBitFlag != mLFH.mGPBitFlag) { - LOGV("cmp: GPBitFlag\n"); + ALOGV("cmp: GPBitFlag\n"); return false; } if (mCDE.mCompressionMethod != mLFH.mCompressionMethod) { - LOGV("cmp: CompressionMethod\n"); + ALOGV("cmp: CompressionMethod\n"); return false; } if (mCDE.mLastModFileTime != mLFH.mLastModFileTime) { - LOGV("cmp: LastModFileTime\n"); + ALOGV("cmp: LastModFileTime\n"); return false; } if (mCDE.mLastModFileDate != mLFH.mLastModFileDate) { - LOGV("cmp: LastModFileDate\n"); + ALOGV("cmp: LastModFileDate\n"); return false; } if (mCDE.mCRC32 != mLFH.mCRC32) { - LOGV("cmp: CRC32\n"); + ALOGV("cmp: CRC32\n"); return false; } if (mCDE.mCompressedSize != mLFH.mCompressedSize) { - LOGV("cmp: CompressedSize\n"); + ALOGV("cmp: CompressedSize\n"); return false; } if (mCDE.mUncompressedSize != mLFH.mUncompressedSize) { - LOGV("cmp: UncompressedSize\n"); + ALOGV("cmp: UncompressedSize\n"); return false; } if (mCDE.mFileNameLength != mLFH.mFileNameLength) { - LOGV("cmp: FileNameLength\n"); + ALOGV("cmp: FileNameLength\n"); return false; } #if 0 // this seems to be used for padding, not real data if (mCDE.mExtraFieldLength != mLFH.mExtraFieldLength) { - LOGV("cmp: ExtraFieldLength\n"); + ALOGV("cmp: ExtraFieldLength\n"); return false; } #endif if (mCDE.mFileName != NULL) { if (strcmp((char*) mCDE.mFileName, (char*) mLFH.mFileName) != 0) { - LOGV("cmp: FileName\n"); + ALOGV("cmp: FileName\n"); return false; } } @@ -413,7 +413,7 @@ status_t ZipEntry::LocalFileHeader::read(FILE* fp) } if (ZipEntry::getLongLE(&buf[0x00]) != kSignature) { - LOGD("whoops: didn't find expected signature\n"); + ALOGD("whoops: didn't find expected signature\n"); result = UNKNOWN_ERROR; goto bail; } @@ -506,17 +506,17 @@ status_t ZipEntry::LocalFileHeader::write(FILE* fp) */ void ZipEntry::LocalFileHeader::dump(void) const { - LOGD(" LocalFileHeader contents:\n"); - LOGD(" versToExt=%u gpBits=0x%04x compression=%u\n", + ALOGD(" LocalFileHeader contents:\n"); + ALOGD(" versToExt=%u gpBits=0x%04x compression=%u\n", mVersionToExtract, mGPBitFlag, mCompressionMethod); - LOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n", + ALOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n", mLastModFileTime, mLastModFileDate, mCRC32); - LOGD(" compressedSize=%lu uncompressedSize=%lu\n", + ALOGD(" compressedSize=%lu uncompressedSize=%lu\n", mCompressedSize, mUncompressedSize); - LOGD(" filenameLen=%u extraLen=%u\n", + ALOGD(" filenameLen=%u extraLen=%u\n", mFileNameLength, mExtraFieldLength); if (mFileName != NULL) - LOGD(" filename: '%s'\n", mFileName); + ALOGD(" filename: '%s'\n", mFileName); } @@ -549,7 +549,7 @@ status_t ZipEntry::CentralDirEntry::read(FILE* fp) } if (ZipEntry::getLongLE(&buf[0x00]) != kSignature) { - LOGD("Whoops: didn't find expected signature\n"); + ALOGD("Whoops: didn't find expected signature\n"); result = UNKNOWN_ERROR; goto bail; } @@ -675,22 +675,22 @@ status_t ZipEntry::CentralDirEntry::write(FILE* fp) */ void ZipEntry::CentralDirEntry::dump(void) const { - LOGD(" CentralDirEntry contents:\n"); - LOGD(" versMadeBy=%u versToExt=%u gpBits=0x%04x compression=%u\n", + ALOGD(" CentralDirEntry contents:\n"); + ALOGD(" versMadeBy=%u versToExt=%u gpBits=0x%04x compression=%u\n", mVersionMadeBy, mVersionToExtract, mGPBitFlag, mCompressionMethod); - LOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n", + ALOGD(" modTime=0x%04x modDate=0x%04x crc32=0x%08lx\n", mLastModFileTime, mLastModFileDate, mCRC32); - LOGD(" compressedSize=%lu uncompressedSize=%lu\n", + ALOGD(" compressedSize=%lu uncompressedSize=%lu\n", mCompressedSize, mUncompressedSize); - LOGD(" filenameLen=%u extraLen=%u commentLen=%u\n", + ALOGD(" filenameLen=%u extraLen=%u commentLen=%u\n", mFileNameLength, mExtraFieldLength, mFileCommentLength); - LOGD(" diskNumStart=%u intAttr=0x%04x extAttr=0x%08lx relOffset=%lu\n", + ALOGD(" diskNumStart=%u intAttr=0x%04x extAttr=0x%08lx relOffset=%lu\n", mDiskNumberStart, mInternalAttrs, mExternalAttrs, mLocalHeaderRelOffset); if (mFileName != NULL) - LOGD(" filename: '%s'\n", mFileName); + ALOGD(" filename: '%s'\n", mFileName); if (mFileComment != NULL) - LOGD(" comment: '%s'\n", mFileComment); + ALOGD(" comment: '%s'\n", mFileComment); } diff --git a/tools/zipalign/ZipFile.cpp b/tools/zipalign/ZipFile.cpp index 62c9383..8057068 100644 --- a/tools/zipalign/ZipFile.cpp +++ b/tools/zipalign/ZipFile.cpp @@ -20,7 +20,7 @@ #define LOG_TAG "zip" -#include <utils/ZipUtils.h> +#include <androidfw/ZipUtils.h> #include <utils/Log.h> #include "ZipFile.h" @@ -78,7 +78,7 @@ status_t ZipFile::open(const char* zipFileName, int flags) newArchive = (access(zipFileName, F_OK) != 0); if (!(flags & kOpenCreate) && newArchive) { /* not creating, must already exist */ - LOGD("File %s does not exist", zipFileName); + ALOGD("File %s does not exist", zipFileName); return NAME_NOT_FOUND; } } @@ -96,7 +96,7 @@ status_t ZipFile::open(const char* zipFileName, int flags) mZipFp = fopen(zipFileName, openflags); if (mZipFp == NULL) { int err = errno; - LOGD("fopen failed: %d\n", err); + ALOGD("fopen failed: %d\n", err); return errnoToStatus(err); } @@ -215,14 +215,14 @@ status_t ZipFile::readCentralDir(void) /* too small to be a ZIP archive? */ if (fileLength < EndOfCentralDir::kEOCDLen) { - LOGD("Length is %ld -- too small\n", (long)fileLength); + ALOGD("Length is %ld -- too small\n", (long)fileLength); result = INVALID_OPERATION; goto bail; } buf = new unsigned char[EndOfCentralDir::kMaxEOCDSearch]; if (buf == NULL) { - LOGD("Failure allocating %d bytes for EOCD search", + ALOGD("Failure allocating %d bytes for EOCD search", EndOfCentralDir::kMaxEOCDSearch); result = NO_MEMORY; goto bail; @@ -236,14 +236,14 @@ status_t ZipFile::readCentralDir(void) readAmount = (long) fileLength; } if (fseek(mZipFp, seekStart, SEEK_SET) != 0) { - LOGD("Failure seeking to end of zip at %ld", (long) seekStart); + ALOGD("Failure seeking to end of zip at %ld", (long) seekStart); result = UNKNOWN_ERROR; goto bail; } /* read the last part of the file into the buffer */ if (fread(buf, 1, readAmount, mZipFp) != (size_t) readAmount) { - LOGD("short file? wanted %ld\n", readAmount); + ALOGD("short file? wanted %ld\n", readAmount); result = UNKNOWN_ERROR; goto bail; } @@ -253,12 +253,12 @@ status_t ZipFile::readCentralDir(void) if (buf[i] == 0x50 && ZipEntry::getLongLE(&buf[i]) == EndOfCentralDir::kSignature) { - LOGV("+++ Found EOCD at buf+%d\n", i); + ALOGV("+++ Found EOCD at buf+%d\n", i); break; } } if (i < 0) { - LOGD("EOCD not found, not Zip\n"); + ALOGD("EOCD not found, not Zip\n"); result = INVALID_OPERATION; goto bail; } @@ -266,7 +266,7 @@ status_t ZipFile::readCentralDir(void) /* extract eocd values */ result = mEOCD.readBuf(buf + i, readAmount - i); if (result != NO_ERROR) { - LOGD("Failure reading %ld bytes of EOCD values", readAmount - i); + ALOGD("Failure reading %ld bytes of EOCD values", readAmount - i); goto bail; } //mEOCD.dump(); @@ -274,7 +274,7 @@ status_t ZipFile::readCentralDir(void) if (mEOCD.mDiskNumber != 0 || mEOCD.mDiskWithCentralDir != 0 || mEOCD.mNumEntries != mEOCD.mTotalNumEntries) { - LOGD("Archive spanning not supported\n"); + ALOGD("Archive spanning not supported\n"); result = INVALID_OPERATION; goto bail; } @@ -294,7 +294,7 @@ status_t ZipFile::readCentralDir(void) * we're hoping to preserve. */ if (fseek(mZipFp, mEOCD.mCentralDirOffset, SEEK_SET) != 0) { - LOGD("Failure seeking to central dir offset %ld\n", + ALOGD("Failure seeking to central dir offset %ld\n", mEOCD.mCentralDirOffset); result = UNKNOWN_ERROR; goto bail; @@ -303,14 +303,14 @@ status_t ZipFile::readCentralDir(void) /* * Loop through and read the central dir entries. */ - LOGV("Scanning %d entries...\n", mEOCD.mTotalNumEntries); + ALOGV("Scanning %d entries...\n", mEOCD.mTotalNumEntries); int entry; for (entry = 0; entry < mEOCD.mTotalNumEntries; entry++) { ZipEntry* pEntry = new ZipEntry; result = pEntry->initFromCDE(mZipFp); if (result != NO_ERROR) { - LOGD("initFromCDE failed\n"); + ALOGD("initFromCDE failed\n"); delete pEntry; goto bail; } @@ -325,16 +325,16 @@ status_t ZipFile::readCentralDir(void) { unsigned char checkBuf[4]; if (fread(checkBuf, 1, 4, mZipFp) != 4) { - LOGD("EOCD check read failed\n"); + ALOGD("EOCD check read failed\n"); result = INVALID_OPERATION; goto bail; } if (ZipEntry::getLongLE(checkBuf) != EndOfCentralDir::kSignature) { - LOGD("EOCD read check failed\n"); + ALOGD("EOCD read check failed\n"); result = UNKNOWN_ERROR; goto bail; } - LOGV("+++ EOCD read check passed\n"); + ALOGV("+++ EOCD read check passed\n"); } bail: @@ -416,7 +416,7 @@ status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size, bool failed = false; result = compressFpToFp(mZipFp, inputFp, data, size, &crc); if (result != NO_ERROR) { - LOGD("compression failed, storing\n"); + ALOGD("compression failed, storing\n"); failed = true; } else { /* @@ -427,7 +427,7 @@ status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size, long src = inputFp ? ftell(inputFp) : size; long dst = ftell(mZipFp) - startPosn; if (dst + (dst / 10) > src) { - LOGD("insufficient compression (src=%ld dst=%ld), storing\n", + ALOGD("insufficient compression (src=%ld dst=%ld), storing\n", src, dst); failed = true; } @@ -449,7 +449,7 @@ status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size, } if (result != NO_ERROR) { // don't need to truncate; happens in CDE rewrite - LOGD("failed copying data in\n"); + ALOGD("failed copying data in\n"); goto bail; } } @@ -468,14 +468,14 @@ status_t ZipFile::addCommon(const char* fileName, const void* data, size_t size, scanResult = ZipUtils::examineGzip(inputFp, &method, &uncompressedLen, &compressedLen, &crc); if (!scanResult || method != ZipEntry::kCompressDeflated) { - LOGD("this isn't a deflated gzip file?"); + ALOGD("this isn't a deflated gzip file?"); result = UNKNOWN_ERROR; goto bail; } result = copyPartialFpToFp(mZipFp, inputFp, compressedLen, NULL); if (result != NO_ERROR) { - LOGD("failed copying gzip data in\n"); + ALOGD("failed copying gzip data in\n"); goto bail; } } else { @@ -603,7 +603,7 @@ status_t ZipFile::add(const ZipFile* pSourceZip, const ZipEntry* pSourceEntry, if (copyPartialFpToFp(mZipFp, pSourceZip->mZipFp, copyLen, NULL) != NO_ERROR) { - LOGW("copy of '%s' failed\n", pEntry->mCDE.mFileName); + ALOGW("copy of '%s' failed\n", pEntry->mCDE.mFileName); result = UNKNOWN_ERROR; goto bail; } @@ -660,7 +660,7 @@ status_t ZipFile::copyFpToFp(FILE* dstFp, FILE* srcFp, unsigned long* pCRC32) *pCRC32 = crc32(*pCRC32, tmpBuf, count); if (fwrite(tmpBuf, 1, count, dstFp) != count) { - LOGD("fwrite %d bytes failed\n", (int) count); + ALOGD("fwrite %d bytes failed\n", (int) count); return UNKNOWN_ERROR; } } @@ -682,7 +682,7 @@ status_t ZipFile::copyDataToFp(FILE* dstFp, if (size > 0) { *pCRC32 = crc32(*pCRC32, (const unsigned char*)data, size); if (fwrite(data, 1, size, dstFp) != size) { - LOGD("fwrite %d bytes failed\n", (int) size); + ALOGD("fwrite %d bytes failed\n", (int) size); return UNKNOWN_ERROR; } } @@ -716,7 +716,7 @@ status_t ZipFile::copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length, count = fread(tmpBuf, 1, readSize, srcFp); if ((long) count != readSize) { // error or unexpected EOF - LOGD("fread %d bytes failed\n", (int) readSize); + ALOGD("fread %d bytes failed\n", (int) readSize); return UNKNOWN_ERROR; } @@ -724,7 +724,7 @@ status_t ZipFile::copyPartialFpToFp(FILE* dstFp, FILE* srcFp, long length, *pCRC32 = crc32(*pCRC32, tmpBuf, count); if (fwrite(tmpBuf, 1, count, dstFp) != count) { - LOGD("fwrite %d bytes failed\n", (int) count); + ALOGD("fwrite %d bytes failed\n", (int) count); return UNKNOWN_ERROR; } @@ -780,10 +780,10 @@ status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp, if (zerr != Z_OK) { result = UNKNOWN_ERROR; if (zerr == Z_VERSION_ERROR) { - LOGE("Installed zlib is not compatible with linked version (%s)\n", + ALOGE("Installed zlib is not compatible with linked version (%s)\n", ZLIB_VERSION); } else { - LOGD("Call to deflateInit2 failed (zerr=%d)\n", zerr); + ALOGD("Call to deflateInit2 failed (zerr=%d)\n", zerr); } goto bail; } @@ -799,7 +799,7 @@ status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp, /* only read if the input buffer is empty */ if (zstream.avail_in == 0 && !atEof) { - LOGV("+++ reading %d bytes\n", (int)kBufSize); + ALOGV("+++ reading %d bytes\n", (int)kBufSize); if (data) { getSize = size > kBufSize ? kBufSize : size; memcpy(inBuf, data, getSize); @@ -808,12 +808,12 @@ status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp, } else { getSize = fread(inBuf, 1, kBufSize, srcFp); if (ferror(srcFp)) { - LOGD("deflate read failed (errno=%d)\n", errno); + ALOGD("deflate read failed (errno=%d)\n", errno); goto z_bail; } } if (getSize < kBufSize) { - LOGV("+++ got %d bytes, EOF reached\n", + ALOGV("+++ got %d bytes, EOF reached\n", (int)getSize); atEof = true; } @@ -831,7 +831,7 @@ status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp, zerr = deflate(&zstream, flush); if (zerr != Z_OK && zerr != Z_STREAM_END) { - LOGD("zlib deflate call failed (zerr=%d)\n", zerr); + ALOGD("zlib deflate call failed (zerr=%d)\n", zerr); result = UNKNOWN_ERROR; goto z_bail; } @@ -840,11 +840,11 @@ status_t ZipFile::compressFpToFp(FILE* dstFp, FILE* srcFp, if (zstream.avail_out == 0 || (zerr == Z_STREAM_END && zstream.avail_out != (uInt) kBufSize)) { - LOGV("+++ writing %d bytes\n", (int) (zstream.next_out - outBuf)); + ALOGV("+++ writing %d bytes\n", (int) (zstream.next_out - outBuf)); if (fwrite(outBuf, 1, zstream.next_out - outBuf, dstFp) != (size_t)(zstream.next_out - outBuf)) { - LOGD("write %d failed in deflate\n", + ALOGD("write %d failed in deflate\n", (int) (zstream.next_out - outBuf)); goto z_bail; } @@ -931,7 +931,7 @@ status_t ZipFile::flush(void) * of wasted space at the end of the file. Remove it now. */ if (ftruncate(fileno(mZipFp), ftell(mZipFp)) != 0) { - LOGW("ftruncate failed %ld: %s\n", ftell(mZipFp), strerror(errno)); + ALOGW("ftruncate failed %ld: %s\n", ftell(mZipFp), strerror(errno)); // not fatal } @@ -1019,7 +1019,7 @@ status_t ZipFile::crunchArchive(void) pEntry->getLFHOffset(), span); if (result != NO_ERROR) { /* this is why you use a temp file */ - LOGE("error during crunch - archive is toast\n"); + ALOGE("error during crunch - archive is toast\n"); return result; } @@ -1061,23 +1061,23 @@ status_t ZipFile::filemove(FILE* fp, off_t dst, off_t src, size_t n) getSize = n; if (fseek(fp, (long) src, SEEK_SET) != 0) { - LOGD("filemove src seek %ld failed\n", (long) src); + ALOGD("filemove src seek %ld failed\n", (long) src); return UNKNOWN_ERROR; } if (fread(readBuf, 1, getSize, fp) != getSize) { - LOGD("filemove read %ld off=%ld failed\n", + ALOGD("filemove read %ld off=%ld failed\n", (long) getSize, (long) src); return UNKNOWN_ERROR; } if (fseek(fp, (long) dst, SEEK_SET) != 0) { - LOGD("filemove dst seek %ld failed\n", (long) dst); + ALOGD("filemove dst seek %ld failed\n", (long) dst); return UNKNOWN_ERROR; } if (fwrite(readBuf, 1, getSize, fp) != getSize) { - LOGD("filemove write %ld off=%ld failed\n", + ALOGD("filemove write %ld off=%ld failed\n", (long) getSize, (long) dst); return UNKNOWN_ERROR; } @@ -1104,7 +1104,7 @@ time_t ZipFile::getModTime(int fd) struct stat sb; if (fstat(fd, &sb) < 0) { - LOGD("HEY: fstat on fd %d failed\n", fd); + ALOGD("HEY: fstat on fd %d failed\n", fd); return (time_t) -1; } @@ -1129,7 +1129,7 @@ int ZipFile::getZipFd(void) const int fd; fd = dup(fileno(mZipFp)); if (fd < 0) { - LOGD("didn't work, errno=%d\n", errno); + ALOGD("didn't work, errno=%d\n", errno); } return fd; @@ -1224,7 +1224,7 @@ status_t ZipFile::EndOfCentralDir::readBuf(const unsigned char* buf, int len) if (len < kEOCDLen) { /* looks like ZIP file got truncated */ - LOGD(" Zip EOCD: expected >= %d bytes, found %d\n", + ALOGD(" Zip EOCD: expected >= %d bytes, found %d\n", kEOCDLen, len); return INVALID_OPERATION; } @@ -1245,7 +1245,7 @@ status_t ZipFile::EndOfCentralDir::readBuf(const unsigned char* buf, int len) if (mCommentLen > 0) { if (kEOCDLen + mCommentLen > len) { - LOGD("EOCD(%d) + comment(%d) exceeds len (%d)\n", + ALOGD("EOCD(%d) + comment(%d) exceeds len (%d)\n", kEOCDLen, mCommentLen, len); return UNKNOWN_ERROR; } @@ -1288,10 +1288,10 @@ status_t ZipFile::EndOfCentralDir::write(FILE* fp) */ void ZipFile::EndOfCentralDir::dump(void) const { - LOGD(" EndOfCentralDir contents:\n"); - LOGD(" diskNum=%u diskWCD=%u numEnt=%u totalNumEnt=%u\n", + ALOGD(" EndOfCentralDir contents:\n"); + ALOGD(" diskNum=%u diskWCD=%u numEnt=%u totalNumEnt=%u\n", mDiskNumber, mDiskWithCentralDir, mNumEntries, mTotalNumEntries); - LOGD(" centDirSize=%lu centDirOff=%lu commentLen=%u\n", + ALOGD(" centDirSize=%lu centDirOff=%lu commentLen=%u\n", mCentralDirSize, mCentralDirOffset, mCommentLen); } diff --git a/tools/zipalign/ZipFile.h b/tools/zipalign/ZipFile.h index dbbd072..7877550 100644 --- a/tools/zipalign/ZipFile.h +++ b/tools/zipalign/ZipFile.h @@ -57,7 +57,7 @@ public: /* * Open a new or existing archive. */ - typedef enum { + enum { kOpenReadOnly = 0x01, kOpenReadWrite = 0x02, kOpenCreate = 0x04, // create if it doesn't exist |