blob: c6639b28fc7b44fb6b33132edfc20d47fc07368a [file] [log] [blame]
The Android Open Source Project88b60792009-03-03 19:28:42 -08001#
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_system_dir := $(intermediates)/system
33built_afar := $(call intermediates-dir-for,EXECUTABLES,afar)/afar
34built_dowrapper := \
35 $(call intermediates-dir-for,EXECUTABLES,dexopt-wrapper)/dexopt-wrapper
36
37# Generate a stripped-down init.rc based on the real one.
38dexpreopt_initrc := $(intermediates)/etc/init.rc
39geninitrc_script := $(LOCAL_PATH)/geninitrc.awk
40$(dexpreopt_initrc): script := $(geninitrc_script)
41$(dexpreopt_initrc): system/core/rootdir/init.rc $(geninitrc_script)
42 @echo "Dexpreopt init.rc: $@"
43 @mkdir -p $(dir $@)
44 $(hide) awk -f $(script) < $< > $@
45
46BUILT_DEXPREOPT_RAMDISK := $(intermediates)/ramdisk.img
47$(BUILT_DEXPREOPT_RAMDISK): intermediates := $(intermediates)
48$(BUILT_DEXPREOPT_RAMDISK): dexpreopt_root_out := $(intermediates)/root
49$(BUILT_DEXPREOPT_RAMDISK): dexpreopt_initrc := $(dexpreopt_initrc)
50$(BUILT_DEXPREOPT_RAMDISK): built_afar := $(built_afar)
51$(BUILT_DEXPREOPT_RAMDISK): built_dowrapper := $(built_dowrapper)
52$(BUILT_DEXPREOPT_RAMDISK): \
53 $(INSTALLED_RAMDISK_TARGET) \
54 $(dexpreopt_initrc) \
55 $(built_afar) \
56 $(built_dowrapper) \
57 | $(MKBOOTFS) $(ACP)
58$(BUILT_DEXPREOPT_RAMDISK):
59 @echo "Dexpreopt ramdisk: $@"
60 $(hide) rm -f $@
61 $(hide) rm -rf $(dexpreopt_root_out)
62 $(hide) mkdir -p $(dexpreopt_root_out)
63 $(hide) $(ACP) -rd $(TARGET_ROOT_OUT) $(intermediates)
64 $(hide) $(ACP) -f $(dexpreopt_initrc) $(dexpreopt_root_out)/
65 $(hide) $(ACP) $(built_afar) $(dexpreopt_root_out)/sbin/
66 $(hide) $(ACP) $(built_dowrapper) $(dexpreopt_root_out)/sbin/
67 $(MKBOOTFS) $(dexpreopt_root_out) | gzip > $@
68
69sign_dexpreopt := true
70ifdef sign_dexpreopt
71 # Such a huge hack. We need to re-sign the .apks with the
72 # same certs that they were originally signed with.
73 dexpreopt_package_certs_file := $(intermediates)/package-certs
74 $(shell mkdir -p $(intermediates))
75 $(shell rm -f $(dexpreopt_package_certs_file))
76 $(foreach p,$(PACKAGES),\
77 $(shell echo "$(p) $(PACKAGES.$(p).CERTIFICATE) $(PACKAGES.$(p).PRIVATE_KEY)" >> $(dexpreopt_package_certs_file)))
78endif
79
80# Build an optimized image from the unoptimized image
81BUILT_DEXPREOPT_SYSTEMIMAGE := $(intermediates)/system.img
82$(BUILT_DEXPREOPT_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE_UNOPT)
83$(BUILT_DEXPREOPT_SYSTEMIMAGE): $(BUILT_DEXPREOPT_RAMDISK)
84$(BUILT_DEXPREOPT_SYSTEMIMAGE): | $(DEXPREOPT) $(ACP) $(ZIPALIGN)
85$(BUILT_DEXPREOPT_SYSTEMIMAGE): SYSTEM_DIR := $(dexpreopt_system_dir)
86$(BUILT_DEXPREOPT_SYSTEMIMAGE): DEXPREOPT_TMP := $(intermediates)/emutmp
87ifdef sign_dexpreopt
88$(BUILT_DEXPREOPT_SYSTEMIMAGE): | $(SIGNAPK_JAR)
89endif
90$(BUILT_DEXPREOPT_SYSTEMIMAGE):
91 @rm -f $@
92 @echo "dexpreopt: copy system to $(SYSTEM_DIR)"
93 @rm -rf $(SYSTEM_DIR)
94 @mkdir -p $(dir $(SYSTEM_DIR))
95 $(hide) $(ACP) -rd $(TARGET_OUT) $(SYSTEM_DIR)
96 @echo "dexpreopt: optimize dex files"
97 @rm -rf $(DEXPREOPT_TMP)
98 @mkdir -p $(DEXPREOPT_TMP)
99 $(hide) \
100 PATH=$(HOST_OUT_EXECUTABLES):$$PATH \
101 $(DEXPREOPT) \
102 --kernel prebuilt/android-arm/kernel/kernel-qemu \
103 --ramdisk $(BUILT_DEXPREOPT_RAMDISK) \
104 --image $(BUILT_SYSTEMIMAGE_UNOPT) \
105 --system $(PRODUCT_OUT) \
106 --tmpdir $(DEXPREOPT_TMP) \
107 --outsystemdir $(SYSTEM_DIR)
108ifdef sign_dexpreopt
109 @echo "dexpreopt: re-sign apk files"
110 $(hide) \
111 export PATH=$(HOST_OUT_EXECUTABLES):$$PATH; \
112 for apk in $(SYSTEM_DIR)/app/*.apk; do \
113 packageName=`basename $$apk`; \
114 packageName=`echo $$packageName | sed -e 's/.apk$$//'`; \
115 cert=`grep "^$$packageName " $(dexpreopt_package_certs_file) | \
116 awk '{print $$2}'`; \
117 pkey=`grep "^$$packageName " $(dexpreopt_package_certs_file) | \
118 awk '{print $$3}'`; \
119 if [ "$$cert" -a "$$pkey" ]; then \
120 echo "dexpreopt: re-sign app/"$$packageName".apk"; \
121 tmpApk=$$apk~; \
122 rm -f $$tmpApk; \
123 java -jar $(SIGNAPK_JAR) $$cert $$pkey $$apk $$tmpApk || \
124 exit 11; \
125 mv -f $$tmpApk $$apk; \
126 else \
127 echo "dexpreopt: no keys for app/"$$packageName".apk"; \
128 rm $(SYSTEM_DIR)/app/$$packageName.* && \
129 cp $(TARGET_OUT)/app/$$packageName.apk \
130 $(SYSTEM_DIR)/app || exit 12; \
131 fi; \
132 tmpApk=$$apk~; \
133 rm -f $$tmpApk; \
134 $(ZIPALIGN) -f 4 $$apk $$tmpApk || exit 13; \
135 mv -f $$tmpApk $$apk; \
136 done
137endif
138 @echo "Dexpreopt system image: $@"
139 $(hide) $(MKYAFFS2) -f $(SYSTEM_DIR) $@
140
141.PHONY: dexpreoptimage
142dexpreoptimage: $(BUILT_DEXPREOPT_SYSTEMIMAGE)
143
144# Tell our caller to use the optimized systemimage
145BUILT_SYSTEMIMAGE := $(BUILT_DEXPREOPT_SYSTEMIMAGE)
146SYSTEMIMAGE_SOURCE_DIR := $(dexpreopt_system_dir)