java.mk revision 37822c443d3d2ba88dd009c994f088906a0f5568
1# Requires:
2# LOCAL_MODULE_SUFFIX
3# LOCAL_MODULE_CLASS
4# all_res_assets
5
6ifeq ($(TARGET_BUILD_PDK),true)
7ifeq ($(TARGET_BUILD_PDK_JAVA_PLATFORM),)
8# LOCAL_SDK not defined or set to current
9ifeq ($(filter-out current,$(LOCAL_SDK_VERSION)),)
10ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
11LOCAL_SDK_VERSION := $(PDK_BUILD_SDK_VERSION)
12endif #!LOCAL_NO_STANDARD_LIBRARIES
13endif
14endif # !PDK_JAVA
15endif #PDK
16
17LOCAL_NO_STANDARD_LIBRARIES:=$(strip $(LOCAL_NO_STANDARD_LIBRARIES))
18LOCAL_SDK_VERSION:=$(strip $(LOCAL_SDK_VERSION))
19
20ifneq ($(LOCAL_SDK_VERSION),)
21  ifeq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
22    $(error $(LOCAL_PATH): Must not define both LOCAL_NO_STANDARD_LIBRARIES and LOCAL_SDK_VERSION)
23  else
24    ifeq ($(strip $(filter $(LOCAL_SDK_VERSION),$(TARGET_AVAILABLE_SDK_VERSIONS))),)
25      $(error $(LOCAL_PATH): Invalid LOCAL_SDK_VERSION '$(LOCAL_SDK_VERSION)' \
26             Choices are: $(TARGET_AVAILABLE_SDK_VERSIONS))
27    else
28      ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),current)
29        # Use android_stubs_current if LOCAL_SDK_VERSION is current and no TARGET_BUILD_APPS.
30        LOCAL_JAVA_LIBRARIES := android_stubs_current $(LOCAL_JAVA_LIBRARIES)
31      else ifeq ($(LOCAL_SDK_VERSION)$(TARGET_BUILD_APPS),system_current)
32        LOCAL_JAVA_LIBRARIES := android_system_stubs_current $(LOCAL_JAVA_LIBRARIES)
33      else
34        LOCAL_JAVA_LIBRARIES := sdk_v$(LOCAL_SDK_VERSION) $(LOCAL_JAVA_LIBRARIES)
35      endif
36    endif
37  endif
38else
39  ifneq ($(LOCAL_NO_STANDARD_LIBRARIES),true)
40    LOCAL_JAVA_LIBRARIES := $(TARGET_DEFAULT_JAVA_LIBRARIES) $(LOCAL_JAVA_LIBRARIES)
41  endif
42endif
43
44proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES))
45ifneq ($(proto_sources),)
46ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),micro)
47    LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-micro
48else
49  ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),nano)
50    LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-nano
51  else
52    LOCAL_STATIC_JAVA_LIBRARIES += libprotobuf-java-lite
53  endif
54endif
55endif
56
57# LOCAL_STATIC_JAVA_AAR_LIBRARIES are special LOCAL_STATIC_JAVA_LIBRARIES
58LOCAL_STATIC_JAVA_LIBRARIES := $(strip $(LOCAL_STATIC_JAVA_LIBRARIES) $(LOCAL_STATIC_JAVA_AAR_LIBRARIES))
59
60LOCAL_JAVA_LIBRARIES := $(sort $(LOCAL_JAVA_LIBRARIES))
61
62LOCAL_BUILT_MODULE_STEM := $(strip $(LOCAL_BUILT_MODULE_STEM))
63ifeq ($(LOCAL_BUILT_MODULE_STEM),)
64$(error $(LOCAL_PATH): Target java template must define LOCAL_BUILT_MODULE_STEM)
65endif
66ifneq ($(filter classes-compiled.jar classes.jar,$(LOCAL_BUILT_MODULE_STEM)),)
67$(error LOCAL_BUILT_MODULE_STEM may not be "$(LOCAL_BUILT_MODULE_STEM)")
68endif
69
70
71##############################################################################
72# Define the intermediate targets before including base_rules so they get
73# the correct environment.
74##############################################################################
75
76intermediates := $(call local-intermediates-dir)
77intermediates.COMMON := $(call local-intermediates-dir,COMMON)
78
79# Choose leaf name for the compiled jar file.
80ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
81full_classes_compiled_jar_leaf := classes-no-debug-var.jar
82built_dex_intermediate_leaf := no-local
83else
84full_classes_compiled_jar_leaf := classes-full-debug.jar
85built_dex_intermediate_leaf := with-local
86endif
87
88ifeq ($(LOCAL_PROGUARD_ENABLED),disabled)
89LOCAL_PROGUARD_ENABLED :=
90endif
91
92ifdef LOCAL_PROGUARD_ENABLED
93proguard_jar_leaf := proguard.classes.jar
94else
95proguard_jar_leaf := noproguard.classes.jar
96endif
97
98full_classes_compiled_jar := $(intermediates.COMMON)/$(full_classes_compiled_jar_leaf)
99jarjar_leaf := classes-jarjar.jar
100full_classes_jarjar_jar := $(intermediates.COMMON)/$(jarjar_leaf)
101emma_intermediates_dir := $(intermediates.COMMON)/emma_out
102# emma is hardcoded to use the leaf name of its input for the output file --
103# only the output directory can be changed
104full_classes_emma_jar := $(emma_intermediates_dir)/lib/$(jarjar_leaf)
105full_classes_proguard_jar := $(intermediates.COMMON)/$(proguard_jar_leaf)
106built_dex_intermediate := $(intermediates.COMMON)/$(built_dex_intermediate_leaf)/classes.dex
107full_classes_stubs_jar := $(intermediates.COMMON)/stubs.jar
108
109ifeq ($(LOCAL_MODULE_CLASS)$(LOCAL_SRC_FILES)$(LOCAL_STATIC_JAVA_LIBRARIES)$(LOCAL_SOURCE_FILES_ALL_GENERATED),APPS)
110# If this is an apk without any Java code (e.g. framework-res), we should skip compiling Java.
111full_classes_jar :=
112built_dex :=
113else
114full_classes_jar := $(intermediates.COMMON)/classes.jar
115built_dex := $(intermediates.COMMON)/classes.dex
116endif
117# final Jack library, shrinked and obfuscated if it must be
118full_classes_jack := $(intermediates.COMMON)/classes.jack
119# intermediate Jack library without shrink and obfuscation
120noshrob_classes_jack := $(intermediates.COMMON)/classes.noshrob.jack
121
122LOCAL_INTERMEDIATE_TARGETS += \
123    $(full_classes_compiled_jar) \
124    $(full_classes_jarjar_jar) \
125    $(full_classes_emma_jar) \
126    $(full_classes_jar) \
127    $(full_classes_proguard_jar) \
128    $(built_dex_intermediate) \
129    $(full_classes_jack) \
130    $(noshrob_classes_jack) \
131    $(built_dex) \
132    $(full_classes_stubs_jar)
133
134
135LOCAL_INTERMEDIATE_SOURCE_DIR := $(intermediates.COMMON)/src
136
137###############################################################
138## .rs files: RenderScript sources to .java files and .bc files
139## .fs files: Filterscript sources to .java files and .bc files
140###############################################################
141renderscript_sources := $(filter %.rs %.fs,$(LOCAL_SRC_FILES))
142# Because names of the java files from RenderScript are unknown until the
143# .rs file(s) are compiled, we have to depend on a timestamp file.
144RenderScript_file_stamp :=
145rs_compatibility_jni_libs :=
146ifneq ($(renderscript_sources),)
147renderscript_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(renderscript_sources))
148RenderScript_file_stamp := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/RenderScript.stamp
149renderscript_intermediate.COMMON := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript
150
151renderscript_target_api :=
152
153ifneq (,$(LOCAL_RENDERSCRIPT_TARGET_API))
154renderscript_target_api := $(LOCAL_RENDERSCRIPT_TARGET_API)
155else
156ifneq (,$(LOCAL_SDK_VERSION))
157# Set target-api for LOCAL_SDK_VERSIONs other than current.
158ifneq (,$(filter-out current system_current, $(LOCAL_SDK_VERSION)))
159renderscript_target_api := $(LOCAL_SDK_VERSION)
160endif
161endif  # LOCAL_SDK_VERSION is set
162endif  # LOCAL_RENDERSCRIPT_TARGET_API is set
163
164ifeq ($(LOCAL_RENDERSCRIPT_CC),)
165LOCAL_RENDERSCRIPT_CC := $(LLVM_RS_CC)
166endif
167
168# Turn on all warnings and warnings as errors for RS compiles.
169# This can be disabled with LOCAL_RENDERSCRIPT_FLAGS := -Wno-error
170renderscript_flags := -Wall -Werror
171renderscript_flags += $(LOCAL_RENDERSCRIPT_FLAGS)
172
173# prepend the RenderScript system include path
174ifneq ($(filter-out current system_current,$(LOCAL_SDK_VERSION))$(if $(TARGET_BUILD_APPS),$(filter current system_current,$(LOCAL_SDK_VERSION))),)
175# if a numeric LOCAL_SDK_VERSION, or current LOCAL_SDK_VERSION with TARGET_BUILD_APPS
176LOCAL_RENDERSCRIPT_INCLUDES := \
177    $(HISTORICAL_SDK_VERSIONS_ROOT)/renderscript/clang-include \
178    $(HISTORICAL_SDK_VERSIONS_ROOT)/renderscript/include \
179    $(LOCAL_RENDERSCRIPT_INCLUDES)
180else
181LOCAL_RENDERSCRIPT_INCLUDES := \
182    $(TOPDIR)external/clang/lib/Headers \
183    $(TOPDIR)frameworks/rs/scriptc \
184    $(LOCAL_RENDERSCRIPT_INCLUDES)
185endif
186
187ifneq ($(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE),)
188LOCAL_RENDERSCRIPT_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES_OVERRIDE)
189endif
190
191$(RenderScript_file_stamp): PRIVATE_RS_INCLUDES := $(LOCAL_RENDERSCRIPT_INCLUDES)
192$(RenderScript_file_stamp): PRIVATE_RS_CC := $(LOCAL_RENDERSCRIPT_CC)
193$(RenderScript_file_stamp): PRIVATE_RS_FLAGS := $(renderscript_flags)
194$(RenderScript_file_stamp): PRIVATE_RS_SOURCE_FILES := $(renderscript_sources_fullpath)
195# By putting the generated java files into $(LOCAL_INTERMEDIATE_SOURCE_DIR), they will be
196# automatically found by the java compiling function transform-java-to-classes.jar.
197$(RenderScript_file_stamp): PRIVATE_RS_OUTPUT_DIR := $(renderscript_intermediate.COMMON)
198$(RenderScript_file_stamp): PRIVATE_RS_TARGET_API := $(renderscript_target_api)
199$(RenderScript_file_stamp): $(renderscript_sources_fullpath) $(LOCAL_RENDERSCRIPT_CC)
200	$(transform-renderscripts-to-java-and-bc)
201
202ifneq ($(LOCAL_RENDERSCRIPT_COMPATIBILITY),)
203bc_files := $(patsubst %.fs,%.bc, $(patsubst %.rs,%.bc, $(notdir $(renderscript_sources))))
204
205
206ifeq ($(filter $(RSCOMPAT_32BIT_ONLY_API_LEVELS),$(renderscript_target_api)),)
207ifeq ($(TARGET_IS_64_BIT),true)
208renderscript_intermediate.bc_folder := $(renderscript_intermediate.COMMON)/res/raw/bc64/
209else
210renderscript_intermediate.bc_folder := $(renderscript_intermediate.COMMON)/res/raw/bc32/
211endif
212else
213renderscript_intermediate.bc_folder := $(renderscript_intermediate.COMMON)/res/raw/
214endif
215
216rs_generated_bc := $(addprefix \
217    $(renderscript_intermediate.bc_folder), $(bc_files))
218
219renderscript_intermediate := $(intermediates)/renderscript
220
221# We don't need the .so files in bundled branches
222# Prevent these from showing up on the device
223ifneq (,$(TARGET_BUILD_APPS)$(FORCE_BUILD_RS_COMPAT))
224
225rs_compatibility_jni_libs := $(addprefix \
226    $(renderscript_intermediate)/librs., \
227    $(patsubst %.bc,%.so, $(bc_files)))
228
229$(rs_generated_bc) : $(RenderScript_file_stamp)
230
231rs_support_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRSSupport.so
232rs_jni_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/librsjni.so
233LOCAL_JNI_SHARED_LIBRARIES += libRSSupport librsjni
234
235rs_support_io_lib :=
236# check if the target api level support USAGE_IO
237ifeq ($(filter $(RSCOMPAT_NO_USAGEIO_API_LEVELS),$(renderscript_target_api)),)
238rs_support_io_lib := $(TARGET_OUT_INTERMEDIATE_LIBRARIES)/libRSSupportIO.so
239LOCAL_JNI_SHARED_LIBRARIES += libRSSupportIO
240endif
241
242
243$(rs_compatibility_jni_libs): $(RenderScript_file_stamp) $(RS_PREBUILT_CLCORE) \
244    $(rs_support_lib) $(rs_support_io_lib) $(rs_jni_lib) $(rs_compiler_rt)
245$(rs_compatibility_jni_libs): $(BCC_COMPAT)
246$(rs_compatibility_jni_libs): PRIVATE_CXX := $(TARGET_CXX)
247$(rs_compatibility_jni_libs): $(renderscript_intermediate)/librs.%.so: \
248    $(renderscript_intermediate.bc_folder)%.bc
249	$(transform-bc-to-so)
250
251endif
252
253endif
254
255# include the dependency files (.d) generated by llvm-rs-cc.
256renderscript_generated_dep_files := $(addprefix $(renderscript_intermediate.COMMON)/, \
257    $(patsubst %.fs,%.d, $(patsubst %.rs,%.d, $(notdir $(renderscript_sources)))))
258-include $(renderscript_generated_dep_files)
259
260LOCAL_INTERMEDIATE_TARGETS += $(RenderScript_file_stamp)
261# Make sure the generated resource will be added to the apk.
262LOCAL_RESOURCE_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)/renderscript/res $(LOCAL_RESOURCE_DIR)
263endif
264
265# All of the rules after full_classes_compiled_jar are very unlikely
266# to fail except for bugs in their respective tools.  If you would
267# like to run these rules, add the "all" modifier goal to the make
268# command line.
269ifdef full_classes_jar
270java_alternative_checked_module := $(full_classes_compiled_jar)
271else
272java_alternative_checked_module :=
273endif
274
275# TODO: It looks like the only thing we need from base_rules is
276# all_java_sources.  See if we can get that by adding a
277# common_java.mk, and moving the include of base_rules.mk to
278# after all the declarations.
279
280#######################################
281include $(BUILD_SYSTEM)/base_rules.mk
282#######################################
283
284java_alternative_checked_module :=
285
286#######################################
287# defines built_odex along with rule to install odex
288include $(BUILD_SYSTEM)/dex_preopt_odex_install.mk
289#######################################
290
291# Make sure there's something to build.
292ifdef full_classes_jar
293ifndef need_compile_java
294$(error $(LOCAL_PATH): Target java module does not define any source or resource files)
295endif
296endif
297
298# Install the RS compatibility libraries to /system/lib/ if necessary
299ifdef rs_compatibility_jni_libs
300installed_rs_compatibility_jni_libs := $(addprefix $(TARGET_OUT_SHARED_LIBRARIES)/,\
301    $(notdir $(rs_compatibility_jni_libs)))
302# Provide a way to skip sources included in multiple projects.
303ifdef LOCAL_RENDERSCRIPT_SKIP_INSTALL
304skip_install_rs_libs := $(patsubst %.rs,%.so, \
305    $(addprefix $(TARGET_OUT_SHARED_LIBRARIES)/librs., \
306    $(notdir $(LOCAL_RENDERSCRIPT_SKIP_INSTALL))))
307installed_rs_compatibility_jni_libs := \
308    $(filter-out $(skip_install_rs_libs),$(installed_rs_compatibility_jni_libs))
309endif
310ifneq (,$(strip $(installed_rs_compatibility_jni_libs)))
311$(installed_rs_compatibility_jni_libs) : $(TARGET_OUT_SHARED_LIBRARIES)/lib%.so : \
312    $(renderscript_intermediate)/lib%.so
313	$(hide) mkdir -p $(dir $@) && cp -f $< $@
314
315# Install them only if the current module is installed.
316$(LOCAL_INSTALLED_MODULE) : $(installed_rs_compatibility_jni_libs)
317endif
318endif
319
320# We use intermediates.COMMON because the classes.jar/.dex files will be
321# common even if LOCAL_BUILT_MODULE isn't.
322#
323# Override some target variables that base_rules set up for us.
324$(LOCAL_INTERMEDIATE_TARGETS): \
325	PRIVATE_CLASS_INTERMEDIATES_DIR := $(intermediates.COMMON)/classes
326$(LOCAL_INTERMEDIATE_TARGETS): \
327	PRIVATE_SOURCE_INTERMEDIATES_DIR := $(LOCAL_INTERMEDIATE_SOURCE_DIR)
328
329# Since we're using intermediates.COMMON, make sure that it gets cleaned
330# properly.
331$(cleantarget): PRIVATE_CLEAN_FILES += $(intermediates.COMMON)
332
333ifdef full_classes_jar
334
335# Droiddoc isn't currently able to generate stubs for modules, so we're just
336# allowing it to use the classes.jar as the "stubs" that would be use to link
337# against, for the cases where someone needs the jar to link against.
338# - Use the classes.jar instead of the handful of other intermediates that
339#   we have, because it's the most processed, but still hasn't had dex run on
340#   it, so it's closest to what's on the device.
341# - This extra copy, with the dependency on LOCAL_BUILT_MODULE allows the
342#   PRIVATE_ vars to be preserved.
343$(full_classes_stubs_jar): PRIVATE_SOURCE_FILE := $(full_classes_jar)
344$(full_classes_stubs_jar) : $(full_classes_jar) | $(ACP)
345	@echo Copying $(PRIVATE_SOURCE_FILE)
346	$(hide) $(ACP) -fp $(PRIVATE_SOURCE_FILE) $@
347ALL_MODULES.$(LOCAL_MODULE).STUBS := $(full_classes_stubs_jar)
348
349# The layers file allows you to enforce a layering between java packages.
350# Run build/tools/java-layers.py for more details.
351layers_file := $(addprefix $(LOCAL_PATH)/, $(LOCAL_JAVA_LAYERS_FILE))
352$(full_classes_compiled_jar): PRIVATE_JAVA_LAYERS_FILE := $(layers_file)
353$(full_classes_compiled_jar): PRIVATE_WARNINGS_ENABLE := $(LOCAL_WARNINGS_ENABLE)
354
355ifdef LOCAL_RMTYPEDEFS
356$(full_classes_compiled_jar): | $(RMTYPEDEFS)
357endif
358
359# Compile the java files to a .jar file.
360# This intentionally depends on java_sources, not all_java_sources.
361# Deps for generated source files must be handled separately,
362# via deps on the target that generates the sources.
363$(full_classes_compiled_jar): PRIVATE_JAVACFLAGS := $(LOCAL_JAVACFLAGS)
364$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_FILES := $(LOCAL_JAR_EXCLUDE_FILES)
365$(full_classes_compiled_jar): PRIVATE_JAR_PACKAGES := $(LOCAL_JAR_PACKAGES)
366$(full_classes_compiled_jar): PRIVATE_JAR_EXCLUDE_PACKAGES := $(LOCAL_JAR_EXCLUDE_PACKAGES)
367$(full_classes_compiled_jar): PRIVATE_RMTYPEDEFS := $(LOCAL_RMTYPEDEFS)
368$(full_classes_compiled_jar): PRIVATE_DONT_DELETE_JAR_META_INF := $(LOCAL_DONT_DELETE_JAR_META_INF)
369$(full_classes_compiled_jar): \
370        $(java_sources) \
371        $(java_resource_sources) \
372        $(full_java_lib_deps) \
373        $(jar_manifest_file) \
374        $(layers_file) \
375        $(RenderScript_file_stamp) \
376        $(proto_java_sources_file_stamp) \
377        $(LOCAL_MODULE_MAKEFILE) \
378        $(LOCAL_ADDITIONAL_DEPENDENCIES)
379	$(transform-java-to-classes.jar)
380
381$(full_classes_compiled_jar): PRIVATE_JAVAC_DEBUG_FLAGS := -g
382
383# Run jarjar if necessary, otherwise just copy the file.
384ifneq ($(strip $(LOCAL_JARJAR_RULES)),)
385$(full_classes_jarjar_jar): PRIVATE_JARJAR_RULES := $(LOCAL_JARJAR_RULES)
386$(full_classes_jarjar_jar): $(full_classes_compiled_jar) $(LOCAL_JARJAR_RULES) | $(JARJAR)
387	@echo JarJar: $@
388	$(hide) java -jar $(JARJAR) process $(PRIVATE_JARJAR_RULES) $< $@
389else
390$(full_classes_jarjar_jar): $(full_classes_compiled_jar) | $(ACP)
391	@echo Copying: $@
392	$(hide) $(ACP) -fp $< $@
393endif
394
395ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
396$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILE := $(intermediates.COMMON)/coverage.em
397$(full_classes_emma_jar): PRIVATE_EMMA_INTERMEDIATES_DIR := $(emma_intermediates_dir)
398# module level coverage filter can be defined using LOCAL_EMMA_COVERAGE_FILTER
399# in Android.mk
400ifdef LOCAL_EMMA_COVERAGE_FILTER
401$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := $(LOCAL_EMMA_COVERAGE_FILTER)
402else
403# by default, avoid applying emma instrumentation onto emma classes itself,
404# otherwise there will be exceptions thrown
405$(full_classes_emma_jar): PRIVATE_EMMA_COVERAGE_FILTER := *,-emma,-emmarun,-com.vladium.*
406endif
407# this rule will generate both $(PRIVATE_EMMA_COVERAGE_FILE) and
408# $(full_classes_emma_jar)
409$(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(EMMA_JAR)
410	$(transform-classes.jar-to-emma)
411
412else
413$(full_classes_emma_jar): $(full_classes_jarjar_jar) | $(ACP)
414	@echo Copying: $@
415	$(copy-file-to-target)
416endif
417
418# Keep a copy of the jar just before proguard processing.
419$(full_classes_jar): $(full_classes_emma_jar) | $(ACP)
420	@echo Copying: $@
421	$(hide) $(ACP) -fp $< $@
422
423# Run proguard if necessary, otherwise just copy the file.
424ifdef LOCAL_PROGUARD_ENABLED
425ifneq ($(filter-out full custom nosystem obfuscation optimization shrinktests,$(LOCAL_PROGUARD_ENABLED)),)
426    $(warning while processing: $(LOCAL_MODULE))
427    $(error invalid value for LOCAL_PROGUARD_ENABLED: $(LOCAL_PROGUARD_ENABLED))
428endif
429proguard_dictionary := $(intermediates.COMMON)/proguard_dictionary
430# jack already has the libraries in its classpath and doesn't support jars
431legacy_proguard_flags := $(addprefix -libraryjars ,$(full_shared_java_libs))
432common_proguard_flags :=  \
433                  -forceprocessing \
434                  -printmapping $(proguard_dictionary)
435
436ifeq ($(filter nosystem,$(LOCAL_PROGUARD_ENABLED)),)
437common_proguard_flags += -include $(BUILD_SYSTEM)/proguard.flags
438ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
439common_proguard_flags += -include $(BUILD_SYSTEM)/proguard.emma.flags
440endif
441# If this is a test package, add proguard keep flags for tests.
442ifneq ($(LOCAL_INSTRUMENTATION_FOR)$(filter tests,$(LOCAL_MODULE_TAGS)),)
443common_proguard_flags += -include $(BUILD_SYSTEM)/proguard_tests.flags
444ifeq ($(filter shrinktests,$(LOCAL_PROGUARD_ENABLED)),)
445common_proguard_flags += -dontshrink # don't shrink tests by default
446endif # shrinktests
447endif # test package
448ifeq ($(filter obfuscation,$(LOCAL_PROGUARD_ENABLED)),)
449# By default no obfuscation
450common_proguard_flags += -dontobfuscate
451endif  # No obfuscation
452ifeq ($(filter optimization,$(LOCAL_PROGUARD_ENABLED)),)
453# By default no optimization
454common_proguard_flags += -dontoptimize
455endif  # No optimization
456
457ifdef LOCAL_INSTRUMENTATION_FOR
458ifeq ($(filter obfuscation,$(LOCAL_PROGUARD_ENABLED)),)
459# If no obfuscation, link in the instrmented package's classes.jar as a library.
460# link_instr_classes_jar is defined in base_rule.mk
461# jack already has this library in its classpath and doesn't support jars
462legacy_proguard_flags += -libraryjars $(link_instr_classes_jar)
463else # obfuscation
464# If obfuscation is enabled, the main app must be obfuscated too.
465# We need to run obfuscation using the main app's dictionary,
466# and treat the main app's class.jar as injars instead of libraryjars.
467legacy_proguard_flags := -injars  $(link_instr_classes_jar) \
468    -outjars $(intermediates.COMMON)/proguard.$(LOCAL_INSTRUMENTATION_FOR).jar \
469    -include $(link_instr_intermediates_dir.COMMON)/proguard_options \
470    -applymapping $(link_instr_intermediates_dir.COMMON)/proguard_dictionary \
471    -verbose \
472    $(legacy_proguard_flags)
473# not supported with jack
474ifdef LOCAL_JACK_ENABLED
475    $(error $(LOCAL_MODULE): Build with jack of instrumentation when obfuscating is not yet supported)
476endif
477
478# Sometimes (test + main app) uses different keep rules from the main app -
479# apply the main app's dictionary anyway.
480legacy_proguard_flags += -ignorewarnings
481
482# Make sure we run Proguard on the main app first
483$(full_classes_proguard_jar) : $(link_instr_intermediates_dir.COMMON)/proguard.classes.jar
484
485endif # no obfuscation
486endif # LOCAL_INSTRUMENTATION_FOR
487endif  # LOCAL_PROGUARD_ENABLED is not nosystem
488
489proguard_flag_files := $(addprefix $(LOCAL_PATH)/, $(LOCAL_PROGUARD_FLAG_FILES))
490LOCAL_PROGUARD_FLAGS += $(addprefix -include , $(proguard_flag_files))
491
492ifdef LOCAL_TEST_MODULE_TO_PROGUARD_WITH
493extra_input_jar := $(call intermediates-dir-for,APPS,$(LOCAL_TEST_MODULE_TO_PROGUARD_WITH),,COMMON)/classes.jar
494else
495extra_input_jar :=
496endif
497$(full_classes_proguard_jar): PRIVATE_EXTRA_INPUT_JAR := $(extra_input_jar)
498$(full_classes_proguard_jar): PRIVATE_PROGUARD_FLAGS := $(legacy_proguard_flags) $(common_proguard_flags) $(LOCAL_PROGUARD_FLAGS)
499$(full_classes_proguard_jar) : $(full_classes_jar) $(extra_input_jar) $(proguard_flag_files) | $(ACP) $(PROGUARD)
500	$(call transform-jar-to-proguard)
501
502else  # LOCAL_PROGUARD_ENABLED not defined
503$(full_classes_proguard_jar) : $(full_classes_jar)
504	@echo Copying: $@
505	$(hide) $(ACP) -fp $< $@
506
507endif # LOCAL_PROGUARD_ENABLED defined
508
509ifndef LOCAL_JACK_ENABLED
510# Override PRIVATE_INTERMEDIATES_DIR so that install-dex-debug
511# will work even when intermediates != intermediates.COMMON.
512$(built_dex_intermediate): PRIVATE_INTERMEDIATES_DIR := $(intermediates.COMMON)
513$(built_dex_intermediate): PRIVATE_DX_FLAGS := $(LOCAL_DX_FLAGS)
514# If you instrument class files that have local variable debug information in
515# them emma does not correctly maintain the local variable table.
516# This will cause an error when you try to convert the class files for Android.
517# The workaround here is to build different dex file here based on emma switch
518# then later copy into classes.dex. When emma is on, dx is run with --no-locals
519# option to remove local variable information
520ifeq ($(LOCAL_EMMA_INSTRUMENT),true)
521$(built_dex_intermediate): PRIVATE_DX_FLAGS += --no-locals
522endif
523$(built_dex_intermediate): $(full_classes_proguard_jar) $(DX)
524	$(transform-classes.jar-to-dex)
525endif # LOCAL_JACK_ENABLED is disabled
526
527$(built_dex): $(built_dex_intermediate) | $(ACP)
528	@echo Copying: $@
529	$(hide) mkdir -p $(dir $@)
530	$(hide) rm -f $(dir $@)/classes*.dex
531	$(hide) $(ACP) -fp $(dir $<)/classes*.dex $(dir $@)
532ifneq ($(GENERATE_DEX_DEBUG),)
533	$(install-dex-debug)
534endif
535
536findbugs_xml := $(intermediates.COMMON)/findbugs.xml
537$(findbugs_xml) : PRIVATE_JAR_FILE := $(full_classes_jar)
538$(findbugs_xml) : PRIVATE_AUXCLASSPATH := $(addprefix -auxclasspath ,$(strip \
539								$(call normalize-path-list,$(filter %.jar,\
540										$(full_java_libs)))))
541# We can't depend directly on full_classes_jar because the PRIVATE_
542# vars won't be set up correctly.
543$(findbugs_xml) : $(LOCAL_BUILT_MODULE)
544	@echo Findbugs: $@
545	$(hide) $(FINDBUGS) -textui -effort:min -xml:withMessages \
546		$(PRIVATE_AUXCLASSPATH) \
547		$(PRIVATE_JAR_FILE) \
548		> $@
549
550ALL_FINDBUGS_FILES += $(findbugs_xml)
551
552findbugs_html := $(PRODUCT_OUT)/findbugs/$(LOCAL_MODULE).html
553$(findbugs_html) : PRIVATE_XML_FILE := $(findbugs_xml)
554$(LOCAL_MODULE)-findbugs : $(findbugs_html)
555$(findbugs_html) : $(findbugs_xml)
556	@mkdir -p $(dir $@)
557	@echo ConvertXmlToText: $@
558	$(hide) $(FINDBUGS_DIR)/convertXmlToText -html:fancy.xsl $(PRIVATE_XML_FILE) \
559	> $@
560
561$(LOCAL_MODULE)-findbugs : $(findbugs_html)
562
563endif  # full_classes_jar is defined
564
565ifdef LOCAL_JACK_ENABLED
566$(LOCAL_INTERMEDIATE_TARGETS): \
567	PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-rsc
568ifeq ($(LOCAL_JACK_ENABLED),incremental)
569$(LOCAL_INTERMEDIATE_TARGETS): \
570	PRIVATE_JACK_INCREMENTAL_DIR := $(intermediates.COMMON)/jack-incremental
571else
572$(LOCAL_INTERMEDIATE_TARGETS): \
573	PRIVATE_JACK_INCREMENTAL_DIR :=
574endif
575
576ifdef full_classes_jar
577$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_DEBUG_FLAGS := -g
578
579ifdef LOCAL_PROGUARD_ENABLED
580
581ifndef LOCAL_JACK_PROGUARD_FLAGS
582    LOCAL_JACK_PROGUARD_FLAGS := $(LOCAL_PROGUARD_FLAGS)
583endif
584LOCAL_JACK_PROGUARD_FLAGS += $(addprefix -include , $(proguard_flag_files))
585ifdef LOCAL_TEST_MODULE_TO_PROGUARD_WITH
586    $(error $(LOCAL_MODULE): Build with jack when LOCAL_TEST_MODULE_TO_PROGUARD_WITH is defined is not yet implemented)
587endif
588
589$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_PROGUARD_FLAGS := $(common_proguard_flags) $(LOCAL_JACK_PROGUARD_FLAGS)
590else  # LOCAL_PROGUARD_ENABLED not defined
591$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_PROGUARD_FLAGS :=
592endif # LOCAL_PROGUARD_ENABLED defined
593
594$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_JACK_FLAGS := $(LOCAL_JACK_FLAGS)
595
596jack_all_deps := $(java_sources) $(java_resource_sources) $(full_jack_lib_deps) \
597        $(jar_manifest_file) $(layers_file) $(RenderScript_file_stamp) $(proguard_flag_files) \
598        $(proto_java_sources_file_stamp) $(LOCAL_ADDITIONAL_DEPENDENCIES) $(LOCAL_JARJAR_RULES) \
599        $(LOCAL_MODULE_MAKEFILE) $(JACK_JAR)
600
601ifeq ($(LOCAL_IS_STATIC_JAVA_LIBRARY),true)
602$(full_classes_jack): $(jack_all_deps)
603	@echo Building with Jack: $@
604	$(java-to-jack)
605
606else #LOCAL_IS_STATIC_JAVA_LIBRARY
607$(built_dex_intermediate): PRIVATE_CLASSES_JACK := $(full_classes_jack)
608
609$(built_dex_intermediate): $(jack_all_deps)
610	@echo Building with Jack: $@
611	$(jack-java-to-dex)
612
613$(full_classes_jack): $(built_dex_intermediate)
614# nothing to do it's built as a side effect of $(built_dex_intermediate)
615endif #LOCAL_IS_STATIC_JAVA_LIBRARY
616
617$(noshrob_classes_jack): PRIVATE_JACK_INTERMEDIATES_DIR := $(intermediates.COMMON)/jack-noshrob-rsc
618ifeq ($(LOCAL_JACK_ENABLED),incremental)
619$(noshrob_classes_jack): PRIVATE_JACK_INCREMENTAL_DIR := $(intermediates.COMMON)/jack-noshrob-incremental
620else
621$(noshrob_classes_jack): PRIVATE_JACK_INCREMENTAL_DIR :=
622endif
623$(noshrob_classes_jack): PRIVATE_JACK_PROGUARD_FLAGS :=
624$(noshrob_classes_jack): $(jack_all_deps)
625	@echo Building with Jack: $@
626	$(java-to-jack)
627endif  # full_classes_jar is defined
628endif # LOCAL_JACK_ENABLED
629