summaryrefslogtreecommitdiffstats
path: root/tools/dexpreopt/Config.mk
blob: c6639b28fc7b44fb6b33132edfc20d47fc07368a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#
# Copyright (C) 2008 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.
#

#
# Included by config/Makefile.
# Defines the pieces necessary for the dexpreopt process.
#
# inputs: INSTALLED_RAMDISK_TARGET, BUILT_SYSTEMIMAGE_UNOPT
# outputs: BUILT_SYSTEMIMAGE, SYSTEMIMAGE_SOURCE_DIR
#
LOCAL_PATH := $(my-dir)

# TODO: see if we can make the .odex files not be product-specific.
# They can't be completely common, though, because their format
# depends on the architecture of the target system; ARM and x86
# would have different versions.
intermediates := \
	$(call intermediates-dir-for,PACKAGING,dexpreopt)
dexpreopt_system_dir := $(intermediates)/system
built_afar := $(call intermediates-dir-for,EXECUTABLES,afar)/afar
built_dowrapper := \
	$(call intermediates-dir-for,EXECUTABLES,dexopt-wrapper)/dexopt-wrapper

# Generate a stripped-down init.rc based on the real one.
dexpreopt_initrc := $(intermediates)/etc/init.rc
geninitrc_script := $(LOCAL_PATH)/geninitrc.awk
$(dexpreopt_initrc): script := $(geninitrc_script)
$(dexpreopt_initrc): system/core/rootdir/init.rc $(geninitrc_script)
	@echo "Dexpreopt init.rc: $@"
	@mkdir -p $(dir $@)
	$(hide) awk -f $(script) < $< > $@

BUILT_DEXPREOPT_RAMDISK := $(intermediates)/ramdisk.img
$(BUILT_DEXPREOPT_RAMDISK): intermediates := $(intermediates)
$(BUILT_DEXPREOPT_RAMDISK): dexpreopt_root_out := $(intermediates)/root
$(BUILT_DEXPREOPT_RAMDISK): dexpreopt_initrc := $(dexpreopt_initrc)
$(BUILT_DEXPREOPT_RAMDISK): built_afar := $(built_afar)
$(BUILT_DEXPREOPT_RAMDISK): built_dowrapper := $(built_dowrapper)
$(BUILT_DEXPREOPT_RAMDISK): \
	$(INSTALLED_RAMDISK_TARGET) \
	$(dexpreopt_initrc) \
	$(built_afar) \
	$(built_dowrapper) \
	| $(MKBOOTFS) $(ACP)
$(BUILT_DEXPREOPT_RAMDISK):
	@echo "Dexpreopt ramdisk: $@"
	$(hide) rm -f $@
	$(hide) rm -rf $(dexpreopt_root_out)
	$(hide) mkdir -p $(dexpreopt_root_out)
	$(hide) $(ACP) -rd $(TARGET_ROOT_OUT) $(intermediates)
	$(hide) $(ACP) -f $(dexpreopt_initrc) $(dexpreopt_root_out)/
	$(hide) $(ACP) $(built_afar) $(dexpreopt_root_out)/sbin/
	$(hide) $(ACP) $(built_dowrapper) $(dexpreopt_root_out)/sbin/
	$(MKBOOTFS) $(dexpreopt_root_out) | gzip > $@

sign_dexpreopt := true
ifdef sign_dexpreopt
  # Such a huge hack.  We need to re-sign the .apks with the
  # same certs that they were originally signed with.
  dexpreopt_package_certs_file := $(intermediates)/package-certs
  $(shell mkdir -p $(intermediates))
  $(shell rm -f $(dexpreopt_package_certs_file))
  $(foreach p,$(PACKAGES),\
    $(shell echo "$(p) $(PACKAGES.$(p).CERTIFICATE) $(PACKAGES.$(p).PRIVATE_KEY)" >> $(dexpreopt_package_certs_file)))
endif

# Build an optimized image from the unoptimized image
BUILT_DEXPREOPT_SYSTEMIMAGE := $(intermediates)/system.img
$(BUILT_DEXPREOPT_SYSTEMIMAGE): $(BUILT_SYSTEMIMAGE_UNOPT)
$(BUILT_DEXPREOPT_SYSTEMIMAGE): $(BUILT_DEXPREOPT_RAMDISK)
$(BUILT_DEXPREOPT_SYSTEMIMAGE): | $(DEXPREOPT) $(ACP) $(ZIPALIGN)
$(BUILT_DEXPREOPT_SYSTEMIMAGE): SYSTEM_DIR := $(dexpreopt_system_dir)
$(BUILT_DEXPREOPT_SYSTEMIMAGE): DEXPREOPT_TMP := $(intermediates)/emutmp
ifdef sign_dexpreopt
$(BUILT_DEXPREOPT_SYSTEMIMAGE): | $(SIGNAPK_JAR)
endif
$(BUILT_DEXPREOPT_SYSTEMIMAGE):
	@rm -f $@
	@echo "dexpreopt: copy system to $(SYSTEM_DIR)"
	@rm -rf $(SYSTEM_DIR)
	@mkdir -p $(dir $(SYSTEM_DIR))
	$(hide) $(ACP) -rd $(TARGET_OUT) $(SYSTEM_DIR)
	@echo "dexpreopt: optimize dex files"
	@rm -rf $(DEXPREOPT_TMP)
	@mkdir -p $(DEXPREOPT_TMP)
	$(hide) \
	    PATH=$(HOST_OUT_EXECUTABLES):$$PATH \
	    $(DEXPREOPT) \
		    --kernel prebuilt/android-arm/kernel/kernel-qemu \
		    --ramdisk $(BUILT_DEXPREOPT_RAMDISK) \
		    --image $(BUILT_SYSTEMIMAGE_UNOPT) \
		    --system $(PRODUCT_OUT) \
		    --tmpdir $(DEXPREOPT_TMP) \
		    --outsystemdir $(SYSTEM_DIR)
ifdef sign_dexpreopt
	@echo "dexpreopt: re-sign apk files"
	$(hide) \
	    export PATH=$(HOST_OUT_EXECUTABLES):$$PATH; \
	    for apk in $(SYSTEM_DIR)/app/*.apk; do \
		packageName=`basename $$apk`; \
		packageName=`echo $$packageName | sed -e 's/.apk$$//'`; \
		cert=`grep "^$$packageName " $(dexpreopt_package_certs_file) | \
		      awk '{print $$2}'`; \
		pkey=`grep "^$$packageName " $(dexpreopt_package_certs_file) | \
		      awk '{print $$3}'`; \
		if [ "$$cert" -a "$$pkey" ]; then \
		    echo "dexpreopt: re-sign app/"$$packageName".apk"; \
		    tmpApk=$$apk~; \
		    rm -f $$tmpApk; \
		    java -jar $(SIGNAPK_JAR) $$cert $$pkey $$apk $$tmpApk || \
			  exit 11; \
		    mv -f $$tmpApk $$apk; \
		else \
		    echo "dexpreopt: no keys for app/"$$packageName".apk"; \
		    rm $(SYSTEM_DIR)/app/$$packageName.* && \
			cp $(TARGET_OUT)/app/$$packageName.apk \
			   $(SYSTEM_DIR)/app || exit 12; \
		fi; \
		tmpApk=$$apk~; \
		rm -f $$tmpApk; \
		$(ZIPALIGN) -f 4 $$apk $$tmpApk || exit 13; \
		mv -f $$tmpApk $$apk; \
	    done
endif
	@echo "Dexpreopt system image: $@"
	$(hide) $(MKYAFFS2) -f $(SYSTEM_DIR) $@

.PHONY: dexpreoptimage
dexpreoptimage: $(BUILT_DEXPREOPT_SYSTEMIMAGE)

# Tell our caller to use the optimized systemimage
BUILT_SYSTEMIMAGE := $(BUILT_DEXPREOPT_SYSTEMIMAGE)
SYSTEMIMAGE_SOURCE_DIR := $(dexpreopt_system_dir)