diff options
79 files changed, 1340 insertions, 783 deletions
diff --git a/CleanSpec.mk b/CleanSpec.mk index 30ebdea..d4024cf 100644 --- a/CleanSpec.mk +++ b/CleanSpec.mk @@ -168,19 +168,22 @@ $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) -# So... funny story. Recall when I mentioned above the -# "JB MR2" thing? I didn't mean that. In fact, while I was -# writing JB MR, my head was thinking 4.2, and things got -# cross-wired as they are wont to do, and we ended up with -# JB MR2, which didn't actually exist. -# -# Well, didn't exist then. -# -# Now it does. Say hi, JB MR2! +# And on to KLP... $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) +# KLP now based off API 18. +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/build.prop) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/APPS/*) + +# Clean up around the /system/app -> /system/priv-app migration +$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/app/*) + +# Clean up old location of generated Java files from aidl +$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/framework_intermediates/src) + # ************************************************ # NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST # ************************************************ diff --git a/buildspec.mk.default b/buildspec.mk.default index 2f84016..d14208e 100644 --- a/buildspec.mk.default +++ b/buildspec.mk.default @@ -93,15 +93,15 @@ ifndef NO_FALLBACK_FONT #NO_FALLBACK_FONT:=true endif -# To enable instrumentation in webcore based apps like gmail and -# the browser, define WEBCORE_INSTRUMENTATION:=true -ifndef WEBCORE_INSTRUMENTATION -#WEBCORE_INSTRUMENTATION:=true -endif - -# To disable SVG in webcore define ENABLE_SVG:=false -ifndef ENABLE_SVG -#ENABLE_SVG:=false +# OVERRIDE_RUNTIMES allows you to locally override PRODUCT_RUNTIMES. +# +# To only build ART, use "runtime_libart_default" +# To use Dalvik but also include ART, use "runtime_libdvm_default runtime_libart" +# To use ART but also include Dalvik, use "runtime_libart_default runtime_libdvm" +ifndef OVERRIDE_RUNTIMES +#OVERRIDE_RUNTIMES:=runtime_libart_default +#OVERRIDE_RUNTIMES:=runtime_libdvm_default runtime_libart +#OVERRIDE_RUNTIMES:=runtime_libart_default runtime_libdvm endif # when the build system changes such that this file must be updated, this diff --git a/core/Makefile b/core/Makefile index c5509c6..41fcc6c 100644 --- a/core/Makefile +++ b/core/Makefile @@ -96,10 +96,11 @@ endif # Both of these tags will be removed and replaced with "release-keys" # when the target-files is signed in a post-build step. ifeq ($(DEFAULT_SYSTEM_DEV_CERTIFICATE),build/target/product/security/testkey) -BUILD_VERSION_TAGS += test-keys +BUILD_KEYS := test-keys else -BUILD_VERSION_TAGS += dev-keys +BUILD_KEYS := dev-keys endif +BUILD_VERSION_TAGS += $(BUILD_KEYS) BUILD_VERSION_TAGS := $(subst $(space),$(comma),$(sort $(BUILD_VERSION_TAGS))) # A human-readable string that descibes this build in detail. @@ -121,9 +122,9 @@ ifeq ($(TARGET_BUILD_VARIANT),user) # Dev. branches should have DISPLAY_BUILD_NUMBER set ifeq "true" "$(DISPLAY_BUILD_NUMBER)" - BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER) + BUILD_DISPLAY_ID := $(BUILD_ID).$(BUILD_NUMBER) $(BUILD_KEYS) else - BUILD_DISPLAY_ID := $(BUILD_ID) + BUILD_DISPLAY_ID := $(BUILD_ID) $(BUILD_KEYS) endif else # Non-user builds should show detailed build information @@ -384,6 +385,10 @@ $(INSTALLED_RAMDISK_TARGET): $(MKBOOTFS) $(INTERNAL_RAMDISK_FILES) | $(MINIGZIP) $(call pretty,"Target ram disk: $@") $(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $@ +.PHONY: ramdisk-nodeps +ramdisk-nodeps: $(MKBOOTFS) | $(MINIGZIP) + @echo "make $@: ignoring dependencies" + $(hide) $(MKBOOTFS) $(TARGET_ROOT_OUT) | $(MINIGZIP) > $(INSTALLED_RAMDISK_TARGET) ifneq ($(strip $(TARGET_NO_KERNEL)),true) @@ -421,12 +426,24 @@ $(INSTALLED_BOOTIMAGE_TARGET): $(MKEXT2IMG) $(INTERNAL_BOOTIMAGE_FILES) $(call pretty,"Target boot image: $@") $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $@ +.PHONY: bootimage-nodeps +bootimage-nodeps: $(MKEXT2IMG) + @echo "make $@: ignoring dependencies" + $(hide) $(MKEXT2BOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) + else # TARGET_BOOTIMAGE_USE_EXT2 != true $(INSTALLED_BOOTIMAGE_TARGET): $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_FILES) $(call pretty,"Target boot image: $@") $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $@ $(hide) $(call assert-max-image-size,$@,$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw) + +.PHONY: bootimage-nodeps +bootimage-nodeps: $(MKBOOTIMG) + @echo "make $@: ignoring dependencies" + $(hide) $(MKBOOTIMG) $(INTERNAL_BOOTIMAGE_ARGS) $(BOARD_MKBOOTIMG_ARGS) --output $(INSTALLED_BOOTIMAGE_TARGET) + $(hide) $(call assert-max-image-size,$(INSTALLED_BOOTIMAGE_TARGET),$(BOARD_BOOTIMAGE_PARTITION_SIZE),raw) + endif # TARGET_BOOTIMAGE_USE_EXT2 else # TARGET_NO_KERNEL @@ -875,6 +892,11 @@ endif ####### ## platform.zip: system, plus other files to be used in PDK fusion build, ## in a zip file +## +## PDK_PLATFORM_ZIP_PRODUCT_BINARIES is used to store specified files to platform.zip. +## The variable will be typically set from BoardConfig.mk. +## Files under out dir will be rejected to prevent possible conflicts with other rules. +PDK_PLATFORM_ZIP_PRODUCT_BINARIES := $(filter-out $(OUT_DIR)/%,$(PDK_PLATFORM_ZIP_PRODUCT_BINARIES)) INSTALLED_PLATFORM_ZIP := $(PRODUCT_OUT)/platform.zip $(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_SYSTEMIMAGE_FILES) $(call pretty,"Platform zip package: $(INSTALLED_PLATFORM_ZIP)") @@ -886,7 +908,9 @@ $(INSTALLED_PLATFORM_ZIP) : $(INTERNAL_SYSTEMIMAGE_FILES) ifeq (true,$(PLATFORM_ZIP_ADD_JAVA)) $(hide) cd $(OUT_DIR) && zip -qry $(patsubst $(OUT_DIR)/%,%,$@) $(PDK_PLATFORM_JAVA_ZIP_CONTENTS) endif - +ifneq ($(PDK_PLATFORM_ZIP_PRODUCT_BINARIES),) + $(hide) zip -qry $@ $(PDK_PLATFORM_ZIP_PRODUCT_BINARIES) +endif .PHONY: platform platform: $(INSTALLED_PLATFORM_ZIP) @@ -1587,16 +1611,18 @@ $(INTERNAL_FINDBUGS_XML_TARGET): $(ALL_FINDBUGS_FILES) $(INTERNAL_FINDBUGS_HTML_TARGET): $(INTERNAL_FINDBUGS_XML_TARGET) @echo ConvertXmlToText: $@ $(hide) prebuilt/common/findbugs/bin/convertXmlToText -html:fancy.xsl \ - $(INTERNAL_FINDBUGS_XML_TARGET) > $@ + $(INTERNAL_FINDBUGS_XML_TARGET) > $@ # ----------------------------------------------------------------- # Findbugs # ----------------------------------------------------------------- # These are some additional build tasks that need to be run. +ifneq ($(dont_bother),true) include $(sort $(wildcard $(BUILD_SYSTEM)/tasks/*.mk)) -include $(sort $(wildcard vendor/*/build/tasks/*.mk)) -include $(sort $(wildcard device/*/build/tasks/*.mk)) +endif # ----------------------------------------------------------------- # Create SDK repository packages. Must be done after tasks/* since diff --git a/core/base_rules.mk b/core/base_rules.mk index f6497da..5d27fa8 100644 --- a/core/base_rules.mk +++ b/core/base_rules.mk @@ -98,23 +98,27 @@ ifneq ($(words $(LOCAL_MODULE_CLASS)),1) endif ifneq (true,$(LOCAL_UNINSTALLABLE_MODULE)) -ifdef LOCAL_IS_HOST_MODULE - partition_tag := -else -ifeq (true,$(LOCAL_PROPRIETARY_MODULE)) - partition_tag := _VENDOR -else - # The definition of should-install-to-system will be different depending - # on which goal (e.g., sdk or just droid) is being built. - partition_tag := $(if $(call should-install-to-system,$(LOCAL_MODULE_TAGS)),,_DATA) -endif -endif - LOCAL_MODULE_PATH := $(strip $(LOCAL_MODULE_PATH)) ifeq ($(LOCAL_MODULE_PATH),) - LOCAL_MODULE_PATH := $($(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS)) + ifdef LOCAL_IS_HOST_MODULE + partition_tag := + else + ifeq (true,$(LOCAL_PROPRIETARY_MODULE)) + partition_tag := _VENDOR + else + # The definition of should-install-to-system will be different depending + # on which goal (e.g., sdk or just droid) is being built. + partition_tag := $(if $(call should-install-to-system,$(LOCAL_MODULE_TAGS)),,_DATA) + endif + endif + install_path_var := $(my_prefix)OUT$(partition_tag)_$(LOCAL_MODULE_CLASS) + ifeq (true,$(LOCAL_PRIVILEGED_MODULE)) + install_path_var := $(install_path_var)_PRIVILEGED + endif + + LOCAL_MODULE_PATH := $($(install_path_var)) ifeq ($(strip $(LOCAL_MODULE_PATH)),) - $(error $(LOCAL_PATH): unhandled LOCAL_MODULE_CLASS "$(LOCAL_MODULE_CLASS)") + $(error $(LOCAL_PATH): unhandled install path "$(install_path_var)") endif endif endif # not LOCAL_UNINSTALLABLE_MODULE diff --git a/core/binary.mk b/core/binary.mk index 3893d03..36b9de5 100644 --- a/core/binary.mk +++ b/core/binary.mk @@ -90,6 +90,15 @@ $(my_prefix)DEPENDENCIES_ON_SHARED_LIBRARIES += $(LOCAL_MODULE):$(LOCAL_INSTALLE endif endif +# Add static HAL libraries +ifdef LOCAL_HAL_STATIC_LIBRARIES +$(foreach lib, $(LOCAL_HAL_STATIC_LIBRARIES), \ + $(eval b_lib := $(filter $(lib).%,$(BOARD_HAL_STATIC_LIBRARIES)))\ + $(if $(b_lib), $(eval LOCAL_STATIC_LIBRARIES += $(b_lib)),\ + $(eval LOCAL_STATIC_LIBRARIES += $(lib).default))) +b_lib := +endif + ifeq ($(strip $(LOCAL_ADDRESS_SANITIZER)),true) LOCAL_CLANG := true LOCAL_CFLAGS += $(ADDRESS_SANITIZER_CONFIG_EXTRA_CFLAGS) @@ -98,6 +107,10 @@ ifeq ($(strip $(LOCAL_ADDRESS_SANITIZER)),true) LOCAL_STATIC_LIBRARIES += $(ADDRESS_SANITIZER_CONFIG_EXTRA_STATIC_LIBRARIES) endif +ifeq ($(strip $(WITHOUT_CLANG)),true) + LOCAL_CLANG := +endif + # Add in libcompiler_rt for all regular device builds ifeq (,$(LOCAL_SDK_VERSION)$(LOCAL_IS_HOST_MODULE)$(WITHOUT_LIBCOMPILER_RT)) LOCAL_STATIC_LIBRARIES += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES) @@ -143,21 +156,17 @@ LOCAL_ASFLAGS += -D__ASSEMBLY__ ifdef LOCAL_SDK_VERSION my_target_project_includes := my_target_c_includes := $(my_ndk_stl_include_path) $(my_ndk_version_root)/usr/include - -# filter out including of AndroidConfig.h in system/core. -TARGET_GLOBAL_CFLAGS_NO_ANDCONF ?= $(subst $(TARGET_ANDROID_CONFIG_CFLAGS),,\ - $(TARGET_GLOBAL_CFLAGS)) -my_target_global_cflags := $(TARGET_GLOBAL_CFLAGS_NO_ANDCONF) else my_target_project_includes := $(TARGET_PROJECT_INCLUDES) my_target_c_includes := $(TARGET_C_INCLUDES) -ifeq ($(strip $(LOCAL_CLANG)),true) -my_target_c_includes += $(CLANG_CONFIG_EXTRA_TARGET_C_INCLUDES) +endif # LOCAL_SDK_VERSION + +ifeq ($(LOCAL_CLANG),true) my_target_global_cflags := $(TARGET_GLOBAL_CLANG_FLAGS) +my_target_c_includes += $(CLANG_CONFIG_EXTRA_TARGET_C_INCLUDES) else my_target_global_cflags := $(TARGET_GLOBAL_CFLAGS) endif # LOCAL_CLANG -endif # LOCAL_SDK_VERSION $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_PROJECT_INCLUDES := $(my_target_project_includes) $(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_C_INCLUDES := $(my_target_c_includes) diff --git a/core/build_id.mk b/core/build_id.mk index e954794..a3b9db6 100644 --- a/core/build_id.mk +++ b/core/build_id.mk @@ -13,20 +13,11 @@ # See the License for the specific language governing permissions and # limitations under the License. # - -# -# Defines branch-specific values. -# - # BUILD_ID is usually used to specify the branch name # (like "MAIN") or a branch name and a release candidate -# (like "TC1-RC5"). It must be a single word, and is +# (like "CRB01"). It must be a single word, and is # capitalized by convention. -# -BUILD_ID := OPENMASTER -# DISPLAY_BUILD_NUMBER should only be set for development branches, -# If set, the BUILD_NUMBER (cl) is appended to the BUILD_ID for -# a more descriptive BUILD_ID_DISPLAY, otherwise BUILD_ID_DISPLAY -# is the same as BUILD_ID +BUILD_ID := KLP + DISPLAY_BUILD_NUMBER := true diff --git a/core/cleanbuild.mk b/core/cleanbuild.mk index 1d17f77..fa67332 100644 --- a/core/cleanbuild.mk +++ b/core/cleanbuild.mk @@ -14,7 +14,7 @@ # # Don't bother with the cleanspecs if you are running mm/mmm -ifndef ONE_SHOT_MAKEFILE +ifeq ($(ONE_SHOT_MAKEFILE)$(dont_bother),) INTERNAL_CLEAN_STEPS := @@ -100,7 +100,7 @@ clean_steps_file := INTERNAL_CLEAN_STEPS := INTERNAL_CLEAN_BUILD_VERSION := -endif # ifndef ONE_SHOT_MAKEFILE +endif # if not ONE_SHOT_MAKEFILE dont_bother # Since products and build variants (unfortunately) share the same # PRODUCT_OUT staging directory, things can get out of sync if different @@ -182,6 +182,7 @@ installclean_files := \ $(PRODUCT_OUT)/*.txt \ $(PRODUCT_OUT)/*.xlb \ $(PRODUCT_OUT)/*.zip \ + $(PRODUCT_OUT)/kernel \ $(PRODUCT_OUT)/data \ $(PRODUCT_OUT)/obj/APPS \ $(PRODUCT_OUT)/obj/NOTICE_FILES \ diff --git a/core/cleanspec.mk b/core/cleanspec.mk index d4a8eed..500ce54 100644 --- a/core/cleanspec.mk +++ b/core/cleanspec.mk @@ -64,6 +64,6 @@ INTERNAL_CLEAN_BUILD_VERSION := 6 # ************************************************ subdir_cleanspecs := \ - $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git . CleanSpec.mk) + $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git . CleanSpec.mk) include $(subdir_cleanspecs) subdir_cleanspecs := diff --git a/core/clear_vars.mk b/core/clear_vars.mk index 7ad58b2..8940c3a 100644 --- a/core/clear_vars.mk +++ b/core/clear_vars.mk @@ -123,12 +123,14 @@ LOCAL_PROTOC_FLAGS:= LOCAL_PROTO_JAVA_OUTPUT_PARAMS:= LOCAL_NO_CRT:= LOCAL_PROPRIETARY_MODULE:= +LOCAL_PRIVILEGED_MODULE:= LOCAL_MODULE_OWNER:= LOCAL_CTS_TEST_PACKAGE:= LOCAL_CTS_TEST_RUNNER:= LOCAL_CLANG:= LOCAL_ADDRESS_SANITIZER:= LOCAL_JAR_EXCLUDE_FILES:= +LOCAL_JAR_PACKAGES:= LOCAL_LINT_FLAGS:= LOCAL_SOURCE_FILES_ALL_GENERATED:= # '',true # Don't delete the META_INF dir when merging static Java libraries. @@ -137,6 +139,7 @@ LOCAL_ADDITIONAL_CERTIFICATES:= LOCAL_PREBUILT_MODULE_FILE:= LOCAL_POST_INSTALL_CMD:= LOCAL_DIST_BUNDLED_BINARIES:= +LOCAL_HAL_STATIC_LIBRARIES:= # Trim MAKEFILE_LIST so that $(call my-dir) doesn't need to # iterate over thousands of entries every time. diff --git a/core/combo/TARGET_linux-arm.mk b/core/combo/TARGET_linux-arm.mk index c31fe59..79a2899 100644 --- a/core/combo/TARGET_linux-arm.mk +++ b/core/combo/TARGET_linux-arm.mk @@ -93,6 +93,8 @@ ifeq ($(FORCE_ARM_DEBUGGING),true) TARGET_thumb_CFLAGS += -marm -fno-omit-frame-pointer endif +android_config_h := $(call select-android-config-h,linux-arm) + TARGET_GLOBAL_CFLAGS += \ -msoft-float -fpic -fPIE \ -ffunction-sections \ @@ -103,11 +105,9 @@ TARGET_GLOBAL_CFLAGS += \ -Werror=format-security \ -D_FORTIFY_SOURCE=2 \ -fno-short-enums \ - $(arch_variant_cflags) - -android_config_h := $(call select-android-config-h,linux-arm) -TARGET_ANDROID_CONFIG_CFLAGS := -include $(android_config_h) -I $(dir $(android_config_h)) -TARGET_GLOBAL_CFLAGS += $(TARGET_ANDROID_CONFIG_CFLAGS) + $(arch_variant_cflags) \ + -include $(android_config_h) \ + -I $(dir $(android_config_h)) # This warning causes dalvik not to build with gcc 4.6+ and -Werror. # We cannot turn it off blindly since the option is not available diff --git a/core/combo/TARGET_linux-mips.mk b/core/combo/TARGET_linux-mips.mk index de7ca5c..ba6e8cd 100644 --- a/core/combo/TARGET_linux-mips.mk +++ b/core/combo/TARGET_linux-mips.mk @@ -80,6 +80,8 @@ ifeq ($(FORCE_MIPS_DEBUGGING),true) TARGET_mips_CFLAGS += -fno-omit-frame-pointer endif +android_config_h := $(call select-android-config-h,linux-mips) + TARGET_GLOBAL_CFLAGS += \ $(TARGET_mips_CFLAGS) \ -Ulinux -U__unix -U__unix__ -Umips \ @@ -90,11 +92,9 @@ TARGET_GLOBAL_CFLAGS += \ -Wa,--noexecstack \ -Werror=format-security \ -D_FORTIFY_SOURCE=2 \ - $(arch_variant_cflags) - -android_config_h := $(call select-android-config-h,linux-mips) -TARGET_ANDROID_CONFIG_CFLAGS := -include $(android_config_h) -I $(dir $(android_config_h)) -TARGET_GLOBAL_CFLAGS += $(TARGET_ANDROID_CONFIG_CFLAGS) + $(arch_variant_cflags) \ + -include $(android_config_h) \ + -I $(dir $(android_config_h)) # This warning causes dalvik not to build with gcc 4.6+ and -Werror. # We cannot turn it off blindly since the option is not available diff --git a/core/combo/TARGET_linux-x86.mk b/core/combo/TARGET_linux-x86.mk index 159fbe1..4e13797 100644 --- a/core/combo/TARGET_linux-x86.mk +++ b/core/combo/TARGET_linux-x86.mk @@ -115,6 +115,8 @@ else endif KERNEL_HEADERS := $(KERNEL_HEADERS_COMMON) $(KERNEL_HEADERS_ARCH) +android_config_h := $(call select-android-config-h,target_linux-x86) + TARGET_GLOBAL_CFLAGS += \ -O2 \ -Ulinux \ @@ -131,11 +133,9 @@ TARGET_GLOBAL_CFLAGS += \ -fstrict-aliasing \ -funswitch-loops \ -funwind-tables \ - -fstack-protector - -android_config_h := $(call select-android-config-h,target_linux-x86) -TARGET_ANDROID_CONFIG_CFLAGS := -include $(android_config_h) -I $(dir $(android_config_h)) -TARGET_GLOBAL_CFLAGS += $(TARGET_ANDROID_CONFIG_CFLAGS) + -fstack-protector \ + -include $(android_config_h) \ + -I $(dir $(android_config_h)) # XXX: Not sure this is still needed. Must check with our toolchains. TARGET_GLOBAL_CPPFLAGS += \ diff --git a/core/combo/arch/arm/armv7-a-neon.mk b/core/combo/arch/arm/armv7-a-neon.mk index f2c1ca7..057ce93 100644 --- a/core/combo/arch/arm/armv7-a-neon.mk +++ b/core/combo/arch/arm/armv7-a-neon.mk @@ -9,12 +9,16 @@ ARCH_ARM_HAVE_NEON := true ifeq ($(strip $(TARGET_CPU_VARIANT)), cortex-a15) arch_variant_cflags := -mcpu=cortex-a15 else +ifeq ($(strip $(TARGET_CPU_VARIANT)),cortex-a8) + arch_variant_cflags := -mcpu=cortex-a8 +else ifeq ($(strip $(TARGET_CPU_VARIANT)),cortex-a7) arch_variant_cflags := -mcpu=cortex-a7 else arch_variant_cflags := -march=armv7-a endif endif +endif arch_variant_cflags += \ -mfloat-abi=softfp \ diff --git a/core/config.mk b/core/config.mk index 21e187d..3358843 100644 --- a/core/config.mk +++ b/core/config.mk @@ -123,7 +123,7 @@ TARGET_SHELL := mksh # --------------------------------------------------------------- # Try to include buildspec.mk, which will try to set stuff up. -# If this file doesn't exist, the environemnt variables will +# If this file doesn't exist, the environment variables will # be used, and if that doesn't work, then the default is an # arm build ifndef ANDROID_BUILDSPEC @@ -159,6 +159,26 @@ endif TARGET_DEVICE_DIR := $(patsubst %/,%,$(dir $(board_config_mk))) board_config_mk := +# Perhaps we should move this block to build/core/Makefile, +# once we don't have TARGET_NO_KERNEL reference in AndroidBoard.mk/Android.mk. +ifneq ($(strip $(TARGET_NO_BOOTLOADER)),true) + INSTALLED_BOOTLOADER_MODULE := $(PRODUCT_OUT)/bootloader + ifeq ($(strip $(TARGET_BOOTLOADER_IS_2ND)),true) + INSTALLED_2NDBOOTLOADER_TARGET := $(PRODUCT_OUT)/2ndbootloader + else + INSTALLED_2NDBOOTLOADER_TARGET := + endif +else + INSTALLED_BOOTLOADER_MODULE := + INSTALLED_2NDBOOTLOADER_TARGET := +endif # TARGET_NO_BOOTLOADER +ifneq ($(strip $(TARGET_NO_KERNEL)),true) + INSTALLED_KERNEL_TARGET := $(PRODUCT_OUT)/kernel +else + INSTALLED_KERNEL_TARGET := +endif + + # The build system exposes several variables for where to find the kernel # headers: # TARGET_DEVICE_KERNEL_HEADERS is automatically created for the current @@ -412,6 +432,11 @@ HOST_GLOBAL_CPPFLAGS += $(HOST_RELEASE_CPPFLAGS) TARGET_GLOBAL_CFLAGS += $(TARGET_RELEASE_CFLAGS) TARGET_GLOBAL_CPPFLAGS += $(TARGET_RELEASE_CPPFLAGS) +# allow overriding default Java libraries on a per-target basis +ifeq ($(TARGET_DEFAULT_JAVA_LIBRARIES),) + TARGET_DEFAULT_JAVA_LIBRARIES := core core-junit ext framework framework2 +endif + # define llvm tools and global flags include $(BUILD_SYSTEM)/llvm_config.mk diff --git a/core/definitions.mk b/core/definitions.mk index 3d19e72..ecb638b 100644 --- a/core/definitions.mk +++ b/core/definitions.mk @@ -147,7 +147,7 @@ endef # $(1): directory to search under # Ignores $(1)/Android.mk define first-makefiles-under -$(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git \ +$(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git \ --mindepth=2 $(1) Android.mk) endef @@ -1511,6 +1511,10 @@ $(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DI -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \ $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \ | xargs rm -rf) +$(if $(PRIVATE_JAR_PACKAGES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type d \ + $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \ + -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))) \ + | xargs rm -rf) $(hide) jar $(if $(strip $(PRIVATE_JAR_MANIFEST)),-cfm,-cf) \ $@ $(PRIVATE_JAR_MANIFEST) -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) . endef @@ -1558,6 +1562,10 @@ $(if $(PRIVATE_JAR_EXCLUDE_FILES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DI -name $(word 1, $(PRIVATE_JAR_EXCLUDE_FILES)) \ $(addprefix -o -name , $(wordlist 2, 999, $(PRIVATE_JAR_EXCLUDE_FILES))) \ | xargs rm -rf) +$(if $(PRIVATE_JAR_PACKAGES), $(hide) find $(PRIVATE_CLASS_INTERMEDIATES_DIR) -mindepth 1 -type d \ + $(foreach pkg, $(PRIVATE_JAR_PACKAGES), \ + -not -path $(PRIVATE_CLASS_INTERMEDIATES_DIR)/$(subst .,/,$(pkg))) \ + | xargs rm -rf) $(hide) jar $(if $(strip $(PRIVATE_JAR_MANIFEST)),-cfm,-cf) \ $@ $(PRIVATE_JAR_MANIFEST) -C $(PRIVATE_CLASS_INTERMEDIATES_DIR) . $(hide) mv $(PRIVATE_CLASS_INTERMEDIATES_DIR)/newstamp $(PRIVATE_CLASS_INTERMEDIATES_DIR)/stamp diff --git a/core/dex_preopt.mk b/core/dex_preopt.mk index 0c9904a..77b239b 100644 --- a/core/dex_preopt.mk +++ b/core/dex_preopt.mk @@ -3,9 +3,9 @@ # #################################### -# TODO: replace it with device's BOOTCLASSPATH -DEXPREOPT_BOOT_JARS := core:conscrypt:okhttp:core-junit:bouncycastle:ext:framework:telephony-common:voip-common:mms-common:android.policy:services:apache-xml +DEXPREOPT_BOOT_JARS := $(PRODUCT_BOOT_JARS) DEXPREOPT_BOOT_JARS_MODULES := $(subst :, ,$(DEXPREOPT_BOOT_JARS)) +PRODUCT_BOOTCLASSPATH := $(subst $(space),:,$(foreach m,$(DEXPREOPT_BOOT_JARS_MODULES),/system/framework/$(m).jar)) DEXPREOPT_BUILD_DIR := $(OUT_DIR) DEXPREOPT_PRODUCT_DIR := $(patsubst $(DEXPREOPT_BUILD_DIR)/%,%,$(PRODUCT_OUT))/dex_bootjars diff --git a/core/droiddoc.mk b/core/droiddoc.mk index 8a5c556..0d3094d 100644 --- a/core/droiddoc.mk +++ b/core/droiddoc.mk @@ -69,7 +69,7 @@ ifneq ($(LOCAL_SDK_VERSION),) LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES) endif else - LOCAL_JAVA_LIBRARIES := core ext framework $(LOCAL_JAVA_LIBRARIES) + LOCAL_JAVA_LIBRARIES := core ext framework framework2 $(LOCAL_JAVA_LIBRARIES) endif # LOCAL_SDK_VERSION LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES)) diff --git a/core/envsetup.mk b/core/envsetup.mk index f861586..8ac437e 100644 --- a/core/envsetup.mk +++ b/core/envsetup.mk @@ -196,6 +196,7 @@ TARGET_OUT_OPTIONAL_EXECUTABLES:= $(TARGET_OUT)/xbin TARGET_OUT_SHARED_LIBRARIES:= $(TARGET_OUT)/lib TARGET_OUT_JAVA_LIBRARIES:= $(TARGET_OUT)/framework TARGET_OUT_APPS:= $(TARGET_OUT)/app +TARGET_OUT_APPS_PRIVILEGED := $(TARGET_OUT)/priv-app TARGET_OUT_KEYLAYOUT := $(TARGET_OUT)/usr/keylayout TARGET_OUT_KEYCHARS := $(TARGET_OUT)/usr/keychars TARGET_OUT_ETC := $(TARGET_OUT)/etc @@ -211,6 +212,7 @@ TARGET_OUT_DATA_KEYLAYOUT := $(TARGET_OUT_KEYLAYOUT) TARGET_OUT_DATA_KEYCHARS := $(TARGET_OUT_KEYCHARS) TARGET_OUT_DATA_ETC := $(TARGET_OUT_ETC) TARGET_OUT_DATA_NATIVE_TESTS := $(TARGET_OUT_DATA)/nativetest +TARGET_OUT_DATA_FAKE := $(TARGET_OUT_DATA)/fake_packages TARGET_OUT_CACHE := $(PRODUCT_OUT)/cache diff --git a/core/help.mk b/core/help.mk index 9e37f82..6e0b2c0 100644 --- a/core/help.mk +++ b/core/help.mk @@ -14,13 +14,6 @@ # limitations under the License. # -ifeq ($(MAKECMDGOALS),help) -dont_bother := true -endif -ifeq ($(MAKECMDGOALS),out) -dont_bother := true -endif - .PHONY: help help: @echo @@ -39,4 +32,3 @@ help: .PHONY: out out: @echo "I'm sure you're nice and all, but no thanks." - diff --git a/core/host_java_library.mk b/core/host_java_library.mk index 02274e4..5e35b90 100644 --- a/core/host_java_library.mk +++ b/core/host_java_library.mk @@ -76,7 +76,7 @@ $(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_ja # Run jarjar if necessary, otherwise just copy the file. ifneq ($(strip $(LOCAL_JARJAR_RULES)),) $(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) -$(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(JARJAR) +$(full_classes_jarjar_jar): $(full_classes_compiled_jar) $(LOCAL_JARJAR_RULES) | $(JARJAR) @echo JarJar: $@ $(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ else diff --git a/core/java.mk b/core/java.mk index f43bf3b..8abfb39 100644 --- a/core/java.mk +++ b/core/java.mk @@ -43,7 +43,7 @@ ifneq ($(LOCAL_SDK_VERSION),) endif else ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) - LOCAL_JAVA_LIBRARIES := core core-junit ext framework $(LOCAL_JAVA_LIBRARIES) + LOCAL_JAVA_LIBRARIES := $(TARGET_DEFAULT_JAVA_LIBRARIES) $(LOCAL_JAVA_LIBRARIES) endif endif @@ -337,6 +337,7 @@ $(full_classes_compiled_jar): PRIVATE_WARNINGS_ENABLE := $(LOCAL_WARNINGS_ENABLE # via deps on the target that generates the sources. $(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) $(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(LOCAL_JAR_EXCLUDE_FILES) +$(full_classes_compiled_jar): PRIVATE_JAR_PACKAGES := $(LOCAL_JAR_PACKAGES) $(full_classes_compiled_jar): PRIVATE_DONT_DELETE_JAR_META_INF := $(LOCAL_DONT_DELETE_JAR_META_INF) $(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) \ $(jar_manifest_file) $(layers_file) $(RenderScript_file_stamp) \ @@ -348,7 +349,7 @@ $(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g # Run jarjar if necessary, otherwise just copy the file. ifneq ($(strip $(LOCAL_JARJAR_RULES)),) $(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) -$(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(JARJAR) +$(full_classes_jarjar_jar): $(full_classes_compiled_jar) $(LOCAL_JARJAR_RULES) | $(JARJAR) @echo JarJar: $@ $(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ else diff --git a/core/legacy_prebuilts.mk b/core/legacy_prebuilts.mk index f767644..c477900 100644 --- a/core/legacy_prebuilts.mk +++ b/core/legacy_prebuilts.mk @@ -34,8 +34,6 @@ GRANDFATHERED_ALL_PREBUILT := \ cdt.bin \ chat-ril \ cpcap-key.kl \ - data \ - dev \ egl.cfg \ firmware_error.565 \ firmware_install.565 \ @@ -45,13 +43,11 @@ GRANDFATHERED_ALL_PREBUILT := \ gps.stingray.so \ gralloc.omap3.so \ gralloc.tegra.so \ - hosts \ hwcomposer.tegra.so \ ime \ init.goldfish.rc \ init.goldfish.sh \ init.olympus.rc \ - init.rc \ init.sholes.rc \ init.stingray.rc \ input \ @@ -76,23 +72,18 @@ GRANDFATHERED_ALL_PREBUILT := \ pm \ pppd-ril \ pppd-ril.options \ - proc \ qwerty.kl \ radio.img \ rdl.bin \ RFFspeed_501.bmd \ RFFstd_501.bmd \ savebpver \ - sbin \ sholes-keypad.kl \ suplcerts.bks \ svc \ - sys \ - system \ tcmd \ ueventd.goldfish.rc \ ueventd.olympus.rc \ - ueventd.rc \ ueventd.stingray.rc \ vold.fstab \ wl1271.bin diff --git a/core/main.mk b/core/main.mk index 282d9c3..5522867 100644 --- a/core/main.mk +++ b/core/main.mk @@ -71,6 +71,22 @@ $(DEFAULT_GOAL): .PHONY: FORCE FORCE: +# These goals don't need to collect and include Android.mks/CleanSpec.mks +# in the source tree. +dont_bother_goals := clean clobber dataclean installclean \ + help out \ + snod systemimage-nodeps \ + stnod systemtarball-nodeps \ + userdataimage-nodeps userdatatarball-nodeps \ + cacheimage-nodeps \ + vendorimage-nodeps \ + ramdisk-nodeps \ + bootimage-nodeps + +ifneq ($(filter $(dont_bother_goals), $(MAKECMDGOALS)),) +dont_bother := true +endif + # Targets that provide quick help on the build system. include $(BUILD_SYSTEM)/help.mk @@ -84,21 +100,6 @@ include $(BUILD_SYSTEM)/config.mk # be generated correctly include $(BUILD_SYSTEM)/cleanbuild.mk -# These targets are going to delete stuff, don't bother including -# the whole directory tree if that's all we're going to do -ifeq ($(MAKECMDGOALS),clean) -dont_bother := true -endif -ifeq ($(MAKECMDGOALS),clobber) -dont_bother := true -endif -ifeq ($(MAKECMDGOALS),dataclean) -dont_bother := true -endif -ifeq ($(MAKECMDGOALS),installclean) -dont_bother := true -endif - # Include the google-specific config -include vendor/google/build/config.mk @@ -183,6 +184,7 @@ $(info ************************************************************) $(error stop) endif +ifndef BUILD_EMULATOR ifeq (darwin,$(HOST_OS)) GCC_REALPATH = $(realpath $(shell which $(HOST_CC))) ifneq ($(findstring llvm-gcc,$(GCC_REALPATH)),) @@ -199,10 +201,11 @@ endif else # HOST_OS is not darwin BUILD_EMULATOR := true endif # HOST_OS is darwin +endif $(shell echo 'VERSIONS_CHECKED := $(VERSION_CHECK_SEQUENCE_NUMBER)' \ > $(OUT_DIR)/versions_checked.mk) -$(shell echo 'BUILD_EMULATOR := $(BUILD_EMULATOR)' \ +$(shell echo 'BUILD_EMULATOR ?= $(BUILD_EMULATOR)' \ >> $(OUT_DIR)/versions_checked.mk) endif @@ -357,7 +360,7 @@ ifdef is_sdk_build sdk_repo_goal := $(strip $(filter sdk_repo,$(MAKECMDGOALS))) MAKECMDGOALS := $(strip $(filter-out sdk_repo,$(MAKECMDGOALS))) -ifneq ($(words $(filter-out $(INTERNAL_MODIFIER_TARGETS),$(MAKECMDGOALS))),1) +ifneq ($(words $(filter-out $(INTERNAL_MODIFIER_TARGETS) checkbuild,$(MAKECMDGOALS))),1) $(error The 'sdk' target may not be specified with any other targets) endif @@ -468,6 +471,12 @@ FULL_BUILD := NOTICE-HOST-%: ; NOTICE-TARGET-%: ; +# A helper goal printing out install paths +.PHONY: GET-INSTALL-PATH +GET-INSTALL-PATH: + @$(foreach m, $(ALL_MODULES), $(if $(ALL_MODULES.$(m).INSTALLED), \ + echo 'INSTALL-PATH: $(m) $(ALL_MODULES.$(m).INSTALLED)';)) + else # ONE_SHOT_MAKEFILE # @@ -477,9 +486,9 @@ else # ONE_SHOT_MAKEFILE # Can't use first-makefiles-under here because # --mindepth=2 makes the prunes not work. subdir_makefiles := \ - $(shell build/tools/findleaves.py --prune=out --prune=.repo --prune=.git $(subdirs) Android.mk) + $(shell build/tools/findleaves.py --prune=$(OUT_DIR) --prune=.repo --prune=.git $(subdirs) Android.mk) -include $(subdir_makefiles) +$(foreach mk, $(subdir_makefiles), $(info including $(mk) ...)$(eval include $(mk))) endif # ONE_SHOT_MAKEFILE @@ -673,6 +682,8 @@ ifdef is_sdk_build $(warning $(ALL_MODULES.$(m).MAKEFILE): Module '$(m)' in PRODUCT_PACKAGES_TESTS has nothing to install!))) endif +endif # dont_bother + # build/core/Makefile contains extra stuff that we don't want to pollute this # top-level makefile with. It expects that ALL_DEFAULT_INSTALLED_MODULES # contains everything that's built during the current make, but it also further @@ -682,8 +693,6 @@ include $(BUILD_SYSTEM)/Makefile modules_to_install := $(sort $(ALL_DEFAULT_INSTALLED_MODULES)) ALL_DEFAULT_INSTALLED_MODULES := -endif # dont_bother - # These are additional goals that we build, in order to make sure that there # is as little code as possible in the tree that doesn't build. diff --git a/core/multi_prebuilt.mk b/core/multi_prebuilt.mk index 50a4a38..be60e2f 100644 --- a/core/multi_prebuilt.mk +++ b/core/multi_prebuilt.mk @@ -14,6 +14,11 @@ # limitations under the License. # +ifneq ($(LOCAL_MODULE)$(LOCAL_MODULE_CLASS),) +$(error $(LOCAL_PATH): LOCAL_MODULE or LOCAL_MODULE_CLASS not needed by \ + BUILD_MULTI_PREBUILT, use BUILD_PREBUILT instead!) +endif + # Save these before they get cleared by CLEAR_VARS. prebuilt_static_libs := $(filter %.a,$(LOCAL_PREBUILT_LIBS)) prebuilt_shared_libs := $(filter-out %.a,$(LOCAL_PREBUILT_LIBS)) diff --git a/core/package.mk b/core/package.mk index 36fb54c..ff202cb 100644 --- a/core/package.mk +++ b/core/package.mk @@ -131,12 +131,9 @@ LOCAL_BUILT_MODULE_STEM := package.apk LOCAL_PROGUARD_ENABLED:=$(strip $(LOCAL_PROGUARD_ENABLED)) ifndef LOCAL_PROGUARD_ENABLED ifneq ($(DISABLE_PROGUARD),true) -ifneq ($(filter user userdebug, $(TARGET_BUILD_VARIANT)),) - # turn on Proguard by default for user & userdebug build LOCAL_PROGUARD_ENABLED :=full endif endif -endif ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) # the package explicitly request to disable proguard. LOCAL_PROGUARD_ENABLED := diff --git a/core/pathmap.mk b/core/pathmap.mk index 7024e3e..0292a30 100644 --- a/core/pathmap.mk +++ b/core/pathmap.mk @@ -34,7 +34,6 @@ pathmap_INCL := \ frameworks-native:frameworks/native/include \ graphics:external/skia/include/core \ libc:bionic/libc/include \ - libdrm1:frameworks/base/media/libdrm/mobile1/include \ libhardware:hardware/libhardware/include \ libhardware_legacy:hardware/libhardware_legacy/include \ libhost:build/libs/host/include \ @@ -76,11 +75,6 @@ JNI_H_INCLUDE := $(call include-path-for,libnativehelper)/nativehelper # A list of all source roots under frameworks/base, which will be # built into the android.jar. # -# Note - "common" is included here, even though it is also built -# into a static library (android-common) for unbundled use. This -# is so common and the other framework libraries can have mutual -# interdependencies. -# FRAMEWORKS_BASE_SUBDIRS := \ $(addsuffix /java, \ core \ diff --git a/core/pdk_config.mk b/core/pdk_config.mk index 41a82d4..cdd2a76 100644 --- a/core/pdk_config.mk +++ b/core/pdk_config.mk @@ -47,6 +47,7 @@ PDK_PLATFORM_JAVA_ZIP_JAVA_LIB_DIR := \ target/common/obj/JAVA_LIBRARIES/core-junit_intermediates \ target/common/obj/JAVA_LIBRARIES/ext_intermediates \ target/common/obj/JAVA_LIBRARIES/framework_intermediates \ + target/common/obj/JAVA_LIBRARIES/framework2_intermediates \ target/common/obj/JAVA_LIBRARIES/android.test.runner_intermediates \ target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates \ target/common/obj/JAVA_LIBRARIES/voip-common_intermediates \ @@ -117,9 +118,14 @@ $(PRODUCT_OUT)/% : $(_pdk_fusion_intermediates)/% $(_pdk_fusion_stamp) ifeq (true,$(TARGET_BUILD_PDK_JAVA_PLATFORM)) +PDK_FUSION_OUT_DIR := $(OUT_DIR) +ifeq (debug,$(TARGET_BUILD_TYPE)) +PDK_FUSION_OUT_DIR := $(DEBUG_OUT_DIR) +endif + define JAVA_dependency_template -$(OUT_DIR)/$(strip $(1)): $(_pdk_fusion_intermediates)/$(strip $(1)) $(OUT_DIR)/$(strip $(2)) \ - $(_pdk_fusion_stamp) +$(PDK_FUSION_OUT_DIR)/$(strip $(1)): $(_pdk_fusion_intermediates)/$(strip $(1)) \ + $(PDK_FUSION_OUT_DIR)/$(strip $(2)) $(_pdk_fusion_stamp) @mkdir -p $$(dir $$@) $(hide) cp -fpPR $$< $$@ endef diff --git a/core/phony_package.mk b/core/phony_package.mk index 70b6aac..b534335 100644 --- a/core/phony_package.mk +++ b/core/phony_package.mk @@ -7,7 +7,7 @@ LOCAL_MODULE_SUFFIX := -timestamp include $(BUILD_SYSTEM)/base_rules.mk -$(LOCAL_BUILT_MODULE): +$(LOCAL_BUILT_MODULE): $(LOCAL_ADDITIONAL_DEPENDENCIES) $(hide) echo "Fake: $@" $(hide) mkdir -p $(dir $@) $(hide) touch $@ diff --git a/core/prebuilt.mk b/core/prebuilt.mk index 197b54a..e34fa55 100644 --- a/core/prebuilt.mk +++ b/core/prebuilt.mk @@ -16,6 +16,9 @@ ifneq ($(LOCAL_PREBUILT_JAVA_LIBRARIES),) $(error dont use LOCAL_PREBUILT_JAVA_LIBRARIES anymore LOCAL_PATH=$(LOCAL_PATH)) endif +# Not much sense to check build prebuilts +LOCAL_DONT_CHECK_MODULE := true + ifdef LOCAL_PREBUILT_MODULE_FILE my_prebuilt_src_file := $(LOCAL_PREBUILT_MODULE_FILE) else diff --git a/core/product.mk b/core/product.mk index bbd0c31..35b5b84 100644 --- a/core/product.mk +++ b/core/product.mk @@ -95,7 +95,9 @@ _product_var_list := \ PRODUCT_RESTRICT_VENDOR_FILES \ PRODUCT_VENDOR_KERNEL_HEADERS \ PRODUCT_FACTORY_RAMDISK_MODULES \ - PRODUCT_FACTORY_BUNDLE_MODULES + PRODUCT_FACTORY_BUNDLE_MODULES \ + PRODUCT_RUNTIMES \ + PRODUCT_BOOT_JARS define dump-product @@ -207,6 +209,7 @@ endef _product_stash_var_list := $(_product_var_list) \ + PRODUCT_BOOTCLASSPATH \ TARGET_ARCH \ TARGET_ARCH_VARIANT \ TARGET_CPU_VARIANT \ diff --git a/core/product_config.mk b/core/product_config.mk index bfbdf78..e4b68cf 100644 --- a/core/product_config.mk +++ b/core/product_config.mk @@ -246,6 +246,31 @@ current_product_makefile := all_product_makefiles := all_product_configs := + +############################################################################# +# TODO: Remove this hack once only 1 runtime is left. +# Include the runtime product makefile based on the product's PRODUCT_RUNTIMES +$(call clear-var-list, $(_product_var_list)) + +# Set PRODUCT_RUNTIMES, allowing buildspec to override using OVERRIDE_RUNTIMES +product_runtimes := $(sort $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_RUNTIMES)) +ifneq ($(OVERRIDE_RUNTIMES),) + $(info Overriding PRODUCT_RUNTIMES=$(product_runtimes) with $(OVERRIDE_RUNTIMES)) + product_runtimes := $(OVERRIDE_RUNTIMES) +endif +$(foreach runtime, $(product_runtimes), $(eval include $(SRC_TARGET_DIR)/product/$(runtime).mk)) +$(foreach v, $(_product_var_list), $(if $($(v)),\ + $(eval PRODUCTS.$(INTERNAL_PRODUCT).$(v) += $(sort $($(v)))))) + +$(call clear-var-list, $(_product_var_list)) +# Now we can assign to PRODUCT_RUNTIMES +PRODUCT_RUNTIMES := $(product_runtimes) +product_runtimes := +############################################################################# + +# A list of module names of BOOTCLASSPATH (jar files) +PRODUCT_BOOT_JARS := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_BOOT_JARS) + # Find the device that this product maps to. TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE) diff --git a/core/proguard_basic_keeps.flags b/core/proguard_basic_keeps.flags index 0ce81ef..af0e05d 100644 --- a/core/proguard_basic_keeps.flags +++ b/core/proguard_basic_keeps.flags @@ -1,7 +1,6 @@ # see http://sourceforge.net/tracker/?func=detail&aid=2787465&group_id=54750&atid=474707 -optimizations !code/simplification/arithmetic -optimizations !code/simplification/cast --allowaccessmodification # To prevent name conflict in incremental obfuscation. -useuniqueclassmembernames diff --git a/core/tasks/cts.mk b/core/tasks/cts.mk index 9154f32..4f360aa 100644 --- a/core/tasks/cts.mk +++ b/core/tasks/cts.mk @@ -45,10 +45,9 @@ CTS_CORE_CASES := $(foreach pkg,$(CTS_CORE_CASE_LIST),$(call intermediates-dir-f CTS_CASE_LIST := $(CTS_CORE_CASE_LIST) $(CTS_TEST_CASE_LIST) DEFAULT_TEST_PLAN := $(cts_dir)/$(cts_name)/resource/plans - +CTS_TEST_CASE_LIST_FILES := $(foreach c, $(CTS_TEST_CASE_LIST), $(call intermediates-dir-for,APPS,$(c))/package.apk) $(cts_dir)/all_cts_files_stamp: PRIVATE_JUNIT_HOST_JAR := $(junit_host_jar) - -$(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) +$(cts_dir)/all_cts_files_stamp: $(CTS_CORE_CASES) $(CTS_TEST_CASES) $(CTS_TEST_CASE_LIST_FILES) $(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) @@ -105,28 +104,45 @@ $(CTS_CORE_XMLS): PRIVATE_CLASSPATH:=$(GEN_CLASSPATH) # 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_CORE_XMLS): $(CTS_CORE_CASES) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CORE_INTERMEDIATES)/javalib.jar $(BOUNCYCASTLE_INTERMEDIATES)/javalib.jar $(APACHEXML_INTERMEDIATES)/javalib.jar $(OKHTTP_INTERMEDIATES)/javalib.jar $(SQLITEJDBC_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(CORETESTS_INTERMEDIATES)/javalib.jar | $(ACP) +CTS_CORE_XMLS_DEPS := $(CTS_CORE_CASES) $(HOST_OUT_JAVA_LIBRARIES)/descGen.jar $(CORE_INTERMEDIATES)/javalib.jar $(BOUNCYCASTLE_INTERMEDIATES)/javalib.jar $(APACHEXML_INTERMEDIATES)/javalib.jar $(OKHTTP_INTERMEDIATES)/javalib.jar $(SQLITEJDBC_INTERMEDIATES)/javalib.jar $(JUNIT_INTERMEDIATES)/javalib.jar $(CORETESTS_INTERMEDIATES)/javalib.jar | $(ACP) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.dalvik.xml: $(CTS_CORE_XMLS_DEPS) $(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) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.com.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) $(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) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.sun.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) $(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) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.tests.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) $(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) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.org.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) $(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) + +$(CTS_TESTCASES_OUT)/android.core.tests.libcore.package.libcore.xml: $(CTS_CORE_XMLS_DEPS) + $(hide) mkdir -p $(CTS_TESTCASES_OUT) $(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,\ @@ -159,6 +175,7 @@ $(DEFAULT_TEST_PLAN): $(cts_dir)/all_cts_files_stamp $(cts_tools_src_dir)/utils/ $(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 + $(hide) mkdir -p $(dir $@) && touch $@ # Package CTS and clean up. # diff --git a/core/tasks/product-graph.mk b/core/tasks/product-graph.mk index 1ccb20b..fcec277 100644 --- a/core/tasks/product-graph.mk +++ b/core/tasks/product-graph.mk @@ -51,26 +51,33 @@ endif really_all_products := $(call gather-all-products) +open_parethesis := ( +close_parenthesis := ) + +# Emit properties of a product node to a file. +# $(1) the product +# $(2) the output file +define emit-product-node-props +$(hide) echo \"$(1)\" [ \ +label=\"$(dir $(1))\\n$(notdir $(1))\\n\\n$(subst $(close_parenthesis),,$(subst $(open_parethesis),,$(PRODUCTS.$(strip $(1)).PRODUCT_MODEL)))\\n$(PRODUCTS.$(strip $(1)).PRODUCT_DEVICE)\" \ +$(if $(filter $(1),$(PRIVATE_PRODUCTS_FILTER)), style=\"filled\" fillcolor=\"#FFFDB0\",) \ +fontcolor=\"darkblue\" href=\"products/$(1).html\" \ +] >> $(2) + +endef + $(products_graph): PRIVATE_PRODUCTS := $(really_all_products) $(products_graph): PRIVATE_PRODUCTS_FILTER := $(products_list) $(products_graph): $(this_makefile) @echo Product graph DOT: $@ for $(PRIVATE_PRODUCTS_FILTER) - $(hide) ( \ - echo 'digraph {'; \ - echo 'graph [ ratio=.5 ];'; \ - $(foreach p,$(PRIVATE_PRODUCTS), \ - $(foreach d,$(PRODUCTS.$(strip $(p)).INHERITS_FROM), echo \"$(d)\" -\> \"$(p)\";)) \ - $(foreach prod, $(PRIVATE_PRODUCTS), \ - echo \"$(prod)\" [ \ - label=\"$(dir $(prod))\\n$(notdir $(prod))\\n\\n$(PRODUCTS.$(strip $(prod)).PRODUCT_MODEL)\\n$(PRODUCTS.$(strip $(prod)).PRODUCT_DEVICE)\" \ - $(if $(filter $(prod),$(PRIVATE_PRODUCTS_FILTER)), style=\"filled\" fillcolor=\"#FFFDB0\",) \ - fontcolor=\"darkblue\" href=\"products/$(prod).html\" \ - ];) \ - echo '}' \ - ) \ - | ./build/tools/filter-product-graph.py $(PRIVATE_PRODUCTS_FILTER) \ - > $@ + $(hide) echo 'digraph {' > $@.in + $(hide) echo 'graph [ ratio=.5 ];' >> $@.in + $(hide) $(foreach p,$(PRIVATE_PRODUCTS), \ + $(foreach d,$(PRODUCTS.$(strip $(p)).INHERITS_FROM), echo \"$(d)\" -\> \"$(p)\" >> $@.in;)) + $(foreach p,$(PRIVATE_PRODUCTS),$(call emit-product-node-props,$(p),$@.in)) + $(hide) echo '}' >> $@.in + $(hide) ./build/tools/filter-product-graph.py $(PRIVATE_PRODUCTS_FILTER) < $@.in > $@ # Evaluates to the name of the product file # $(1) product file @@ -137,4 +144,3 @@ $(products_svg): $(products_graph) $(product_debug_files) dot -Tsvg -Nshape=box -o $@ $< product-graph: $(products_pdf) $(products_svg) - diff --git a/core/version_defaults.mk b/core/version_defaults.mk index b9e1456..8fa5081 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.3.2.1.000.000 + PLATFORM_VERSION := KeyLimePie 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 := KeyLimePie endif ifeq "" "$(DEFAULT_APP_TARGET_SDK)" diff --git a/envsetup.sh b/envsetup.sh index 3639db9..1b95532 100644 --- a/envsetup.sh +++ b/envsetup.sh @@ -640,6 +640,9 @@ function mm() # Find the closest Android.mk file. T=$(gettop) local M=$(findmakefile) + local MODULES= + local GET_INSTALL_PATH= + local ARGS= # Remove the path to top as the makefilepath needs to be relative local M=`echo $M|sed 's:'$T'/::'` if [ ! "$T" ]; then @@ -647,7 +650,19 @@ function mm() elif [ ! "$M" ]; then echo "Couldn't locate a makefile from the current directory." else - ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk all_modules $@ + for ARG in $@; do + case $ARG in + GET-INSTALL-PATH) GET_INSTALL_PATH=$ARG;; + esac + done + if [ -n "$GET_INSTALL_PATH" ]; then + MODULES= + ARGS=GET-INSTALL-PATH + else + MODULES=all_modules + ARGS=$@ + fi + ONE_SHOT_MAKEFILE=$M make -C $T -f build/core/main.mk $MODULES $ARGS fi fi } @@ -660,6 +675,7 @@ function mmm() local MODULES= local ARGS= local DIR TO_CHOP + local GET_INSTALL_PATH= local DASH_ARGS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^-.*$/') local DIRS=$(echo "$@" | awk -v RS=" " -v ORS=" " '/^[^-].*$/') for DIR in $DIRS ; do @@ -669,10 +685,10 @@ function mmm() 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` - START=`PWD= /bin/pwd` - MFILE=`echo $START | cut -c${TO_CHOP}-` + local TO_CHOP=`(\cd -P -- $T && pwd -P) | wc -c | tr -d ' '` + local TO_CHOP=`expr $TO_CHOP + 1` + local START=`PWD= /bin/pwd` + local MFILE=`echo $START | cut -c${TO_CHOP}-` if [ "$MFILE" = "" ] ; then MFILE=$DIR/Android.mk else @@ -680,20 +696,17 @@ function mmm() fi MAKEFILE="$MAKEFILE $MFILE" else - if [ "$DIR" = snod ]; then - ARGS="$ARGS snod" - elif [ "$DIR" = showcommands ]; then - ARGS="$ARGS showcommands" - elif [ "$DIR" = dist ]; then - ARGS="$ARGS dist" - elif [ "$DIR" = incrementaljavac ]; then - ARGS="$ARGS incrementaljavac" - else - echo "No Android.mk in $DIR." - return 1 - fi + case $DIR in + showcommands | snod | dist | incrementaljavac) ARGS="$ARGS $DIR";; + GET-INSTALL-PATH) GET_INSTALL_PATH=$DIR;; + *) echo "No Android.mk in $DIR."; return 1;; + esac fi done + if [ -n "$GET_INSTALL_PATH" ]; then + ARGS=$GET_INSTALL_PATH + MODULES= + fi ONE_SHOT_MAKEFILE="$MAKEFILE" make -C $T -f build/core/main.mk $DASH_ARGS $MODULES $ARGS else echo "Couldn't locate the top of the tree. Try setting TOP." @@ -776,15 +789,50 @@ function cproj() echo "can't find Android.mk" } +# simplified version of ps; output in the form +# <pid> <procname> +function qpid() { + local prepend='' + local append='' + if [ "$1" = "--exact" ]; then + prepend=' ' + append='$' + shift + elif [ "$1" = "--help" -o "$1" = "-h" ]; then + echo "usage: qpid [[--exact] <process name|pid>" + return 255 + fi + + local EXE="$1" + if [ "$EXE" ] ; then + qpid | grep "$prepend$EXE$append" + else + adb shell ps \ + | tr -d '\r' \ + | sed -e 1d -e 's/^[^ ]* *\([0-9]*\).* \([^ ]*\)$/\1 \2/' + fi +} + function pid() { - local EXE="$1" - if [ "$EXE" ] ; then - local PID=`adb shell ps | fgrep $1 | sed -e 's/[^ ]* *\([0-9]*\).*/\1/'` - echo "$PID" - else - echo "usage: pid name" - fi + local prepend='' + local append='' + if [ "$1" = "--exact" ]; then + prepend=' ' + append='$' + shift + fi + local EXE="$1" + if [ "$EXE" ] ; then + local PID=`adb shell ps \ + | tr -d '\r' \ + | grep "$prepend$EXE$append" \ + | sed -e 's/^[^ ]* *\([0-9]*\).*$/\1/'` + echo "$PID" + else + echo "usage: pid [--exact] <process name>" + return 255 + fi } # systemstack - dump the current stack trace of all threads in the system process @@ -896,6 +944,7 @@ function gdbclient() echo >|"$OUT_ROOT/gdbclient.cmds" "set solib-absolute-prefix $OUT_SYMBOLS" echo >>"$OUT_ROOT/gdbclient.cmds" "set solib-search-path $OUT_SO_SYMBOLS:$OUT_SO_SYMBOLS/hw:$OUT_SO_SYMBOLS/ssl/engines:$OUT_SO_SYMBOLS/drm:$OUT_SO_SYMBOLS/egl:$OUT_SO_SYMBOLS/soundfx" + echo >>"$OUT_ROOT/gdbclient.cmds" "source $ANDROID_BUILD_TOP/development/scripts/gdb/dalvik.gdb" echo >>"$OUT_ROOT/gdbclient.cmds" "target remote $PORT" echo >>"$OUT_ROOT/gdbclient.cmds" "" @@ -1062,7 +1111,7 @@ function runhat() fi # issue "am" command to cause the hprof dump - local sdcard=$(adb shell echo -n '$EXTERNAL_STORAGE') + local sdcard=$(adb ${adbOptions} shell echo -n '$EXTERNAL_STORAGE') local devFile=$sdcard/hprof-$targetPid #local devFile=/data/local/hprof-$targetPid echo "Poking $targetPid and waiting for data..." diff --git a/libs/host/Android.mk b/libs/host/Android.mk index 9900f59..74afa55 100644 --- a/libs/host/Android.mk +++ b/libs/host/Android.mk @@ -2,8 +2,7 @@ LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= \ - CopyFile.c \ - pseudolocalize.cpp + CopyFile.c ifeq ($(HOST_OS),cygwin) LOCAL_CFLAGS += -DWIN32_EXE diff --git a/libs/host/include/host/pseudolocalize.h b/libs/host/include/host/pseudolocalize.h deleted file mode 100644 index 94cb034..0000000 --- a/libs/host/include/host/pseudolocalize.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef HOST_PSEUDOLOCALIZE_H -#define HOST_PSEUDOLOCALIZE_H - -#include <string> - -std::string pseudolocalize_string(const std::string& source); - -#endif // HOST_PSEUDOLOCALIZE_H - diff --git a/libs/host/pseudolocalize.cpp b/libs/host/pseudolocalize.cpp deleted file mode 100644 index a2b3c2f..0000000 --- a/libs/host/pseudolocalize.cpp +++ /dev/null @@ -1,119 +0,0 @@ -#include <host/pseudolocalize.h> - -using namespace std; - -static const char* -pseudolocalize_char(char c) -{ - switch (c) { - case 'a': return "\xc4\x83"; - case 'b': return "\xcf\x84"; - case 'c': return "\xc4\x8b"; - case 'd': return "\xc4\x8f"; - case 'e': return "\xc4\x99"; - case 'f': return "\xc6\x92"; - case 'g': return "\xc4\x9d"; - case 'h': return "\xd1\x9b"; - case 'i': return "\xcf\x8a"; - case 'j': return "\xc4\xb5"; - case 'k': return "\xc4\xb8"; - case 'l': return "\xc4\xba"; - case 'm': return "\xe1\xb8\xbf"; - case 'n': return "\xd0\xb8"; - case 'o': return "\xcf\x8c"; - case 'p': return "\xcf\x81"; - case 'q': return "\x51"; - case 'r': return "\xd2\x91"; - case 's': return "\xc5\xa1"; - case 't': return "\xd1\x82"; - case 'u': return "\xce\xb0"; - case 'v': return "\x56"; - case 'w': return "\xe1\xba\x85"; - case 'x': return "\xd1\x85"; - case 'y': return "\xe1\xbb\xb3"; - case 'z': return "\xc5\xba"; - case 'A': return "\xc3\x85"; - case 'B': return "\xce\xb2"; - case 'C': return "\xc4\x88"; - case 'D': return "\xc4\x90"; - case 'E': return "\xd0\x84"; - case 'F': return "\xce\x93"; - case 'G': return "\xc4\x9e"; - case 'H': return "\xc4\xa6"; - case 'I': return "\xd0\x87"; - case 'J': return "\xc4\xb5"; - case 'K': return "\xc4\xb6"; - case 'L': return "\xc5\x81"; - case 'M': return "\xe1\xb8\xbe"; - case 'N': return "\xc5\x83"; - case 'O': return "\xce\x98"; - case 'P': return "\xcf\x81"; - case 'Q': return "\x71"; - case 'R': return "\xd0\xaf"; - case 'S': return "\xc8\x98"; - case 'T': return "\xc5\xa6"; - case 'U': return "\xc5\xa8"; - case 'V': return "\xce\xbd"; - case 'W': return "\xe1\xba\x84"; - case 'X': return "\xc3\x97"; - case 'Y': return "\xc2\xa5"; - case 'Z': return "\xc5\xbd"; - default: return NULL; - } -} - -/** - * Converts characters so they look like they've been localized. - * - * Note: This leaves escape sequences untouched so they can later be - * processed by ResTable::collectString in the normal way. - */ -string -pseudolocalize_string(const string& source) -{ - const char* s = source.c_str(); - string result; - const size_t I = source.length(); - for (size_t i=0; i<I; i++) { - char c = s[i]; - if (c == '\\') { - if (i<I-1) { - result += '\\'; - i++; - c = s[i]; - switch (c) { - case 'u': - // this one takes up 5 chars - result += string(s+i, 5); - i += 4; - break; - case 't': - case 'n': - case '#': - case '@': - case '?': - case '"': - case '\'': - case '\\': - default: - result += c; - break; - } - } else { - result += c; - } - } else { - const char* p = pseudolocalize_char(c); - if (p != NULL) { - result += p; - } else { - result += c; - } - } - } - - //printf("result=\'%s\'\n", result.c_str()); - return result; -} - - diff --git a/target/board/Android.mk b/target/board/Android.mk index 7d94ee0..f8ecc4e 100644 --- a/target/board/Android.mk +++ b/target/board/Android.mk @@ -2,24 +2,6 @@ # Set up product-global definitions and include product-specific rules. # -ifneq ($(strip $(TARGET_NO_BOOTLOADER)),true) - INSTALLED_BOOTLOADER_MODULE := $(PRODUCT_OUT)/bootloader - ifeq ($(strip $(TARGET_BOOTLOADER_IS_2ND)),true) - INSTALLED_2NDBOOTLOADER_TARGET := $(PRODUCT_OUT)/2ndbootloader - else - INSTALLED_2NDBOOTLOADER_TARGET := - endif -else - INSTALLED_BOOTLOADER_MODULE := - INSTALLED_2NDBOOTLOADER_TARGET := -endif # TARGET_NO_BOOTLOADER - -ifneq ($(strip $(TARGET_NO_KERNEL)),true) - INSTALLED_KERNEL_TARGET := $(PRODUCT_OUT)/kernel -else - INSTALLED_KERNEL_TARGET := -endif - -include $(TARGET_DEVICE_DIR)/AndroidBoard.mk # Generate a file that contains various information about the diff --git a/target/board/vbox_x86/BoardConfig.mk b/target/board/vbox_x86/BoardConfig.mk index 80a9077..815ad9e 100644 --- a/target/board/vbox_x86/BoardConfig.mk +++ b/target/board/vbox_x86/BoardConfig.mk @@ -9,7 +9,6 @@ TARGET_NO_RECOVERY := true TARGET_HARDWARE_3D := false BOARD_USES_GENERIC_AUDIO := true USE_CAMERA_STUB := true -TARGET_PROVIDES_INIT_RC := true TARGET_CPU_ABI := x86 TARGET_USERIMAGES_USE_EXT4 := true TARGET_BOOTIMAGE_USE_EXT2 := true diff --git a/target/board/vbox_x86/device.mk b/target/board/vbox_x86/device.mk index 2bb96b9..a44a87f 100644 --- a/target/board/vbox_x86/device.mk +++ b/target/board/vbox_x86/device.mk @@ -30,7 +30,6 @@ PRODUCT_COPY_FILES := \ device/generic/goldfish/data/etc/apns-conf.xml:system/etc/apns-conf.xml \ device/generic/goldfish/camera/media_profiles.xml:system/etc/media_profiles.xml \ device/generic/goldfish/camera/media_codecs.xml:system/etc/media_codecs.xml \ - system/core/rootdir/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/base.mk b/target/product/base.mk index ebb341c..25df921 100644 --- a/target/product/base.mk +++ b/target/product/base.mk @@ -32,6 +32,7 @@ PRODUCT_PACKAGES += \ framework \ fsck_msdos \ ime \ + inputflinger \ javax.obex \ libSR_AudioIn \ libandroid \ @@ -44,9 +45,9 @@ PRODUCT_PACKAGES += \ libcameraservice \ libchromium_net \ libdl \ - libdrm1 \ - libdrm1_jni \ libeffects \ + libinput \ + libinputflinger \ libiprouteutil \ libjni_latinime \ libjnigraphics \ @@ -56,6 +57,7 @@ PRODUCT_PACKAGES += \ libmtp \ libnetlink \ libnetutils \ + libpac \ libreference-ril \ libreverbwrapper \ libril \ @@ -72,7 +74,6 @@ PRODUCT_PACKAGES += \ libstagefright_foundation \ libstagefright_omx \ libstagefright_yuv \ - libsystem_server \ libusbhost \ libutils \ libvisualizer \ @@ -86,6 +87,7 @@ PRODUCT_PACKAGES += \ ndc \ netcfg \ netd \ + pacserver \ ping \ ping6 \ platform.xml \ @@ -99,7 +101,6 @@ PRODUCT_PACKAGES += \ services \ settings \ svc \ - system_server \ tc \ vdc \ vold \ diff --git a/target/product/core.mk b/target/product/core.mk index d503ddc..ddbc2ac 100644 --- a/target/product/core.mk +++ b/target/product/core.mk @@ -19,79 +19,16 @@ # devices (including non-phones and non-tablets), modify # core_minimal.mk instead. -PRODUCT_PROPERTY_OVERRIDES := \ - ro.config.notification_sound=OnTheHunt.ogg \ - ro.config.alarm_alert=Alarm_Classic.ogg - PRODUCT_PACKAGES += \ BasicDreams \ Browser \ Contacts \ - ContactsProvider \ - DefaultContainerService \ - Home \ + DocumentsUI \ + ExternalStorageProvider \ KeyChain \ PicoTts \ + ProxyHandler \ SharedStorageBackup \ - TelephonyProvider \ - UserDictionaryProvider \ - VpnDialogs \ - atrace \ - libandroidfw \ - libaudiopreprocessing \ - libaudioutils \ - libbcc \ - libfilterpack_imageproc \ - libgabi++ \ - libkeystore \ - libmdnssd \ - libnfc_ndef \ - libportable \ - libpowermanager \ - libspeexresampler \ - libstagefright_chromium_http \ - libstagefright_soft_aacdec \ - libstagefright_soft_aacenc \ - libstagefright_soft_amrdec \ - libstagefright_soft_amrnbenc \ - libstagefright_soft_amrwbenc \ - libstagefright_soft_flacenc \ - libstagefright_soft_g711dec \ - libstagefright_soft_gsmdec \ - libstagefright_soft_h264dec \ - libstagefright_soft_h264enc \ - libstagefright_soft_mp3dec \ - libstagefright_soft_mpeg4dec \ - libstagefright_soft_mpeg4enc \ - libstagefright_soft_rawdec \ - libstagefright_soft_vorbisdec \ - libstagefright_soft_vpxdec \ - libstagefright_soft_vpxenc \ - libvariablespeed \ - libwebrtc_audio_preprocessing \ - mdnsd \ - mms-common \ - okhttp \ - requestsync \ - telephony-common \ - voip-common - -# host-only dependencies -ifeq ($(WITH_HOST_DALVIK),true) - PRODUCT_PACKAGES += \ - apache-xml-hostdex \ - bouncycastle-hostdex \ - conscrypt-hostdex \ - core-hostdex \ - okhttp-hostdex \ - libcrypto \ - libexpat \ - libicui18n \ - libicuuc \ - libjavacore \ - libssl \ - libz-host \ - dalvik -endif + VpnDialogs -$(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk) +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_base.mk) diff --git a/target/product/core_base.mk b/target/product/core_base.mk new file mode 100644 index 0000000..cde2b85 --- /dev/null +++ b/target/product/core_base.mk @@ -0,0 +1,71 @@ +# +# Copyright (C) 2013 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. +# +# Note that components added here will be also shared in PDK. Components +# that should not be in PDK should be added in lower level like core.mk. + +PRODUCT_PROPERTY_OVERRIDES := \ + ro.config.notification_sound=OnTheHunt.ogg \ + ro.config.alarm_alert=Alarm_Classic.ogg + +PRODUCT_PACKAGES += \ + ContactsProvider \ + DefaultContainerService \ + Home \ + TelephonyProvider \ + UserDictionaryProvider \ + atrace \ + libandroidfw \ + libaudiopreprocessing \ + libaudioutils \ + libbcc \ + libfilterpack_imageproc \ + libgabi++ \ + libkeystore \ + libmdnssd \ + libnfc_ndef \ + libportable \ + libpowermanager \ + libspeexresampler \ + libstagefright_chromium_http \ + libstagefright_soft_aacdec \ + libstagefright_soft_aacenc \ + libstagefright_soft_amrdec \ + libstagefright_soft_amrnbenc \ + libstagefright_soft_amrwbenc \ + libstagefright_soft_flacenc \ + libstagefright_soft_g711dec \ + libstagefright_soft_gsmdec \ + libstagefright_soft_h264dec \ + libstagefright_soft_h264enc \ + libstagefright_soft_mp3dec \ + libstagefright_soft_mpeg4dec \ + libstagefright_soft_mpeg4enc \ + libstagefright_soft_rawdec \ + libstagefright_soft_vorbisdec \ + libstagefright_soft_vpxdec \ + libstagefright_soft_vpxenc \ + libvariablespeed \ + libwebrtc_audio_preprocessing \ + mdnsd \ + mms-common \ + requestsync \ + screenrecord \ + telephony-common \ + voip-common + +$(call inherit-product, $(SRC_TARGET_DIR)/product/core_minimal.mk) +# Override the PRODUCT_BOOT_JARS set in core_minimal.mk +PRODUCT_BOOT_JARS := core:conscrypt:okhttp:core-junit:bouncycastle:ext:framework:framework2:telephony-common:voip-common:mms-common:android.policy:services:apache-xml:webviewchromium diff --git a/target/product/core_minimal.mk b/target/product/core_minimal.mk index 4c2cdfb..04e05a4 100644 --- a/target/product/core_minimal.mk +++ b/target/product/core_minimal.mk @@ -32,26 +32,11 @@ PRODUCT_PACKAGES += \ PackageInstaller \ SettingsProvider \ Shell \ - apache-xml \ - bouncycastle \ bu \ - cacerts \ com.android.location.provider \ com.android.location.provider.xml \ - conscrypt \ - core \ - core-junit \ - dalvikvm \ - dexdeps \ - dexdump \ - dexlist \ - dexopt \ - dmtracedump \ drmserver \ - dx \ - ext \ framework-res \ - hprof-conv \ installd \ ip \ ip-up-vpn \ @@ -61,24 +46,22 @@ PRODUCT_PACKAGES += \ keystore.default \ libOpenMAXAL \ libOpenSLES \ - libcrypto \ libdownmix \ - libdvm \ libdrmframework \ libdrmframework_jni \ - libexpat \ libfilterfw \ - libicui18n \ - libicuuc \ - libjavacore \ - libnativehelper \ libsqlite_jni \ - libssl \ libwilhelm \ - libz \ make_ext4fs \ screencap \ sensorservice \ uiautomator +PRODUCT_BOOT_JARS := core:conscrypt:okhttp:core-junit:bouncycastle:ext:framework:framework2:android.policy:services:apache-xml:webviewchromium + +PRODUCT_RUNTIMES := runtime_libdvm_default +ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT))) + PRODUCT_RUNTIMES += runtime_libart +endif + $(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk) diff --git a/target/product/embedded.mk b/target/product/embedded.mk index 0830101..11e02ae 100644 --- a/target/product/embedded.mk +++ b/target/product/embedded.mk @@ -26,7 +26,10 @@ PRODUCT_PACKAGES += \ dumpsys \ gralloc.default \ gzip \ + healthd \ init \ + init.environ.rc \ + init.rc \ input \ libEGL \ libETC1 \ @@ -58,6 +61,7 @@ PRODUCT_PACKAGES += \ linker \ logcat \ logwrapper \ + reboot \ service \ servicemanager \ surfaceflinger \ @@ -71,6 +75,9 @@ PRODUCT_PACKAGES += \ property_contexts \ mac_permissions.xml + PRODUCT_COPY_FILES += \ system/core/rootdir/init.usb.rc:root/init.usb.rc \ system/core/rootdir/init.trace.rc:root/init.trace.rc \ + system/core/rootdir/ueventd.rc:root/ueventd.rc \ + system/core/rootdir/etc/hosts:system/etc/hosts diff --git a/target/product/generic_no_telephony.mk b/target/product/generic_no_telephony.mk index 2c71ed5..074a0a6 100644 --- a/target/product/generic_no_telephony.mk +++ b/target/product/generic_no_telephony.mk @@ -24,23 +24,26 @@ PRODUCT_PACKAGES := \ Bluetooth \ Calculator \ Calendar \ + Camera2 \ CertInstaller \ - DrmProvider \ Email \ Exchange2 \ FusedLocation \ Gallery2 \ InputDevices \ + Keyguard \ LatinIME \ Launcher2 \ Music \ MusicFX \ OneTimeInitializer \ + PrintSpooler \ Provision \ - Phone \ QuickSearchBox \ Settings \ SystemUI \ + TeleService \ + Terminal \ CalendarProvider \ bluetooth-health \ hostapd \ diff --git a/target/product/large_emu_hw.mk b/target/product/large_emu_hw.mk index 8a070b1..a918c1d 100644 --- a/target/product/large_emu_hw.mk +++ b/target/product/large_emu_hw.mk @@ -26,7 +26,6 @@ PRODUCT_PACKAGES := \ Calculator \ Calendar \ CertInstaller \ - DrmProvider \ Email \ Exchange2 \ Gallery2 \ diff --git a/target/product/mini.mk b/target/product/mini.mk deleted file mode 100644 index c1074f7..0000000 --- a/target/product/mini.mk +++ /dev/null @@ -1,226 +0,0 @@ -# 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. - -# Common configurations for mini_XXX lunch targets -# This is mainly for creating small system image during early development stage. - -PRODUCT_BRAND := mini -PRODUCT_DEVICE := mini -PRODUCT_NAME := mini - -# add all configurations -PRODUCT_AAPT_CONFIG := normal ldpi mdpi hdpi xhdpi xxhdpi -PRODUCT_AAPT_PREF_CONFIG := hdpi - -# en_US only -PRODUCT_LOCALES := en_US - -# dummy definitions to use += in later parts -PRODUCT_PROPERTY_OVERRIDES := -PRODUCT_COPY_FILES := - - -# for CtsVerifier -PRODUCT_PACKAGES += \ - com.android.future.usb.accessory - -# It does not mean that all features are supproted, but only for meeting -# configuration requirements for some CTS -PRODUCT_COPY_FILES += \ - frameworks/native/data/etc/handheld_core_hardware.xml:system/etc/permissions/handheld_core_hardware.xml \ - frameworks/native/data/etc/android.hardware.location.gps.xml:system/etc/permissions/android.hardware.location.gps.xml \ - frameworks/native/data/etc/android.hardware.sensor.light.xml:system/etc/permissions/android.hardware.sensor.light.xml \ - frameworks/native/data/etc/android.hardware.sensor.barometer.xml:system/etc/permissions/android.hardware.sensor.barometer.xml \ - frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:system/etc/permissions/android.hardware.sensor.gyroscope.xml \ - frameworks/native/data/etc/android.hardware.usb.accessory.xml:system/etc/permissions/android.hardware.usb.accessory.xml - -#----------------- originally from core.mk ---------------- - -PRODUCT_PROPERTY_OVERRIDES += \ - ro.config.notification_sound=OnTheHunt.ogg \ - ro.config.alarm_alert=Alarm_Classic.ogg - -# Please keep this list sorted alphabetically -PRODUCT_PACKAGES += \ - ApplicationsProvider \ - ContactsProvider \ - DefaultContainerService \ - DownloadProvider \ - DownloadProviderUi \ - MediaProvider \ - PackageInstaller \ - SettingsProvider \ - Shell \ - TelephonyProvider \ - UserDictionaryProvider \ - apache-xml \ - audio \ - bouncycastle \ - bu \ - cacerts \ - com.android.location.provider \ - com.android.location.provider.xml \ - conscrypt \ - core \ - core-junit \ - dalvikvm \ - dexdeps \ - dexdump \ - dexlist \ - dexopt \ - dmtracedump \ - drmserver \ - dx \ - ext \ - framework-res \ - hprof-conv \ - installd \ - ip \ - ip-up-vpn \ - ip6tables \ - iptables \ - keystore \ - keystore.default \ - libandroidfw \ - libOpenMAXAL \ - libOpenSLES \ - libaudiopreprocessing \ - libaudioutils \ - libbcc \ - libcrypto \ - libdownmix \ - libdvm \ - libdrmframework \ - libdrmframework_jni \ - libexpat \ - libfilterfw \ - libfilterpack_imageproc \ - libgabi++ \ - libicui18n \ - libicuuc \ - libjavacore \ - libkeystore \ - libmdnssd \ - libnativehelper \ - libnfc_ndef \ - libportable \ - libpowermanager \ - libspeexresampler \ - libsqlite_jni \ - libssl \ - libstagefright \ - libstagefright_chromium_http \ - libstagefright_soft_aacdec \ - libstagefright_soft_aacenc \ - libstagefright_soft_amrdec \ - libstagefright_soft_amrnbenc \ - libstagefright_soft_amrwbenc \ - libstagefright_soft_flacenc \ - libstagefright_soft_g711dec \ - libstagefright_soft_gsmdec \ - libstagefright_soft_h264dec \ - libstagefright_soft_h264enc \ - libstagefright_soft_mp3dec \ - libstagefright_soft_mpeg4dec \ - libstagefright_soft_mpeg4enc \ - libstagefright_soft_vorbisdec \ - libstagefright_soft_vpxdec \ - libstagefright_soft_rawdec \ - libvariablespeed \ - libwebrtc_audio_preprocessing \ - libwilhelm \ - libz \ - mdnsd \ - network \ - okhttp \ - pand \ - requestsync \ - screencap \ - sdptool \ - sensorservice \ - lint \ - telephony-common \ - voip-common \ - mms-common - -PRODUCT_COPY_FILES += \ - system/core/rootdir/init.usb.rc:root/init.usb.rc \ - -#----------------- originally from generic_no_telephony.mk ---------------- - -PRODUCT_PACKAGES += \ - Bluetooth \ - FusedLocation \ - InputDevices \ - LatinIME \ - Phone \ - Provision \ - hostapd \ - wpa_supplicant.conf - -PRODUCT_PACKAGES += \ - librs_jni \ - libvideoeditor_jni \ - libvideoeditor_core \ - libvideoeditor_osal \ - libvideoeditor_videofilters \ - libvideoeditorplayer \ - -PRODUCT_PACKAGES += \ - audio.primary.default \ - audio_policy.default \ - local_time.default \ - power.default - -PRODUCT_PACKAGES += \ - local_time.default - -PRODUCT_COPY_FILES += \ - frameworks/av/media/libeffects/data/audio_effects.conf:system/etc/audio_effects.conf - -PRODUCT_PROPERTY_OVERRIDES += \ - ro.carrier=unknown - -#----------------- originally from full_base.mk ---------------- - -PRODUCT_PACKAGES += \ - drmserver \ - libdrmframework \ - libdrmframework_jni \ - WAPPushManager - - -# Additional settings used in all AOSP builds -PRODUCT_PROPERTY_OVERRIDES += \ - ro.com.android.dateformat=MM-dd-yyyy \ - ro.config.ringtone=Ring_Synth_04.ogg \ - ro.config.notification_sound=pixiedust.ogg - -$(call inherit-product, $(SRC_TARGET_DIR)/product/base.mk) -$(call inherit-product-if-exists, frameworks/base/data/keyboards/keyboards.mk) -$(call inherit-product-if-exists, frameworks/base/data/fonts/fonts.mk) -$(call inherit-product-if-exists, frameworks/base/data/sounds/AudioPackage5.mk) - -#----------------- For PDK ------------------------------ -PRODUCT_PACKAGES += \ - TestingCamera \ - Home \ - SystemUI \ - Settings \ - libsurfaceflinger_ddmconnection - -# This is not necessary for mini, but is for mini-emulator as it should -# be included in platform.zip -PRODUCT_PACKAGES += camera.goldfish.jpeg - diff --git a/target/product/runtime_common.mk b/target/product/runtime_common.mk new file mode 100644 index 0000000..faa6fe8 --- /dev/null +++ b/target/product/runtime_common.mk @@ -0,0 +1,58 @@ +# +# Copyright (C) 2013 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. +# + +# Common runtime modules for both Dalvik and ART + +PRODUCT_PACKAGES += \ + apache-xml \ + bouncycastle \ + cacerts \ + conscrypt \ + core-junit \ + dalvikvm \ + dexdeps \ + dexdump \ + dexlist \ + dmtracedump \ + dx \ + ext \ + hprof-conv \ + libcrypto \ + libexpat \ + libicui18n \ + libicuuc \ + libjavacore \ + libnativehelper \ + libssl \ + libz \ + okhttp + +# host-only dependencies +ifeq ($(WITH_HOST_DALVIK),true) + PRODUCT_PACKAGES += \ + apache-xml-hostdex \ + bouncycastle-hostdex \ + conscrypt-hostdex \ + dalvik \ + libcrypto-host \ + libexpat-host \ + libicui18n-host \ + libicuuc-host \ + libjavacore \ + libssl-host \ + libz-host \ + okhttp-hostdex +endif diff --git a/target/product/runtime_libart.mk b/target/product/runtime_libart.mk new file mode 100644 index 0000000..b127dad --- /dev/null +++ b/target/product/runtime_libart.mk @@ -0,0 +1,30 @@ +# +# Copyright (C) 2013 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. +# + +# Provides a functioning ART environment without Android frameworks + +PRODUCT_PACKAGES += \ + core-libart \ + libart \ + dex2oat + +# host-only dependencies +ifeq ($(WITH_HOST_DALVIK),true) + PRODUCT_PACKAGES += \ + core-libart-hostdex +endif + +include $(SRC_TARGET_DIR)/product/runtime_common.mk diff --git a/target/product/runtime_libart_default.mk b/target/product/runtime_libart_default.mk new file mode 100644 index 0000000..575ca04 --- /dev/null +++ b/target/product/runtime_libart_default.mk @@ -0,0 +1,22 @@ +# +# Copyright (C) 2013 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. +# + +# Set ART as the default runtime environment + +PRODUCT_PROPERTY_OVERRIDES += \ + persist.sys.dalvik.vm.lib=libart.so + +include $(SRC_TARGET_DIR)/product/runtime_libart.mk diff --git a/target/product/runtime_libdvm.mk b/target/product/runtime_libdvm.mk new file mode 100644 index 0000000..e7647b8 --- /dev/null +++ b/target/product/runtime_libdvm.mk @@ -0,0 +1,30 @@ +# +# Copyright (C) 2013 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. +# + +# Provides a functioning Dalvik environment without Android frameworks + +PRODUCT_PACKAGES += \ + core \ + libdvm \ + dexopt + +# host-only dependencies +ifeq ($(WITH_HOST_DALVIK),true) + PRODUCT_PACKAGES += \ + core-hostdex +endif + +include $(SRC_TARGET_DIR)/product/runtime_common.mk diff --git a/target/product/runtime_libdvm_default.mk b/target/product/runtime_libdvm_default.mk new file mode 100644 index 0000000..3ae4130 --- /dev/null +++ b/target/product/runtime_libdvm_default.mk @@ -0,0 +1,22 @@ +# +# Copyright (C) 2013 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. +# + +# Set Dalvik as the default runtime environment + +PRODUCT_PROPERTY_OVERRIDES += \ + persist.sys.dalvik.vm.lib=libdvm.so + +include $(SRC_TARGET_DIR)/product/runtime_libdvm.mk diff --git a/target/product/sdk.mk b/target/product/sdk.mk index 51b90f5..b3640a9 100644 --- a/target/product/sdk.mk +++ b/target/product/sdk.mk @@ -24,9 +24,11 @@ PRODUCT_PACKAGES := \ Exchange2 \ FusedLocation \ Gallery \ + Keyguard \ Music \ Mms \ OpenWnn \ + PrintSpooler \ libWnnEngDic \ libWnnJpnDic \ libwnndict \ @@ -38,7 +40,6 @@ PRODUCT_PACKAGES := \ Launcher2 \ Development \ DevelopmentSettings \ - DrmProvider \ Fallback \ Settings \ SdkSetup \ diff --git a/target/product/telephony.mk b/target/product/telephony.mk index da1497d..453f156 100644 --- a/target/product/telephony.mk +++ b/target/product/telephony.mk @@ -18,6 +18,7 @@ # to products that have telephony hardware. PRODUCT_PACKAGES := \ + InCallUI \ Dialer \ Mms \ rild diff --git a/tools/Android.mk b/tools/Android.mk index f646c37..30febd6 100644 --- a/tools/Android.mk +++ b/tools/Android.mk @@ -14,10 +14,10 @@ # limitations under the License. # -ifeq (,$(TARGET_BUILD_APPS)) - LOCAL_PATH := $(call my-dir) +ifeq (,$(TARGET_BUILD_APPS)) + ifeq ($(TARGET_BUILD_PDK),true) include $(filter-out %/acp/Android.mk %/signapk/Android.mk %/zipalign/Android.mk,\ $(call all-makefiles-under,$(LOCAL_PATH))) @@ -25,4 +25,8 @@ else # !PDK include $(call all-makefiles-under,$(LOCAL_PATH)) endif # PDK +else # TARGET_BUILD_APPS + +include $(LOCAL_PATH)/apicheck/Android.mk + endif diff --git a/tools/droiddoc/templates-sdk/assets/css/default.css b/tools/droiddoc/templates-sdk/assets/css/default.css index 3bfb687..d11a862 100644 --- a/tools/droiddoc/templates-sdk/assets/css/default.css +++ b/tools/droiddoc/templates-sdk/assets/css/default.css @@ -338,7 +338,8 @@ video.with-shadow { width: 34px; height: 34px; } #nav li.expanded li ul.tree-list-children { - padding:0; + display:block; /*dd temporary for debug */ + padding: 0 0 0 10px; } #nav li.expanded li ul.tree-list-children .tree-list-children { padding:0 0 0 10px; @@ -957,7 +958,7 @@ scroll top left; background-image: url(../images/styles/ico_wrong.png); } .do-dont-label.good { background-image: url(../images/styles/ico_good.png); } - + @@ -2358,6 +2359,9 @@ div.toggle-content.closed .toggle-content-toggleme { #jd-content img.toggle-content-img { margin:0 5px 5px 0; } +div.toggle-content p { + margin:10px 0 0; +} div.toggle-content-toggleme { padding:0 0 0 15px; } @@ -2443,6 +2447,144 @@ Lightbox background-position: -10px 0; } + +/* Styles for toggleable divs */ +.toggleable { + padding: .25em 1em 0em 1em; + margin-bottom: 0; +} +.toggleme { + padding: 1em 1em 0 2em; + line-height:1em; +} +.toggleable a { + text-decoration:none; +} +.toggleme a { + text-decoration:underline; +} + +.toggleable.closed .toggleme { + display:none; +} +#jd-content .toggle-img { + margin:0; +} + +/* -------------------------------------------------------------------------- +Styles for samples project trees and code browsing in resources tab +*/ + +.structure-dir { +background-image:url(../../assets/images/folder.png); +background-repeat:no-repeat; +background-position:16px 2px; + margin:.25em 0 0 0; + padding:0 0 0 0; +} + +.structure-toggleme { + margin:0 0 0 3em; + padding:0 0 0 0; + text-decoration:none; +} + +.structure-java{ +background-image:url(../../assets/images/file-java.png); +background-repeat:no-repeat; +background-position:0px 2px; + margin:.3em 0 0 0; + padding:.3em 0 .3em 22px; +} + +.structure-file { +background-image:url(../../assets/images/file-generic.png); +background-repeat:no-repeat; +background-position:0px 2px; + margin:.3em 0 0 0; + padding:.3em 0 .3em 22px; +} + +.structure-xml { +background-image:url(../../assets/images/file-xml.png); +background-repeat:no-repeat; +background-position:0px 2px; + margin:.3em 0 0 0; + padding:.3em 0 .25em 22px; +} + +.structure-img { +background-image:url(../../assets/images/file-image.png); +background-repeat:no-repeat; +background-position:0px 2px; + margin:.3em 0 0 0; + padding:.3em 0 .25em 22px; +} + +.structure-manifest { +background-image:url(../../assets/images/file-manifest.png); +background-repeat:no-repeat; + margin:.0 0 0 1.25em; + padding:0 0 0 22px; + text-decoration:none; +} + +#jd-content .structure-toggle-img { + margin:.5em 0 0 0; +padding-right:2.1em; +} + +.dirInfo { + margin-left:2em; +} + +.structure-dir a { + text-decoration:none; +} + +.structure-manifest a { + text-decoration: none; +} +.structure-file a { + text-decoration: none; +} + +.sampleEmbed { + background-color:rgb(249, 249, 249); +} + +.sampleEmbed ol.lineNumbers { + list-style-type: decimal; + padding-left:1em; +} + +.sampleEmbed ol.lineNumbers li { +border-left:1px solid #ddd; +border-right:1px solid #ddd; +color:gray; +background-color:#f7f7f7; +margin:0 0 0 24px; +padding: 2px 2px 2px 6px; +} + +.sampleEmbed ol.lineNumbers li:hover { +background: #efefef; +} + +/* -------------------------------------------------------------------------- +Styles for raw formatted line numbers (not used with listformatted version) +div.sampleLine div.lineNumber { + display: inline; +} +div.sampleLine div.lineCode { + display: inline; + padding-left:6px; +} +div.sampleLine { + padding:0; + margin:0; +}*/ + /* -------------------------------------------------------------------------- Butterbar */ @@ -2489,7 +2631,7 @@ table.blank th, table.blank td { .caption { margin: 0.5em 0 2em 0; color: #000; - font-size: 11.5px; + font-size: 11.5px; } .nolist { diff --git a/tools/droiddoc/templates-sdk/assets/images/file-generic.png b/tools/droiddoc/templates-sdk/assets/images/file-generic.png Binary files differnew file mode 100644 index 0000000..1802457 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/file-generic.png diff --git a/tools/droiddoc/templates-sdk/assets/images/file-image.png b/tools/droiddoc/templates-sdk/assets/images/file-image.png Binary files differnew file mode 100644 index 0000000..d3aec46 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/file-image.png diff --git a/tools/droiddoc/templates-sdk/assets/images/file-java.png b/tools/droiddoc/templates-sdk/assets/images/file-java.png Binary files differnew file mode 100644 index 0000000..ec85e4b --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/file-java.png diff --git a/tools/droiddoc/templates-sdk/assets/images/file-manifest.png b/tools/droiddoc/templates-sdk/assets/images/file-manifest.png Binary files differnew file mode 100644 index 0000000..332d066 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/file-manifest.png diff --git a/tools/droiddoc/templates-sdk/assets/images/file-xml.png b/tools/droiddoc/templates-sdk/assets/images/file-xml.png Binary files differnew file mode 100644 index 0000000..3dd21b6 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/file-xml.png diff --git a/tools/droiddoc/templates-sdk/assets/images/folder.png b/tools/droiddoc/templates-sdk/assets/images/folder.png Binary files differnew file mode 100644 index 0000000..44c6100 --- /dev/null +++ b/tools/droiddoc/templates-sdk/assets/images/folder.png diff --git a/tools/droiddoc/templates-sdk/assets/js/docs.js b/tools/droiddoc/templates-sdk/assets/js/docs.js index fa7554b..86b7aa1 100644 --- a/tools/droiddoc/templates-sdk/assets/js/docs.js +++ b/tools/droiddoc/templates-sdk/assets/js/docs.js @@ -183,12 +183,13 @@ $(document).ready(function() { $("#nav-x li.google a").addClass("selected"); } else { $("#nav-x li.reference a").addClass("selected"); - changeApiLevel(); // turn things grey } } else if ((rootDir == "tools") || (rootDir == "sdk")) { $("#nav-x li.tools a").addClass("selected"); } else if ($("body").hasClass("google")) { $("#nav-x li.google a").addClass("selected"); + } else if ($("body").hasClass("samples")) { + $("#nav-x li.samples a").addClass("selected"); } // highlight Distribute tab @@ -641,13 +642,6 @@ function updateSideNavPosition() { $('#devdoc-nav .totop').css({left: -(newLeft - parseInt($('#side-nav').css('margin-left')))}); } - - - - - - - // TODO: use $(document).ready instead function addLoadEvent(newfun) { var current = window.onload; @@ -825,14 +819,13 @@ function scrollIntoView(nav) { // If no selected item found, exit return; } - - var selectedOffset = $selected.offset().top; // measure offset from top, relative to entire page - if (selectedOffset > $nav.height() * .8) { // multiply nav height by .8 so we move up any - // items more than 80% down the nav - // scroll the item up by an amount 125px less than the window height (account for site header) - // and then multiply nav height by .8 to match the 80% threshold used above - api.scrollTo(0, selectedOffset - 125 - ($nav.height() * .8), false); - + // get the selected item's offset from its container nav by measuring the item's offset + // relative to the document then subtract the container nav's offset relative to the document + var selectedOffset = $selected.offset().top - $nav.offset().top; + if (selectedOffset > $nav.height() * .8) { // multiply nav height by .8 so we move up the item + // if it's more than 80% down the nav + // scroll the item up by an amount equal to 80% the container nav's height + api.scrollTo(0, selectedOffset - ($nav.height() * .8), false); } } } @@ -2232,10 +2225,10 @@ function escapeHTML(string) { /* ######################################################## */ /* Initialize some droiddoc stuff, but only if we're in the reference */ -if (location.pathname.indexOf("/reference")) { - if(!location.pathname.indexOf("/reference-gms/packages.html") - && !location.pathname.indexOf("/reference-gcm/packages.html") - && !location.pathname.indexOf("/reference/com/google") == 0) { +if (location.pathname.indexOf("/reference") == 0) { + if(!(location.pathname.indexOf("/reference-gms/packages.html") == 0) + && !(location.pathname.indexOf("/reference-gcm/packages.html") == 0) + && !(location.pathname.indexOf("/reference/com/google") == 0)) { $(document).ready(function() { // init available apis based on user pref changeApiLevel(); @@ -2579,6 +2572,13 @@ function init_navtree(navtree_id, toroot, root_nodes) } } + + + + + + + /* TODO: eliminate redundancy with non-google functions */ function init_google_navtree(navtree_id, toroot, root_nodes) { @@ -2693,6 +2693,22 @@ function init_default_gcm_navtree(toroot) { }); } +function showSamplesRefTree() { + init_default_samples_navtree(toRoot); +} + +function init_default_samples_navtree(toroot) { + // load json file for navtree data + $.getScript(toRoot + 'samples_navtree_data.js', function(data, textStatus, jqxhr) { + // when the file is loaded, initialize the tree + if(jqxhr.status === 200) { + init_google_navtree("samples-tree-list", toroot, SAMPLES_NAVTREE_DATA); + highlightSidenav(); + resizeNav(); + } + }); +} + /* TOGGLE INHERITED MEMBERS */ /* Toggle an inherited class (arrow toggle) diff --git a/tools/droiddoc/templates-sdk/components/masthead.cs b/tools/droiddoc/templates-sdk/components/masthead.cs index 4f3273c..78e53b2 100644 --- a/tools/droiddoc/templates-sdk/components/masthead.cs +++ b/tools/droiddoc/templates-sdk/components/masthead.cs @@ -188,6 +188,10 @@ onkeyup="return search_changed(event, false, '<?cs var:toroot ?>')" /> </li> <li><a href="<?cs var:toroot ?>google/index.html">Google Services</a> </li> + <?cs if:android.hasSamples ?> + <li><a href="<?cs var:toroot ?>samples/index.html">Samples</a> + </li> + <?cs /if ?> </ul> </li> <li class="distribute last"> @@ -214,7 +218,7 @@ onkeyup="return search_changed(event, false, '<?cs var:toroot ?>')" /> </div> - <?cs if:training || guide || reference || tools || develop || google ?> + <?cs if:training || guide || reference || tools || develop || google || samples ?> <!-- Secondary x-nav --> <div id="nav-x"> <div class="wrap"> @@ -254,6 +258,10 @@ onkeyup="return search_changed(event, false, '<?cs var:toroot ?>')" /> <li class="google"><a href="<?cs var:toroot ?>google/index.html" >Google Services</a> </li> + <?cs if:android.hasSamples ?> + <li><a href="<?cs var:toroot ?>samples/index.html">Samples</a> + </li> + <?cs /if ?> </ul> </div> diff --git a/tools/droiddoc/templates-sdk/customizations.cs b/tools/droiddoc/templates-sdk/customizations.cs index 33edbde..985f059 100644 --- a/tools/droiddoc/templates-sdk/customizations.cs +++ b/tools/droiddoc/templates-sdk/customizations.cs @@ -135,20 +135,20 @@ def:distribute_nav() ?> <?cs /def ?> <?cs -def:google_nav() ?> +def:samples_nav() ?> <div class="wrap clearfix" id="body-content"> <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> <div id="devdoc-nav" class="scroll-pane"> <a class="totop" href="#top" data-g-event="left-nav-top">to top</a> <?cs - include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?> - + include:"../../../../frameworks/base/docs/html/samples/samples_toc.cs" ?> + </div> <script type="text/javascript"> - showGoogleRefTree(); - + showSamplesRefTree(); + </script> </div> <!-- end side-nav --> <script> @@ -159,17 +159,21 @@ def:google_nav() ?> <?cs /def ?> <?cs -def:about_nav() ?> +def:google_nav() ?> <div class="wrap clearfix" id="body-content"> - <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> <div id="devdoc-nav" class="scroll-pane"> <a class="totop" href="#top" data-g-event="left-nav-top">to top</a> <?cs - include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?> + include:"../../../../frameworks/base/docs/html/google/google_toc.cs" ?> </div> + <script type="text/javascript"> + showGoogleRefTree(); + + </script> </div> <!-- end side-nav --> <script> $(document).ready(function() { @@ -177,16 +181,16 @@ def:about_nav() ?> }); </script> <?cs /def ?> + <?cs -def:dist_more_nav() ?> +def:about_nav() ?> <div class="wrap clearfix" id="body-content"> - <div class="col-4" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <div class="col-3" id="side-nav" itemscope itemtype="http://schema.org/SiteNavigationElement"> <div id="devdoc-nav" class="scroll-pane"> <a class="totop" href="#top" data-g-event="left-nav-top">to top</a> - -<?cs - include:"../../../../frameworks/base/docs/html/distribute/more/more_toc.cs" ?> +<?cs + include:"../../../../frameworks/base/docs/html/about/about_toc.cs" ?> </div> @@ -196,9 +200,8 @@ def:dist_more_nav() ?> scrollIntoView("devdoc-nav"); }); </script> -: - <?cs /def ?> + <?cs # The default side navigation for the reference docs ?><?cs def:default_left_nav() ?> <?cs if:reference.gcm || reference.gms ?> @@ -322,6 +325,8 @@ def:custom_left_nav() ?><?cs call:tools_nav() ?><?cs elif:google ?><?cs call:google_nav() ?><?cs + elif:samples ?><?cs + call:samples_nav() ?><?cs elif:more ?><?cs call:dist_more_nav() ?><?cs elif:distribute ?><?cs diff --git a/tools/droiddoc/templates-sdk/docpage.cs b/tools/droiddoc/templates-sdk/docpage.cs index 90e663b..566e2da 100644 --- a/tools/droiddoc/templates-sdk/docpage.cs +++ b/tools/droiddoc/templates-sdk/docpage.cs @@ -3,7 +3,7 @@ <html<?cs if:devsite ?> devsite<?cs /if ?>> <?cs include:"head_tag.cs" ?> <body class="gc-documentation <?cs if:(google || reference.gms || reference.gcm) ?>google<?cs /if ?> - <?cs if:(guide||develop||training||reference||tools||sdk) ?>develop<?cs if:guide ?> guide<?cs /if ?><?cs + <?cs if:(guide||develop||training||reference||tools||sdk||samples) ?>develop<?cs if:guide ?> guide<?cs /if ?><?cs if:samples ?> samples<?cs /if ?><?cs elif:about ?>about<?cs elif:design ?>design<?cs elif:distribute ?>distribute<?cs diff --git a/tools/droiddoc/templates-sdk/head_tag.cs b/tools/droiddoc/templates-sdk/head_tag.cs index 9778389..6a1ce06 100644 --- a/tools/droiddoc/templates-sdk/head_tag.cs +++ b/tools/droiddoc/templates-sdk/head_tag.cs @@ -2,7 +2,7 @@ <?cs ####### If building devsite, add some meta data needed for when generating the top nav ######### ?> <?cs if:devsite ?><?cs - if:guide||develop||training||reference||tools||sdk||google + if:guide||develop||training||reference||tools||sdk||google||samples ?><meta name="top_category" value="develop" /><?cs elif:google ?><meta name="top_category" value="google" /><?cs diff --git a/tools/droiddoc/templates-sdk/sample.cs b/tools/droiddoc/templates-sdk/sample.cs new file mode 100644 index 0000000..763ba3f --- /dev/null +++ b/tools/droiddoc/templates-sdk/sample.cs @@ -0,0 +1,165 @@ +<?cs include:"doctype.cs" ?> +<?cs include:"macros.cs" ?> +<html<?cs if:devsite ?> devsite<?cs /if ?>> +<?cs include:"head_tag.cs" ?> +<body class="gc-documentation <?cs if:(google || reference.gms || reference.gcm) ?>google<?cs /if ?> + <?cs if:(guide||develop||training||reference||tools||sdk||samples) ?>develop<?cs if:guide ?> guide<?cs /if ?><?cs if:samples ?> samples<?cs /if ?><?cs + elif:about ?>about<?cs + elif:design ?>design<?cs + elif:distribute ?>distribute<?cs + /if ?><?cs + if:page.trainingcourse ?> trainingcourse<?cs /if ?>" itemscope itemtype="http://schema.org/Article"> +<?cs include:"header.cs" ?> + +<div <?cs if:fullpage +?>class="fullpage"<?cs elif:design||tools||about||sdk||distribute +?>class="col-13" id="doc-col"<?cs else +?>class="col-12" id="doc-col"<?cs /if ?> > + +<?cs if:(design||training||walkthru) && !page.trainingcourse && !page.article ?><?cs # header logic for docs that provide previous/next buttons ?> + <?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 <?cs if:training ?>span-7<?cs else ?>span-9<?cs /if ?>"> + <?cs if:header.justLinks ?> + <?cs else ?><h1 itemprop="name">item <?cs var:page.title ?></h1> + <?cs /if ?> + </div> + <?cs if:training ?> + <div class="training-nav-top layout-content-col span-5" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <a href="#" class="prev-page-link hide" + zh-tw-lang="上一堂課" + zh-cn-lang="上一课" + ru-lang="Предыдущий" + ko-lang="이전" + ja-lang="前へ" + es-lang="Anterior" + >Previous</a> + <a href="#" class="next-page-link hide" + zh-tw-lang="下一堂課" + zh-cn-lang="下一课" + ru-lang="Следующий" + ko-lang="다음" + ja-lang="次へ" + es-lang="Siguiente" + >Next</a> + <a href="#" class="start-class-link hide" + zh-tw-lang="開始上課" + zh-cn-lang="开始" + ru-lang="Начало работы" + ko-lang="시작하기" + ja-lang="開始する" + es-lang="Empezar" + >Get started</a> + </div> + <?cs elif:!page.trainingcourse ?> + <div class="paging-links layout-content-col span-4" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <a href="#" class="prev-page-link hide" + zh-tw-lang="上一堂課" + zh-cn-lang="上一课" + ru-lang="Предыдущий" + ko-lang="이전" + ja-lang="前へ" + es-lang="Anterior" + >Previous</a> + <a href="#" class="next-page-link hide" + zh-tw-lang="下一堂課" + zh-cn-lang="下一课" + ru-lang="Следующий" + ko-lang="다음" + ja-lang="次へ" + es-lang="Siguiente" + >Next</a> + </div> + <?cs /if ?><?cs # end if training ?> + </div> + <?cs /if ?> +<?cs else ?> + <?cs if:(!fullpage && !header.hide) ?> + <?cs if:page.landing ?><?cs # header logic for docs that are landing pages ?> + <div class="landing-banner"> + <?cs if:page.landing.image ?><?cs # use two-column layout only if theres an image ?> + <div class="col-6"> + <img src="<?cs var:toroot ?><?cs var:page.landing.image ?>" alt="" /> + </div> + <div class="col-6"> + <?cs /if ?> + <h1 itemprop="name" style="margin-bottom:0;"> item2 <?cs var:page.title ?></h1> + <p itemprop="description"><?cs var:page.landing.intro ?></p> + + <p><a class="next-page-link topic-start-link"></a></p> + <?cs if:page.landing.image ?> + </div> + <?cs /if ?> + </div> + <?cs else ?> + <?cs if:tab1 ?><div id="title-tabs-wrapper"><?cs /if ?> + <h1 itemprop="name" <?cs if:tab1 ?>class="with-title-tabs"<?cs /if ?>>"<?cs var:page.title ?>"</h1><?cs + if:tab1 ?><ul id="title-tabs"> + <li class="selected"><a href="<?cs var:tab1.link ?>"><?cs var:tab1 ?></a></li> + <?cs if:tab2 ?> + <li><a href="<?cs var:tab2.link ?>"><?cs var:tab2 ?></a></li><?cs /if ?> + <?cs if:tab3 ?> + <li><a href="<?cs var:tab3.link ?>"><?cs var:tab3 ?></a></li><?cs /if ?> + </ul> + <?cs /if ?> + <?cs if:tab1 ?></div><!-- end tab-wrapper --><?cs /if ?> + <?cs /if ?> + <?cs /if ?> +<?cs /if ?><?cs # end if design ?> + + <?cs # THIS IS THE MAIN DOC CONTENT ?> + <div id="jd-content"> + +<?cs if:android.whichdoc == "online" ?> + +<?cs # If this is the online docs, build the src code navigation links ?> + + +<?cs var:summary ?> + +<p>The file containing the source code shown below is located in the corresponding directory in <code><sdk>/samples/android-<version>/...</code></p> + +<!-- begin file contents --> +<div class="sampleEmbed"> + <code class="prettyprint"> + <ol class="lineNumbers"> + <?cs var:fileContents ?> + </ol> + </code> +</div> + + +<!-- end file contents --> + + + + + +<?cs else ?><?cs + # else, this means it's offline docs, + so don't show src links (we dont have the pages!) ?> + +<p>You can find the source code for this sample in your SDK at:</p> +<p style="margin-left:2em"> +<code><em><sdk></em>/samples/android-<em><version></em>/</code> +</p> + +<?cs /if ?><?cs # end if/else online docs ?> + + </div> <!-- end jd-content --> + +<?cs include:"footer.cs" ?> +</div><!-- end doc-content --> + +<?cs include:"trailer.cs" ?> + +</body> +</html> + + + + + + + diff --git a/tools/droiddoc/templates-sdk/sampleindex.cs b/tools/droiddoc/templates-sdk/sampleindex.cs index a173363..2447da8 100644 --- a/tools/droiddoc/templates-sdk/sampleindex.cs +++ b/tools/droiddoc/templates-sdk/sampleindex.cs @@ -1,53 +1,219 @@ <?cs include:"doctype.cs" ?> <?cs include:"macros.cs" ?> -<?cs set:resources="true" ?> <html<?cs if:devsite ?> devsite<?cs /if ?>> <?cs include:"head_tag.cs" ?> +<body class="gc-documentation <?cs if:(google || reference.gms || reference.gcm) ?>google<?cs /if ?> + <?cs if:(guide||develop||training||reference||tools||sdk||samples) ?>develop<?cs if:guide ?> guide<?cs /if ?><?cs if:samples ?> samples<?cs /if ?><?cs + elif:about ?>about<?cs + elif:design ?>design<?cs + elif:distribute ?>distribute<?cs + /if ?><?cs + if:page.trainingcourse ?> trainingcourse<?cs /if ?>" itemscope itemtype="http://schema.org/Article"> <?cs include:"header.cs" ?> -<body class="gc-documentation"> +<div <?cs if:fullpage +?>class="fullpage"<?cs elif:design||tools||about||sdk||distribute +?>class="col-13" id="doc-col"<?cs else +?>class="col-12" id="doc-col"<?cs /if ?> > -<a name="top"></a> -<div class="g-unit" id="doc-content"> - <div id="jd-header" class="guide-header"> - <span class="crumb"> - <a href="<?cs var:toroot ?>resources/browser.html?tag=sample">Sample Code</a> > - </span> - <h1><?cs var:page.title ?></h1> - </div> +<?cs if:(design||training||walkthru) && !page.trainingcourse && !page.article ?><?cs # header logic for docs that provide previous/next buttons ?> + <?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 <?cs if:training ?>span-7<?cs else ?>span-9<?cs /if ?>"> + <?cs if:header.justLinks ?> + <?cs else ?><h1 itemprop="name">item <?cs var:page.title ?></h1> + <?cs /if ?> + </div> + <?cs if:training ?> + <div class="training-nav-top layout-content-col span-5" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <a href="#" class="prev-page-link hide" + zh-tw-lang="上一堂課" + zh-cn-lang="上一课" + ru-lang="Предыдущий" + ko-lang="이전" + ja-lang="前へ" + es-lang="Anterior" + >Previous</a> + <a href="#" class="next-page-link hide" + zh-tw-lang="下一堂課" + zh-cn-lang="下一课" + ru-lang="Следующий" + ko-lang="다음" + ja-lang="次へ" + es-lang="Siguiente" + >Next</a> + <a href="#" class="start-class-link hide" + zh-tw-lang="開始上課" + zh-cn-lang="开始" + ru-lang="Начало работы" + ko-lang="시작하기" + ja-lang="開始する" + es-lang="Empezar" + >Get started</a> + </div> + <?cs elif:!page.trainingcourse ?> + <div class="paging-links layout-content-col span-4" itemscope itemtype="http://schema.org/SiteNavigationElement"> + <a href="#" class="prev-page-link hide" + zh-tw-lang="上一堂課" + zh-cn-lang="上一课" + ru-lang="Предыдущий" + ko-lang="이전" + ja-lang="前へ" + es-lang="Anterior" + >Previous</a> + <a href="#" class="next-page-link hide" + zh-tw-lang="下一堂課" + zh-cn-lang="下一课" + ru-lang="Следующий" + ko-lang="다음" + ja-lang="次へ" + es-lang="Siguiente" + >Next</a> + </div> + <?cs /if ?><?cs # end if training ?> + </div> + <?cs /if ?> +<?cs else ?> + <?cs if:(!fullpage && !header.hide) ?> + <?cs if:page.landing ?><?cs # header logic for docs that are landing pages ?> + <div class="landing-banner"> + <?cs if:page.landing.image ?><?cs # use two-column layout only if theres an image ?> + <div class="col-6"> + <img src="<?cs var:toroot ?><?cs var:page.landing.image ?>" alt="" /> + </div> + <div class="col-6"> + <?cs /if ?> + <h1 itemprop="name" style="margin-bottom:0;"> item2 <?cs var:page.title ?></h1> + <p itemprop="description"><?cs var:page.landing.intro ?></p> + + <p><a class="next-page-link topic-start-link"></a></p> + <?cs if:page.landing.image ?> + </div> + <?cs /if ?> + </div> + <?cs else ?> + <?cs if:tab1 ?><div id="title-tabs-wrapper"><?cs /if ?> + <h1 itemprop="name" <?cs if:tab1 ?>class="with-title-tabs"<?cs /if ?>><?cs var:projectTitle ?></h1><?cs + if:tab1 ?><ul id="title-tabs"> + <li class="selected"><a href="<?cs var:tab1.link ?>"><?cs var:tab1 ?></a></li> + <?cs if:tab2 ?> + <li><a href="<?cs var:tab2.link ?>"><?cs var:tab2 ?></a></li><?cs /if ?> + <?cs if:tab3 ?> + <li><a href="<?cs var:tab3.link ?>"><?cs var:tab3 ?></a></li><?cs /if ?> + </ul> + <?cs /if ?> + <?cs if:tab1 ?></div><!-- end tab-wrapper --><?cs /if ?> + <?cs /if ?> + <?cs /if ?> +<?cs /if ?><?cs # end if design ?> + + <?cs # THIS IS THE MAIN DOC CONTENT ?> + <div id="jd-content"> + +<?cs if:android.whichdoc == "online" ?> + +<?cs # If this is the online docs, build the src code navigation links ?> + +<?cs if:page.title == "Project Structure" ?> + +<script type="text/javascript"> +function toggleDiv(link) { + var toggleable = $(link).parent(); + if (toggleable.hasClass("closed")) { + $(".toggleme", toggleable).slideDown("fast"); + toggleable.removeClass("closed"); + toggleable.addClass("open"); + $(".toggle-img", toggleable).attr("title", "hide").attr("src", (toRoot + "assets/images/triangle-opened.png")); + } else { + $(".toggleme", toggleable).slideUp("fast"); + toggleable.removeClass("open"); + toggleable.addClass("closed"); + $(".toggle-img", toggleable).attr("title", "show").attr("src", (toRoot + "assets/images/triangle-closed.png")); + } + return false; +} +</script> -<div id="jd-content"> -<p><a href="../index.html">← Back</a></p> + +<?cs def:display_files(files) ?> + + <?cs each:file = files ?> + <?cs if:file.Type != "dir" ?> + <div class="structure-<?cs var:file.Type ?>"><a href="<?cs var:toroot ?><?cs var:file.Href ?>"><?cs var:file.Name ?></a></div> + <?cs else ?> + <div class="toggleable opened structure-dir"> + <a href="#" onclick="return toggleDiv(this)"> + <img src="<?cs var:toroot ?>assets/images/triangle-opened.png" class="toggle-img structure-toggle-img" height="9px" width="9px" /> + <?cs var:file.Name ?></a><?cs if:file.SummaryFlag == "true" ?><span class="dirInfo">[ <a href="file.SummaryHref">Info</a> ]</a></span><?cs /if ?> + + <div class="toggleme structure-toggleme"> + + <?cs if:file.Sub.0.Name ?> + <?cs call:display_files(file.Sub) ?> + <?cs /if ?> + </div> <?cs # /toggleme ?> + </div> <?cs # /toggleable ?> + <?cs /if ?> + <?cs /each ?> +<?cs /def ?> + +<?cs call:display_files(Files) ?> + +<?cs else ?> <?cs # else not project structure doc ?> <?cs var:summary ?> - <?cs if:subcount(subdirs) ?> - <h2>Subdirectories</h2> - <ul class="nolist"> - <?cs each:dir=subdirs ?> - <li><a href="<?cs var:dir.name ?>/index.html"><?cs - var:dir.name ?>/</a></li> - <?cs /each ?> - </ul> - <?cs /if ?> +<h2>Project Structure</h2> - <?cs if:subcount(files) ?> - <h2>Files</h2> - <ul class="nolist"> - <?cs each:file=files ?> - <li><a href="<?cs var:file.href ?>"><?cs - var:file.name ?></a></li> - <?cs /each ?> - </ul> - <?cs /if ?> +<p>Decide what to do with this ...</p> -</div><!-- end jd-content --> -<?cs include:"footer.cs" ?> +<?cs def:display_files(files) ?> + + <?cs each:file = files ?> + <?cs if:file.Type != "dir" ?> + <div class="structure-<?cs var:file.Type ?>"><a href="<?cs var:toroot ?><?cs var:file.Href ?>"><?cs var:file.Name ?></a></div> + <?cs else ?> + <div class="toggleable opened structure-dir"> + <a href="#" onclick="return toggleDiv(this)"> + <img src="<?cs var:toroot ?>assets/images/triangle-opened.png" class="toggle-img structure-toggle-img" height="9px" width="9px" /> + <?cs var:file.Name ?></a><?cs if:file.SummaryFlag == "true" ?><span class="dirInfo">[ <a href="file.SummaryHref">Info</a> ]</a></span><?cs /if ?> + + <div class="toggleme structure-toggleme"> + + <?cs if:file.Sub.0.Name ?> + <?cs call:display_files(file.Sub) ?> + <?cs /if ?> + </div> <?cs # /toggleme ?> + </div> <?cs # /toggleable ?> + <?cs /if ?> + <?cs /each ?> +<?cs /def ?> + +<?cs call:display_files(Files) ?> + +<?cs /if ?> <?cs # end if project structure ?> +<?cs else ?><?cs + # else, this means it's offline docs, + so don't show src links (we dont have the pages!) ?> + +<p>You can find the source code for this sample in your SDK at:</p> +<p style="margin-left:2em"> +<code><em><sdk></em>/samples/android-<em><version></em>/</code> +</p> + +<?cs /if ?><?cs # end if/else online docs ?> + + </div> <!-- end jd-content --> + +<?cs include:"footer.cs" ?> </div><!-- end doc-content --> <?cs include:"trailer.cs" ?> </body> </html> + + diff --git a/tools/droiddoc/templates-sdk/samples_navtree_data.cs b/tools/droiddoc/templates-sdk/samples_navtree_data.cs new file mode 100644 index 0000000..24ac7b7 --- /dev/null +++ b/tools/droiddoc/templates-sdk/samples_navtree_data.cs @@ -0,0 +1,3 @@ +var SAMPLES_NAVTREE_DATA = +<?cs var:reference_tree ?> +; diff --git a/tools/releasetools/edify_generator.py b/tools/releasetools/edify_generator.py index 5672b5a..9ef1926 100644 --- a/tools/releasetools/edify_generator.py +++ b/tools/releasetools/edify_generator.py @@ -72,24 +72,31 @@ class EdifyGenerator(object): """Assert that the current system build fingerprint is one of *fp.""" if not fp: raise ValueError("must specify some fingerprints") - cmd = ('assert(' + - ' ||\0'.join([('file_getprop("/system/build.prop", ' + cmd = ( + ' ||\n '.join([('file_getprop("/system/build.prop", ' '"ro.build.fingerprint") == "%s"') % i for i in fp]) + - ');') - self.script.append(self._WordWrap(cmd)) + ' ||\n abort("Package expects build fingerprint of %s; this ' + 'device has " + getprop("ro.build.fingerprint") + ".");' + ) % (" or ".join(fp),) + self.script.append(cmd) - def AssertOlderBuild(self, timestamp): + def AssertOlderBuild(self, timestamp, timestamp_text): """Assert that the build on the device is older (or the same as) the given timestamp.""" - self.script.append(('assert(!less_than_int(%s, ' - 'getprop("ro.build.date.utc")));') % (timestamp,)) + self.script.append( + ('(!less_than_int(%s, getprop("ro.build.date.utc"))) || ' + 'abort("Can\'t install this package (%s) over newer ' + 'build (" + getprop("ro.build.date") + ").");' + ) % (timestamp, timestamp_text)) def AssertDevice(self, device): """Assert that the device identifier is the given string.""" - cmd = ('assert(getprop("ro.product.device") == "%s" ||\0' - 'getprop("ro.build.product") == "%s");' % (device, device)) - self.script.append(self._WordWrap(cmd)) + cmd = ('getprop("ro.product.device") == "%s" || ' + 'abort("This package is for \\"%s\\" devices; ' + 'this is a \\"" + getprop("ro.product.device") + "\\".");' + ) % (device, device) + self.script.append(cmd) def AssertSomeBootloader(self, *bootloaders): """Asert that the bootloader version is one of *bootloaders.""" @@ -115,9 +122,10 @@ class EdifyGenerator(object): """Check that the given file (or MTD reference) has one of the given *sha1 hashes, checking the version saved in cache if the file does not match.""" - self.script.append('assert(apply_patch_check("%s"' % (filename,) + - "".join([', "%s"' % (i,) for i in sha1]) + - '));') + self.script.append( + 'apply_patch_check("%s"' % (filename,) + + "".join([', "%s"' % (i,) for i in sha1]) + + ') || abort("\\"%s\\" has unexpected contents.");' % (filename,)) def FileCheck(self, filename, *sha1): """Check that the given file (or MTD reference) has one of the @@ -129,7 +137,8 @@ class EdifyGenerator(object): def CacheFreeSpaceCheck(self, amount): """Check that there's at least 'amount' space that can be made available on /cache.""" - self.script.append("assert(apply_patch_space(%d));" % (amount,)) + self.script.append(('apply_patch_space(%d) || abort("Not enough free space ' + 'on /system to apply patches.");') % (amount,)) def Mount(self, mount_point): """Mount the partition with the given mount_point.""" diff --git a/tools/releasetools/ota_from_target_files b/tools/releasetools/ota_from_target_files index e0d5d91..1e1d04e 100755 --- a/tools/releasetools/ota_from_target_files +++ b/tools/releasetools/ota_from_target_files @@ -387,7 +387,8 @@ def WriteFullOTAPackage(input_zip, output_zip): if not OPTIONS.omit_prereq: ts = GetBuildProp("ro.build.date.utc", OPTIONS.info_dict) - script.AssertOlderBuild(ts) + ts_text = GetBuildProp("ro.build.date", OPTIONS.info_dict) + script.AssertOlderBuild(ts, ts_text) AppendAssertions(script, OPTIONS.info_dict) device_specific.FullOTA_Assertions() diff --git a/tools/releasetools/sign_target_files_apks b/tools/releasetools/sign_target_files_apks index fe6f820..00693b8 100755 --- a/tools/releasetools/sign_target_files_apks +++ b/tools/releasetools/sign_target_files_apks @@ -232,6 +232,11 @@ def RewriteProps(data): value = " ".join(pieces) elif key == "ro.build.tags": value = EditTags(value) + elif key == "ro.build.display.id": + # change, eg, "JWR66N dev-keys" to "JWR66N" + value = value.split() + if len(value) == 2 and value[1].endswith("-keys"): + value = value[0] line = key + "=" + value if line != original_line: print " replace: ", original_line diff --git a/tools/signapk/SignApk.java b/tools/signapk/SignApk.java index adfe9a3..716ea3b 100644 --- a/tools/signapk/SignApk.java +++ b/tools/signapk/SignApk.java @@ -78,8 +78,26 @@ import javax.crypto.SecretKeyFactory; import javax.crypto.spec.PBEKeySpec; /** - * Command line tool to sign JAR files (including APKs and OTA updates) in - * a way compatible with the mincrypt verifier, using SHA1 and RSA keys. + * HISTORICAL NOTE: + * + * Prior to the keylimepie release, SignApk ignored the signature + * algorithm specified in the certificate and always used SHA1withRSA. + * + * Starting with keylimepie, we support SHA256withRSA, and use the + * signature algorithm in the certificate to select which to use + * (SHA256withRSA or SHA1withRSA). + * + * Because there are old keys still in use whose certificate actually + * says "MD5withRSA", we treat these as though they say "SHA1withRSA" + * for compatibility with older releases. This can be changed by + * altering the getAlgorithm() function below. + */ + + +/** + * Command line tool to sign JAR files (including APKs and OTA + * updates) in a way compatible with the mincrypt verifier, using RSA + * keys and SHA1 or SHA-256. */ class SignApk { private static final String CERT_SF_NAME = "META-INF/CERT.SF"; @@ -91,6 +109,27 @@ class SignApk { private static Provider sBouncyCastleProvider; + // bitmasks for which hash algorithms we need the manifest to include. + private static final int USE_SHA1 = 1; + private static final int USE_SHA256 = 2; + + /** + * Return one of USE_SHA1 or USE_SHA256 according to the signature + * algorithm specified in the cert. + */ + private static int getAlgorithm(X509Certificate cert) { + String sigAlg = cert.getSigAlgName(); + if ("SHA1withRSA".equals(sigAlg) || + "MD5withRSA".equals(sigAlg)) { // see "HISTORICAL NOTE" above. + return USE_SHA1; + } else if ("SHA256withRSA".equals(sigAlg)) { + return USE_SHA256; + } else { + throw new IllegalArgumentException("unsupported signature algorithm \"" + sigAlg + + "\" in cert [" + cert.getSubjectDN()); + } + } + // Files matching this pattern are not copied to the output. private static Pattern stripPattern = Pattern.compile("^(META-INF/((.*)[.](SF|RSA|DSA)|com/android/otacert))|(" + @@ -182,8 +221,11 @@ class SignApk { } } - /** Add the SHA1 of every file to the manifest, creating it if necessary. */ - private static Manifest addDigestsToManifest(JarFile jar) + /** + * Add the hash(es) of every file to the manifest, creating it if + * necessary. + */ + private static Manifest addDigestsToManifest(JarFile jar, int hashes) throws IOException, GeneralSecurityException { Manifest input = jar.getManifest(); Manifest output = new Manifest(); @@ -195,7 +237,15 @@ class SignApk { main.putValue("Created-By", "1.0 (Android SignApk)"); } - MessageDigest md = MessageDigest.getInstance("SHA1"); + MessageDigest md_sha1 = null; + MessageDigest md_sha256 = null; + if ((hashes & USE_SHA1) != 0) { + md_sha1 = MessageDigest.getInstance("SHA1"); + } + if ((hashes & USE_SHA256) != 0) { + md_sha256 = MessageDigest.getInstance("SHA256"); + } + byte[] buffer = new byte[4096]; int num; @@ -216,14 +266,21 @@ class SignApk { (stripPattern == null || !stripPattern.matcher(name).matches())) { InputStream data = jar.getInputStream(entry); while ((num = data.read(buffer)) > 0) { - md.update(buffer, 0, num); + if (md_sha1 != null) md_sha1.update(buffer, 0, num); + if (md_sha256 != null) md_sha256.update(buffer, 0, num); } Attributes attr = null; if (input != null) attr = input.getAttributes(name); attr = attr != null ? new Attributes(attr) : new Attributes(); - attr.putValue("SHA1-Digest", - new String(Base64.encode(md.digest()), "ASCII")); + if (md_sha1 != null) { + attr.putValue("SHA1-Digest", + new String(Base64.encode(md_sha1.digest()), "ASCII")); + } + if (md_sha256 != null) { + attr.putValue("SHA-256-Digest", + new String(Base64.encode(md_sha256.digest()), "ASCII")); + } output.getEntries().put(name, attr); } } @@ -241,9 +298,10 @@ class SignApk { private static void addOtacert(JarOutputStream outputJar, File publicKeyFile, long timestamp, - Manifest manifest) + Manifest manifest, + int hash) throws IOException, GeneralSecurityException { - MessageDigest md = MessageDigest.getInstance("SHA1"); + MessageDigest md = MessageDigest.getInstance(hash == USE_SHA1 ? "SHA1" : "SHA256"); JarEntry je = new JarEntry(OTACERT_NAME); je.setTime(timestamp); @@ -258,7 +316,7 @@ class SignApk { input.close(); Attributes attr = new Attributes(); - attr.putValue("SHA1-Digest", + attr.putValue(hash == USE_SHA1 ? "SHA1-Digest" : "SHA-256-Digest", new String(Base64.encode(md.digest()), "ASCII")); manifest.getEntries().put(OTACERT_NAME, attr); } @@ -293,14 +351,16 @@ class SignApk { } /** Write a .SF file with a digest of the specified manifest. */ - private static void writeSignatureFile(Manifest manifest, OutputStream out) + private static void writeSignatureFile(Manifest manifest, OutputStream out, + int hash) throws IOException, GeneralSecurityException { Manifest sf = new Manifest(); Attributes main = sf.getMainAttributes(); main.putValue("Signature-Version", "1.0"); main.putValue("Created-By", "1.0 (Android SignApk)"); - MessageDigest md = MessageDigest.getInstance("SHA1"); + MessageDigest md = MessageDigest.getInstance( + hash == USE_SHA256 ? "SHA256" : "SHA1"); PrintStream print = new PrintStream( new DigestOutputStream(new ByteArrayOutputStream(), md), true, "UTF-8"); @@ -308,7 +368,7 @@ class SignApk { // Digest of the entire manifest manifest.write(print); print.flush(); - main.putValue("SHA1-Digest-Manifest", + main.putValue(hash == USE_SHA256 ? "SHA-256-Digest-Manifest" : "SHA1-Digest-Manifest", new String(Base64.encode(md.digest()), "ASCII")); Map<String, Attributes> entries = manifest.getEntries(); @@ -322,7 +382,7 @@ class SignApk { print.flush(); Attributes sfAttr = new Attributes(); - sfAttr.putValue("SHA1-Digest", + sfAttr.putValue(hash == USE_SHA256 ? "SHA-256-Digest" : "SHA1-Digest-Manifest", new String(Base64.encode(md.digest()), "ASCII")); sf.getEntries().put(entry.getKey(), sfAttr); } @@ -353,7 +413,8 @@ class SignApk { JcaCertStore certs = new JcaCertStore(certList); CMSSignedDataGenerator gen = new CMSSignedDataGenerator(); - ContentSigner sha1Signer = new JcaContentSignerBuilder("SHA1withRSA") + ContentSigner signer = new JcaContentSignerBuilder( + getAlgorithm(publicKey) == USE_SHA256 ? "SHA256withRSA" : "SHA1withRSA") .setProvider(sBouncyCastleProvider) .build(privateKey); gen.addSignerInfoGenerator( @@ -362,7 +423,7 @@ class SignApk { .setProvider(sBouncyCastleProvider) .build()) .setDirectSignature(true) - .build(sha1Signer, publicKey)); + .build(signer, publicKey)); gen.addCertificates(certs); CMSSignedData sigData = gen.generate(data, false); @@ -499,14 +560,19 @@ class SignApk { signer = new WholeFileSignerOutputStream(out, outputStream); JarOutputStream outputJar = new JarOutputStream(signer); - Manifest manifest = addDigestsToManifest(inputJar); + int hash = getAlgorithm(publicKey); + + // Assume the certificate is valid for at least an hour. + long timestamp = publicKey.getNotBefore().getTime() + 3600L * 1000; + + Manifest manifest = addDigestsToManifest(inputJar, hash); + copyFiles(manifest, inputJar, outputJar, timestamp); + addOtacert(outputJar, publicKeyFile, timestamp, manifest, hash); + signFile(manifest, inputJar, new X509Certificate[]{ publicKey }, new PrivateKey[]{ privateKey }, outputJar); - // Assume the certificate is valid for at least an hour. - long timestamp = publicKey.getNotBefore().getTime() + 3600L * 1000; - addOtacert(outputJar, publicKeyFile, timestamp, manifest); signer.notifyClosing(); outputJar.close(); @@ -605,13 +671,8 @@ class SignApk { // Assume the certificate is valid for at least an hour. long timestamp = publicKey[0].getNotBefore().getTime() + 3600L * 1000; - JarEntry je; - - // Everything else - copyFiles(manifest, inputJar, outputJar, timestamp); - // MANIFEST.MF - je = new JarEntry(JarFile.MANIFEST_NAME); + JarEntry je = new JarEntry(JarFile.MANIFEST_NAME); je.setTime(timestamp); outputJar.putNextEntry(je); manifest.write(outputJar); @@ -624,7 +685,7 @@ class SignApk { je.setTime(timestamp); outputJar.putNextEntry(je); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - writeSignatureFile(manifest, baos); + writeSignatureFile(manifest, baos, getAlgorithm(publicKey[k])); byte[] signedData = baos.toByteArray(); outputJar.write(signedData); @@ -671,14 +732,21 @@ class SignApk { JarFile inputJar = null; FileOutputStream outputFile = null; + int hashes = 0; try { File firstPublicKeyFile = new File(args[argstart+0]); X509Certificate[] publicKey = new X509Certificate[numKeys]; - for (int i = 0; i < numKeys; ++i) { - int argNum = argstart + i*2; - publicKey[i] = readPublicKey(new File(args[argNum])); + try { + for (int i = 0; i < numKeys; ++i) { + int argNum = argstart + i*2; + publicKey[i] = readPublicKey(new File(args[argNum])); + hashes |= getAlgorithm(publicKey[i]); + } + } catch (IllegalArgumentException e) { + System.err.println(e); + System.exit(1); } // Set the ZIP file timestamp to the starting valid time @@ -710,8 +778,9 @@ class SignApk { // (~0.1% on full OTA packages I tested). outputJar.setLevel(9); - signFile(addDigestsToManifest(inputJar), inputJar, - publicKey, privateKey, outputJar); + Manifest manifest = addDigestsToManifest(inputJar, hashes); + copyFiles(manifest, inputJar, outputJar, timestamp); + signFile(manifest, inputJar, publicKey, privateKey, outputJar); outputJar.close(); } } catch (Exception e) { diff --git a/tools/zipalign/Android.mk b/tools/zipalign/Android.mk index 5542280..708c8bf 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 \ liblog diff --git a/tools/zipalign/ZipFile.cpp b/tools/zipalign/ZipFile.cpp index 3994c31..8057068 100644 --- a/tools/zipalign/ZipFile.cpp +++ b/tools/zipalign/ZipFile.cpp @@ -20,8 +20,8 @@ #define LOG_TAG "zip" +#include <androidfw/ZipUtils.h> #include <utils/Log.h> -#include <utils/ZipUtils.h> #include "ZipFile.h" |