1 # Requires: 2 # LOCAL_MODULE_SUFFIX 3 # LOCAL_MODULE_CLASS 4 # all_res_assets 5 6 # Make sure there's something to build. 7 # It's possible to build a package that doesn't contain any classes. 8 ifeq (,$(strip $(LOCAL_SRC_FILES)$(all_res_assets))) 9 $(error $(LOCAL_PATH): Target java module does not define any source or resource files) 10 endif 11 12 LOCAL_NO_STANDARD_LIBRARIES:=$(strip $(LOCAL_NO_STANDARD_LIBRARIES)) 13 LOCAL_SDK_VERSION:=$(strip $(LOCAL_SDK_VERSION)) 14 15 ifneq ($(LOCAL_SDK_VERSION),) 16 ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true) 17 $(error $(LOCAL_PATH): Must not define both LOCAL_NO_STANDARD_LIBRARIES and LOCAL_SDK_VERSION) 18 else 19 ifeq ($(strip $(filter $(LOCAL_SDK_VERSION),$(TARGET_AVAILABLE_SDK_VERSIONS))),) 20 $(error $(LOCAL_PATH): Invalid LOCAL_SDK_VERSION '$(LOCAL_SDK_VERSION)' \ 21 Choices are: $(TARGET_AVAILABLE_SDK_VERSIONS)) 22 else 23 ifeq ($(LOCAL_SDK_VERSION),current) 24 LOCAL_JAVA_LIBRARIES := android_stubs_$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES) 25 else 26 LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES) 27 endif 28 endif 29 endif 30 else 31 ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true) 32 LOCAL_JAVA_LIBRARIES := core core-junit ext framework $(LOCAL_JAVA_LIBRARIES) 33 endif 34 endif 35 LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES)) 36 37 LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM)) 38 ifeq ($(LOCAL_BUILT_MODULE_STEM),) 39 $(error $(LOCAL_PATH): Target java template must define LOCAL_BUILT_MODULE_STEM) 40 endif 41 ifneq ($(filter classes-compiled.jar classes.jar,$(LOCAL_BUILT_MODULE_STEM)),) 42 $(error LOCAL_BUILT_MODULE_STEM may not be "$(LOCAL_BUILT_MODULE_STEM)") 43 endif 44 45 46 ############################################################################## 47 # Define the intermediate targets before including base_rules so they get 48 # the correct environment. 49 ############################################################################## 50 51 intermediates := $(call local-intermediates-dir) 52 intermediates.COMMON := $(call local-intermediates-dir,COMMON) 53 54 # Emma source code coverage 55 ifneq ($(EMMA_INSTRUMENT),true) 56 LOCAL_NO_EMMA_INSTRUMENT := true 57 LOCAL_NO_EMMA_COMPILE := true 58 endif 59 60 # Choose leaf name for the compiled jar file. 61 ifneq ($(LOCAL_NO_EMMA_COMPILE),true) 62 full_classes_compiled_jar_leaf := classes-no-debug-var.jar 63 built_dex_intermediate_leaf := classes-no-local.dex 64 else 65 full_classes_compiled_jar_leaf := classes-full-debug.jar 66 built_dex_intermediate_leaf := classes-with-local.dex 67 endif 68 69 LOCAL_PROGUARD_ENABLED:=$(strip $(LOCAL_PROGUARD_ENABLED)) 70 ifeq ($(LOCAL_PROGUARD_ENABLED),disabled) 71 LOCAL_PROGUARD_ENABLED := 72 endif 73 74 # By giving different file name, files can be updated correctly when switching 75 # between builds with and without Proguard enabled. 76 # Note that ANY intermediate targets between the proguard and 77 # the final built_dex should be differently named! 78 ifdef LOCAL_PROGUARD_ENABLED 79 proguard_jar_leaf := proguard.classes.jar 80 built_dex_intermediate_leaf := proguard.$(built_dex_intermediate_leaf) 81 built_dex_leaf := progaurd.classes.dex 82 else 83 proguard_jar_leaf := noproguard.classes.jar 84 built_dex_intermediate_leaf := noproguard.$(built_dex_intermediate_leaf) 85 built_dex_leaf := noproguard.classes.dex 86 endif 87 88 full_classes_compiled_jar := $(intermediates.COMMON)/$(full_classes_compiled_jar_leaf) 89 jarjar_leaf := classes-jarjar.jar 90 full_classes_jarjar_jar := $(intermediates.COMMON)/$(jarjar_leaf) 91 emma_intermediates_dir := $(intermediates.COMMON)/emma_out 92 # emma is hardcoded to use the leaf name of its input for the output file -- 93 # only the output directory can be changed 94 full_classes_emma_jar := $(emma_intermediates_dir)/lib/$(jarjar_leaf) 95 full_classes_proguard_jar := $(intermediates.COMMON)/$(proguard_jar_leaf) 96 built_dex_intermediate := $(intermediates.COMMON)/$(built_dex_intermediate_leaf) 97 full_classes_stubs_jar := $(intermediates.COMMON)/stubs.jar 98 99 # full_classes_jar and built_dex are cleared below, and re-set if we really need them. 100 full_classes_jar := $(intermediates.COMMON)/classes.jar 101 built_dex := $(intermediates.COMMON)/$(built_dex_leaf) 102 103 LOCAL_INTERMEDIATE_TARGETS += \ 104 $(full_classes_compiled_jar) \ 105 $(full_classes_jarjar_jar) \ 106 $(full_classes_emma_jar) \ 107 $(full_classes_jar) \ 108 $(full_classes_proguard_jar) \ 109 $(built_dex_intermediate) \ 110 $(built_dex) \ 111 $(full_classes_stubs_jar) 112 113 114 LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src 115 116 # TODO: It looks like the only thing we need from base_rules is 117 # all_java_sources. See if we can get that by adding a 118 # common_java.mk, and moving the include of base_rules.mk to 119 # after all the declarations. 120 121 ####################################### 122 include $(BUILD_SYSTEM)/base_rules.mk 123 ####################################### 124 125 # We use intermediates.COMMON because the classes.jar/.dex files will be 126 # common even if LOCAL_BUILT_MODULE isn't. 127 # 128 # Override some target variables that base_rules set up for us. 129 $(LOCAL_INTERMEDIATE_TARGETS): \ 130 PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates.COMMON)/classes 131 $(LOCAL_INTERMEDIATE_TARGETS): \ 132 PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR) 133 134 # Since we're using intermediates.COMMON, make sure that it gets cleaned 135 # properly. 136 $(cleantarget): PRIVATE_CLEAN_FILES += $(intermediates.COMMON) 137 138 # If the module includes java code (i.e., it's not framework-res), compile it. 139 full_classes_jar := 140 built_dex := 141 ifneq (,$(strip $(all_java_sources))) 142 143 # If LOCAL_BUILT_MODULE_STEM wasn't overridden by our caller, 144 # full_classes_jar will be the same module as LOCAL_BUILT_MODULE. 145 # Otherwise, the caller will define it as a prerequisite of 146 # LOCAL_BUILT_MODULE, so it will inherit the necessary PRIVATE_* 147 # variable definitions. 148 full_classes_jar := $(intermediates.COMMON)/classes.jar 149 built_dex := $(intermediates.COMMON)/$(built_dex_leaf) 150 151 # Droiddoc isn't currently able to generate stubs for modules, so we're just 152 # allowing it to use the classes.jar as the "stubs" that would be use to link 153 # against, for the cases where someone needs the jar to link against. 154 # - Use the classes.jar instead of the handful of other intermediates that 155 # we have, because it's the most processed, but still hasn't had dex run on 156 # it, so it's closest to what's on the device. 157 # - This extra copy, with the dependency on LOCAL_BUILT_MODULE allows the 158 # PRIVATE_ vars to be preserved. 159 $(full_classes_stubs_jar): PRIVATE_SOURCE_FILE := $(full_classes_jar) 160 $(full_classes_stubs_jar) : $(LOCAL_BUILT_MODULE) | $(ACP) 161 @echo Copying $(PRIVATE_SOURCE_FILE) 162 $(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@ 163 ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar) 164 165 # Compile the java files to a .jar file. 166 # This intentionally depends on java_sources, not all_java_sources. 167 # Deps for generated source files must be handled separately, 168 # via deps on the target that generates the sources. 169 $(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS) 170 $(full_classes_compiled_jar): $(java_sources) $(java_resource_sources) $(full_java_lib_deps) $(jar_manifest_file) 171 $(transform-java-to-classes.jar) 172 173 # All of the rules after full_classes_compiled_jar are very unlikely 174 # to fail except for bugs in their respective tools. If you would 175 # like to run these rules, add the "all" modifier goal to the make 176 # command line. 177 # This overwrites the value defined in base_rules.mk. That's a little 178 # dirty. It's preferable to set LOCAL_CHECKED_MODULE, but this has to 179 # be done after the inclusion of base_rules.mk. 180 ALL_MODULES.$(LOCAL_MODULE).CHECKED := $(full_classes_compiled_jar) 181 182 $(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g 183 184 # Run jarjar if necessary, otherwise just copy the file. 185 ifneq ($(strip $(LOCAL_JARJAR_RULES)),) 186 $(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES) 187 $(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(JARJAR) 188 @echo JarJar: $@ 189 $(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@ 190 else 191 $(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(ACP) 192 @echo Copying: $@ 193 $(hide) $(ACP) $< $@ 194 endif 195 196 ifeq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true) 197 # Skip adding emma instrumentation to class files if this is a static library, 198 # since it will be instrumented by the package that includes it 199 LOCAL_NO_EMMA_INSTRUMENT:= true 200 endif 201 202 ifneq ($(LOCAL_NO_EMMA_INSTRUMENT),true) 203 $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.em 204 $(full_classes_emma_jar): PRIVATE_EMMA_INTERMEDIATES_DIR := $(emma_intermediates_dir) 205 # module level coverage filter can be defined using LOCAL_EMMA_COVERAGE_FILTER 206 # in Android.mk 207 ifdef LOCAL_EMMA_COVERAGE_FILTER 208 $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := $(LOCAL_EMMA_COVERAGE_FILTER) 209 else 210 # by default, avoid applying emma instrumentation onto emma classes itself, 211 # otherwise there will be exceptions thrown 212 $(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := *,-emma,-emmarun,-com.vladium.* 213 endif 214 # this rule will generate both $(PRIVATE_EMMA_COVERAGE_FILE) and 215 # $(full_classes_emma_jar) 216 $(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(EMMA_JAR) 217 $(transform-classes.jar-to-emma) 218 $(PRIVATE_EMMA_COVERAGE_FILE): $(full_classes_emma_jar) 219 220 # tell proguard to load emma jar 221 LOCAL_PROGUARD_FLAGS := $(LOCAL_PROGUARD_FLAGS) $(addprefix -libraryjars ,$(EMMA_JAR)) 222 else 223 $(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(ACP) 224 @echo Copying: $@ 225 $(copy-file-to-target) 226 endif 227 228 # Keep a copy of the jar just before proguard processing. 229 $(full_classes_jar): $(full_classes_emma_jar) | $(ACP) 230 @echo Copying: $@ 231 $(hide) $(ACP) $< $@ 232 233 # Run proguard if necessary, otherwise just copy the file. 234 proguard_dictionary := $(intermediates.COMMON)/proguard_dictionary 235 # Proguard doesn't like a class in both library and the jar to be processed. 236 proguard_full_java_libs := $(filter-out $(full_static_java_libs),$(full_java_libs)) 237 proguard_flags := $(addprefix -libraryjars ,$(proguard_full_java_libs)) \ 238 -include $(BUILD_SYSTEM)/proguard.flags \ 239 -forceprocessing \ 240 -printmapping $(proguard_dictionary) 241 # If this is a test package, add proguard keep flags for tests. 242 ifneq ($(strip $(LOCAL_INSTRUMENTATION_FOR)$(filter tests,$(LOCAL_MODULE_TAGS))$(filter android.test.runner,$(LOCAL_JAVA_LIBRARIES))),) 243 proguard_flags := $(proguard_flags) -include $(BUILD_SYSTEM)/proguard_tests.flags 244 endif # test package 245 246 ifneq ($(LOCAL_PROGUARD_ENABLED),) 247 ifeq ($(LOCAL_PROGUARD_ENABLED),full) 248 # full 249 else 250 ifeq ($(LOCAL_PROGUARD_ENABLED),optonly) 251 # optonly 252 proguard_flags += -dontobfuscate 253 else 254 ifeq ($(LOCAL_PROGUARD_ENABLED),custom) 255 # custom 256 else 257 $(warning while processing: $(LOCAL_MODULE)) 258 $(error invalid value for LOCAL_PROGUARD_ENABLED: $(LOCAL_PROGUARD_ENABLED)) 259 endif # custom 260 endif # optonly 261 endif # full 262 endif # LOCAL_PROGUARD_ENABLED 263 264 proguard_flag_files := $(addprefix $(LOCAL_PATH)/, $(LOCAL_PROGUARD_FLAG_FILES)) 265 LOCAL_PROGUARD_FLAGS += $(addprefix -include , $(proguard_flag_files)) 266 267 $(full_classes_proguard_jar): PRIVATE_PROGUARD_ENABLED:=$(LOCAL_PROGUARD_ENABLED) 268 $(full_classes_proguard_jar): PRIVATE_PROGUARD_FLAGS := $(proguard_flags) $(LOCAL_PROGUARD_FLAGS) 269 $(full_classes_proguard_jar): PRIVATE_INSTRUMENTATION_FOR:=$(strip $(LOCAL_INSTRUMENTATION_FOR)) 270 $(full_classes_proguard_jar) : $(full_classes_jar) $(proguard_flag_files) | $(ACP) $(PROGUARD) 271 $(call transform-jar-to-proguard) 272 273 ALL_MODULES.$(LOCAL_MODULE).PROGUARD_ENABLED:=$(LOCAL_PROGUARD_ENABLED) 274 275 # If you instrument class files that have local variable debug information in 276 # them emma does not correctly maintain the local variable table. 277 # This will cause an error when you try to convert the class files for Android. 278 # The workaround here is to build different dex file here based on emma switch 279 # then later copy into classes.dex. When emma is on, dx is run with --no-locals 280 # option to remove local variable information 281 282 # Override PRIVATE_INTERMEDIATES_DIR so that install-dex-debug 283 # will work even when intermediates != intermediates.COMMON. 284 $(built_dex_intermediate): PRIVATE_INTERMEDIATES_DIR := $(intermediates.COMMON) 285 $(built_dex_intermediate): PRIVATE_DX_FLAGS := $(LOCAL_DX_FLAGS) 286 ifneq ($(LOCAL_NO_EMMA_COMPILE),true) 287 $(built_dex_intermediate): PRIVATE_DX_FLAGS += --no-locals 288 endif 289 $(built_dex_intermediate): $(full_classes_proguard_jar) $(DX) 290 $(transform-classes.jar-to-dex) 291 $(built_dex): $(built_dex_intermediate) | $(ACP) 292 @echo Copying: $@ 293 $(hide) $(ACP) $< $@ 294 ifneq ($(GENERATE_DEX_DEBUG),) 295 $(install-dex-debug) 296 endif 297 298 findbugs_xml := $(intermediates.COMMON)/findbugs.xml 299 $(findbugs_xml) : PRIVATE_JAR_FILE := $(full_classes_jar) 300 $(findbugs_xml) : PRIVATE_AUXCLASSPATH := $(addprefix -auxclasspath ,$(strip \ 301 $(call normalize-path-list,$(filter %.jar,\ 302 $(full_java_libs))))) 303 # We can't depend directly on full_classes_jar because the PRIVATE_ 304 # vars won't be set up correctly. 305 $(findbugs_xml) : $(LOCAL_BUILT_MODULE) 306 @echo Findbugs: $@ 307 $(hide) $(FINDBUGS) -textui -effort:min -xml:withMessages \ 308 $(PRIVATE_AUXCLASSPATH) \ 309 $(PRIVATE_JAR_FILE) \ 310 > $@ 311 312 ALL_FINDBUGS_FILES += $(findbugs_xml) 313 314 findbugs_html := $(PRODUCT_OUT)/findbugs/$(LOCAL_MODULE).html 315 $(findbugs_html) : PRIVATE_XML_FILE := $(findbugs_xml) 316 $(LOCAL_MODULE)-findbugs : $(findbugs_html) 317 $(findbugs_html) : $(findbugs_xml) 318 @mkdir -p $(dir $@) 319 @echo ConvertXmlToText: $@ 320 $(hide) prebuilt/common/findbugs/bin/convertXmlToText -html:fancy.xsl $(PRIVATE_XML_FILE) \ 321 > $@ 322 323 $(LOCAL_MODULE)-findbugs : $(findbugs_html) 324 325 endif 326