blob: be9876f37a9b7b03e291a06823142b98613d9796 [file] [log] [blame]
The Android Open Source Projectb6c1cf62008-10-21 07:00:00 -07001#
2# Copyright (C) 2008 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8# http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17#
18# Included by config/Makefile.
19# Defines the pieces necessary for the dexpreopt process.
20#
21# inputs: INSTALLED_RAMDISK_TARGET, BUILT_SYSTEMIMAGE_UNOPT
22# outputs: BUILT_SYSTEMIMAGE, SYSTEMIMAGE_SOURCE_DIR
23#
24LOCAL_PATH := $(my-dir)
25
26# TODO: see if we can make the .odex files not be product-specific.
27# They can't be completely common, though, because their format
28# depends on the architecture of the target system; ARM and x86
29# would have different versions.
30intermediates := \
31 $(call intermediates-dir-for,PACKAGING,dexpreopt)
32dexpreopt_initrc := $(LOCAL_PATH)/etc/init.rc
33dexpreopt_system_dir := $(intermediates)/system
34built_afar := $(call intermediates-dir-for,EXECUTABLES,afar)/afar
35built_dowrapper := \
36 $(call intermediates-dir-for,EXECUTABLES,dexopt-wrapper)/dexopt-wrapper
37
38BUILT_DEXPREOPT_RAMDISK := $(intermediates)/ramdisk.img
39$(BUILT_DEXPREOPT_RAMDISK): intermediates := $(intermediates)
40$(BUILT_DEXPREOPT_RAMDISK): dexpreopt_root_out := $(intermediates)/root
41$(BUILT_DEXPREOPT_RAMDISK): dexpreopt_initrc := $(dexpreopt_initrc)
42$(BUILT_DEXPREOPT_RAMDISK): built_afar := $(built_afar)
43$(BUILT_DEXPREOPT_RAMDISK): built_dowrapper := $(built_dowrapper)
44$(BUILT_DEXPREOPT_RAMDISK): \
45 $(INSTALLED_RAMDISK_TARGET) \
46 $(dexpreopt_initrc) \
47 $(built_afar) \
48 $(built_dowrapper) \
49 | $(MKBOOTFS) $(ACP)
50$(BUILT_DEXPREOPT_RAMDISK):
51 @echo "Dexpreopt ramdisk: $@"
52 $(hide) rm -f $@
53 $(hide) rm -rf $(dexpreopt_root_out)
54 $(hide) mkdir -p $(dexpreopt_root_out)
55 $(hide) $(ACP) -rd $(TARGET_ROOT_OUT) $(intermediates)
56 $(hide) $(ACP) -f $(dexpreopt_initrc) $(dexpreopt_root_out)/
57 $(hide) $(ACP) $(built_afar) $(dexpreopt_root_out)/sbin/
58 $(hide) $(ACP) $(built_dowrapper) $(dexpreopt_root_out)/sbin/
59 $(MKBOOTFS) $(dexpreopt_root_out) | gzip > $@
60
61sign_dexpreopt := true
62ifdef sign_dexpreopt
63 # Such a huge hack. We need to re-sign the .apks with the
64 # same certs that they were originally signed with.
65 dexpreopt_package_certs_file := $(intermediates)/package-certs
66 $(shell mkdir -p $(intermediates))
67 $(shell rm -f $(dexpreopt_package_certs_file))
68 $(foreach p,$(PACKAGES),\
69 $(shell echo "$(p) $(PACKAGES.$(p).CERTIFICATE) $(PACKAGES.$(p).PRIVATE_KEY)" >> $(dexpreopt_package_certs_file)))
70endif
71
72# Build an optimized image from the unoptimized image
73BUILT_DEXPREOPT_SYSTEMIMAGE := $(intermediates)/system.img
74$(BUILT_DEXPREOPT_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE_UNOPT)
75$(BUILT_DEXPREOPT_SYSTEMIMAGE): $(BUILT_DEXPREOPT_RAMDISK)
76$(BUILT_DEXPREOPT_SYSTEMIMAGE): | $(DEXPREOPT) $(ACP) $(ZIPALIGN)
77$(BUILT_DEXPREOPT_SYSTEMIMAGE): SYSTEM_DIR := $(dexpreopt_system_dir)
78$(BUILT_DEXPREOPT_SYSTEMIMAGE): DEXPREOPT_TMP := $(intermediates)/emutmp
79ifdef sign_dexpreopt
80$(BUILT_DEXPREOPT_SYSTEMIMAGE): | $(SIGNAPK_JAR)
81endif
82$(BUILT_DEXPREOPT_SYSTEMIMAGE):
83 @rm -f $@
84 @echo "dexpreopt: copy system to $(SYSTEM_DIR)"
85 @rm -rf $(SYSTEM_DIR)
86 @mkdir -p $(dir $(SYSTEM_DIR))
87 $(hide) $(ACP) -rd $(TARGET_OUT) $(SYSTEM_DIR)
88 @echo "dexpreopt: optimize dex files"
89 @rm -rf $(DEXPREOPT_TMP)
90 @mkdir -p $(DEXPREOPT_TMP)
91 $(hide) \
92 PATH=$(HOST_OUT_EXECUTABLES):$$PATH \
93 $(DEXPREOPT) \
94 --kernel prebuilt/android-arm/kernel-qemu \
95 --ramdisk $(BUILT_DEXPREOPT_RAMDISK) \
96 --image $(BUILT_SYSTEMIMAGE_UNOPT) \
97 --system $(PRODUCT_OUT) \
98 --tmpdir $(DEXPREOPT_TMP) \
99 --outsystemdir $(SYSTEM_DIR)
100ifdef sign_dexpreopt
101 @echo "dexpreopt: re-sign apk files"
102 $(hide) \
103 export PATH=$(HOST_OUT_EXECUTABLES):$$PATH; \
104 for apk in $(SYSTEM_DIR)/app/*.apk; do \
105 packageName=`basename $$apk`; \
106 packageName=`echo $$packageName | sed -e 's/.apk$$//'`; \
107 cert=`grep "^$$packageName " $(dexpreopt_package_certs_file) | \
108 awk '{print $$2}'`; \
109 pkey=`grep "^$$packageName " $(dexpreopt_package_certs_file) | \
110 awk '{print $$3}'`; \
111 if [ "$$cert" -a "$$pkey" ]; then \
112 echo "dexpreopt: re-sign app/"$$packageName".apk"; \
113 tmpApk=$$apk~; \
114 rm -f $$tmpApk; \
115 java -jar $(SIGNAPK_JAR) $$cert $$pkey $$apk $$tmpApk || \
116 exit 11; \
117 mv -f $$tmpApk $$apk; \
118 else \
119 echo "dexpreopt: no keys for app/"$$packageName".apk"; \
120 rm $(SYSTEM_DIR)/app/$$packageName.* && \
121 cp $(TARGET_OUT)/app/$$packageName.apk \
122 $(SYSTEM_DIR)/app || exit 12; \
123 fi; \
124 tmpApk=$$apk~; \
125 rm -f $$tmpApk; \
126 $(ZIPALIGN) -f 4 $$apk $$tmpApk || exit 13; \
127 mv -f $$tmpApk $$apk; \
128 done
129endif
130 @echo "Dexpreopt system image: $@"
131 $(hide) $(MKYAFFS2) -f $(SYSTEM_DIR) $@
132
133.PHONY: dexpreoptimage
134dexpreoptimage: $(BUILT_DEXPREOPT_SYSTEMIMAGE)
135
136# Tell our caller to use the optimized systemimage
137BUILT_SYSTEMIMAGE := $(BUILT_DEXPREOPT_SYSTEMIMAGE)
138SYSTEMIMAGE_SOURCE_DIR := $(dexpreopt_system_dir)