github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/make/core/dex_preopt_odex_install.mk (about)

     1  # dexpreopt_odex_install.mk is used to define odex creation rules for JARs and APKs
     2  # This file depends on variables set in base_rules.mk
     3  # Output variables: LOCAL_DEX_PREOPT, LOCAL_UNCOMPRESS_DEX, built_odex,
     4  #                   dexpreopt_boot_jar_module
     5  
     6  # We explicitly uncompress APKs of privileged apps, and used by
     7  # privileged apps
     8  LOCAL_UNCOMPRESS_DEX := false
     9  ifneq (true,$(DONT_UNCOMPRESS_PRIV_APPS_DEXS))
    10  ifeq (true,$(LOCAL_PRIVILEGED_MODULE))
    11    LOCAL_UNCOMPRESS_DEX := true
    12  else
    13    ifneq (,$(filter $(PRODUCT_LOADED_BY_PRIVILEGED_MODULES), $(LOCAL_MODULE)))
    14      LOCAL_UNCOMPRESS_DEX := true
    15    endif  # PRODUCT_LOADED_BY_PRIVILEGED_MODULES
    16  endif  # LOCAL_PRIVILEGED_MODULE
    17  endif  # DONT_UNCOMPRESS_PRIV_APPS_DEXS
    18  
    19  # Setting LOCAL_DEX_PREOPT based on WITH_DEXPREOPT, LOCAL_DEX_PREOPT, etc
    20  LOCAL_DEX_PREOPT := $(strip $(LOCAL_DEX_PREOPT))
    21  ifneq (true,$(WITH_DEXPREOPT))
    22    LOCAL_DEX_PREOPT :=
    23  else # WITH_DEXPREOPT=true
    24    ifeq (,$(TARGET_BUILD_APPS)) # TARGET_BUILD_APPS empty
    25      ifndef LOCAL_DEX_PREOPT # LOCAL_DEX_PREOPT undefined
    26        ifneq ($(filter $(TARGET_OUT)/%,$(my_module_path)),) # Installed to system.img.
    27          ifeq (,$(LOCAL_APK_LIBRARIES)) # LOCAL_APK_LIBRARIES empty
    28            # If we have product-specific config for this module?
    29            ifeq (disable,$(DEXPREOPT.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG))
    30              LOCAL_DEX_PREOPT := false
    31            else
    32              LOCAL_DEX_PREOPT := $(DEX_PREOPT_DEFAULT)
    33            endif
    34          else # LOCAL_APK_LIBRARIES not empty
    35            LOCAL_DEX_PREOPT := nostripping
    36          endif # LOCAL_APK_LIBRARIES not empty
    37        endif # Installed to system.img.
    38      endif # LOCAL_DEX_PREOPT undefined
    39    endif # TARGET_BUILD_APPS empty
    40  endif # WITH_DEXPREOPT=true
    41  ifeq (false,$(LOCAL_DEX_PREOPT))
    42    LOCAL_DEX_PREOPT :=
    43  endif
    44  ifdef LOCAL_UNINSTALLABLE_MODULE
    45  LOCAL_DEX_PREOPT :=
    46  endif
    47  ifeq (,$(strip $(built_dex)$(my_prebuilt_src_file)$(LOCAL_SOONG_DEX_JAR))) # contains no java code
    48  LOCAL_DEX_PREOPT :=
    49  endif
    50  # if WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=true and module is not in boot class path skip
    51  # Also preopt system server jars since selinux prevents system server from loading anything from
    52  # /data. If we don't do this they will need to be extracted which is not favorable for RAM usage
    53  # or performance. If my_preopt_for_extracted_apk is true, we ignore the only preopt boot image
    54  # options.
    55  ifneq (true,$(my_preopt_for_extracted_apk))
    56  ifeq (true,$(WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY))
    57  ifeq ($(filter $(PRODUCT_SYSTEM_SERVER_JARS) $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE)),)
    58  LOCAL_DEX_PREOPT :=
    59  endif
    60  endif
    61  endif
    62  
    63  ifeq ($(LOCAL_DEX_PREOPT),true)
    64  
    65  # Don't strip with dexes we explicitly uncompress (dexopt will not store the dex code).
    66  ifeq ($(LOCAL_UNCOMPRESS_DEX),true)
    67  LOCAL_DEX_PREOPT := nostripping
    68  endif  # LOCAL_UNCOMPRESS_DEX
    69  
    70  # system_other isn't there for an OTA, so don't strip
    71  # if module is on system, and odex is on system_other.
    72  ifeq ($(BOARD_USES_SYSTEM_OTHER_ODEX),true)
    73  ifneq ($(call install-on-system-other, $(my_module_path)),)
    74  LOCAL_DEX_PREOPT := nostripping
    75  endif  # install-on-system-other
    76  endif  # BOARD_USES_SYSTEM_OTHER_ODEX
    77  
    78  # We also don't strip if all dexs are uncompressed (dexopt will not store the dex code),
    79  # but that requires to inspect the source file, which is too early at this point (as we
    80  # don't know if the source file will actually be used).
    81  # See dexpreopt-remove-classes.dex.
    82  
    83  endif  # LOCAL_DEX_PREOPT
    84  
    85  built_odex :=
    86  built_vdex :=
    87  built_art :=
    88  installed_odex :=
    89  installed_vdex :=
    90  installed_art :=
    91  built_installed_odex :=
    92  built_installed_vdex :=
    93  built_installed_art :=
    94  my_process_profile :=
    95  my_profile_is_text_listing :=
    96  
    97  ifeq (false,$(WITH_DEX_PREOPT_GENERATE_PROFILE))
    98  LOCAL_DEX_PREOPT_GENERATE_PROFILE := false
    99  endif
   100  
   101  ifndef LOCAL_DEX_PREOPT_GENERATE_PROFILE
   102  
   103  
   104  # If LOCAL_DEX_PREOPT_GENERATE_PROFILE is not defined, default it based on the existence of the
   105  # profile class listing. TODO: Use product specific directory here.
   106  my_classes_directory := $(PRODUCT_DEX_PREOPT_PROFILE_DIR)
   107  LOCAL_DEX_PREOPT_PROFILE := $(my_classes_directory)/$(LOCAL_MODULE).prof
   108  
   109  ifneq (,$(wildcard $(LOCAL_DEX_PREOPT_PROFILE)))
   110  my_process_profile := true
   111  my_profile_is_text_listing := false
   112  endif
   113  else
   114  my_process_profile := $(LOCAL_DEX_PREOPT_GENERATE_PROFILE)
   115  my_profile_is_text_listing := true
   116  LOCAL_DEX_PREOPT_PROFILE := $(LOCAL_DEX_PREOPT_PROFILE_CLASS_LISTING)
   117  endif
   118  
   119  ifeq (true,$(my_process_profile))
   120  
   121  ifeq (,$(LOCAL_DEX_PREOPT_APP_IMAGE))
   122  LOCAL_DEX_PREOPT_APP_IMAGE := true
   123  endif
   124  
   125  ifndef LOCAL_DEX_PREOPT_PROFILE
   126  $(call pretty-error,Must have specified class listing (LOCAL_DEX_PREOPT_PROFILE))
   127  endif
   128  ifeq (,$(dex_preopt_profile_src_file))
   129  $(call pretty-error, Internal error: dex_preopt_profile_src_file must be set)
   130  endif
   131  my_built_profile := $(dir $(LOCAL_BUILT_MODULE))/profile.prof
   132  my_dex_location := $(patsubst $(PRODUCT_OUT)%,%,$(LOCAL_INSTALLED_MODULE))
   133  # Remove compressed APK extension.
   134  my_dex_location := $(patsubst %.gz,%,$(my_dex_location))
   135  $(my_built_profile): PRIVATE_BUILT_MODULE := $(dex_preopt_profile_src_file)
   136  $(my_built_profile): PRIVATE_DEX_LOCATION := $(my_dex_location)
   137  $(my_built_profile): PRIVATE_SOURCE_CLASSES := $(LOCAL_DEX_PREOPT_PROFILE)
   138  $(my_built_profile): $(LOCAL_DEX_PREOPT_PROFILE)
   139  $(my_built_profile): $(PROFMAN)
   140  $(my_built_profile): $(dex_preopt_profile_src_file)
   141  ifeq (true,$(my_profile_is_text_listing))
   142  # The profile is a test listing of classes (used for framework jars).
   143  # We need to generate the actual binary profile before being able to compile.
   144  	$(hide) mkdir -p $(dir $@)
   145  	ANDROID_LOG_TAGS="*:e" $(PROFMAN) \
   146  		--create-profile-from=$(PRIVATE_SOURCE_CLASSES) \
   147  		--apk=$(PRIVATE_BUILT_MODULE) \
   148  		--dex-location=$(PRIVATE_DEX_LOCATION) \
   149  		--reference-profile-file=$@
   150  else
   151  # The profile is binary profile (used for apps). Run it through profman to
   152  # ensure the profile keys match the apk.
   153  $(my_built_profile):
   154  	$(hide) mkdir -p $(dir $@)
   155  	touch $@
   156  	ANDROID_LOG_TAGS="*:i" $(PROFMAN) \
   157  	  --copy-and-update-profile-key \
   158  		--profile-file=$(PRIVATE_SOURCE_CLASSES) \
   159  		--apk=$(PRIVATE_BUILT_MODULE) \
   160  		--dex-location=$(PRIVATE_DEX_LOCATION) \
   161  		--reference-profile-file=$@ \
   162  	|| echo "Profile out of date for $(PRIVATE_BUILT_MODULE)"
   163  endif
   164  
   165  my_profile_is_text_listing :=
   166  dex_preopt_profile_src_file :=
   167  
   168  # Remove compressed APK extension.
   169  my_installed_profile := $(patsubst %.gz,%,$(LOCAL_INSTALLED_MODULE)).prof
   170  
   171  # my_installed_profile := $(LOCAL_INSTALLED_MODULE).prof
   172  $(eval $(call copy-one-file,$(my_built_profile),$(my_installed_profile)))
   173  build_installed_profile:=$(my_built_profile):$(my_installed_profile)
   174  else
   175  build_installed_profile:=
   176  my_installed_profile :=
   177  endif
   178  
   179  ifdef LOCAL_DEX_PREOPT
   180  
   181  dexpreopt_boot_jar_module := $(filter $(DEXPREOPT_BOOT_JARS_MODULES),$(LOCAL_MODULE))
   182  
   183  # Filter org.apache.http.legacy.boot.
   184  ifeq ($(dexpreopt_boot_jar_module),org.apache.http.legacy.boot)
   185  dexpreopt_boot_jar_module :=
   186  endif
   187  
   188  ifdef dexpreopt_boot_jar_module
   189  # For libart, the boot jars' odex files are replaced by $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE).
   190  # We use this installed_odex trick to get boot.art installed.
   191  installed_odex := $(DEFAULT_DEX_PREOPT_INSTALLED_IMAGE)
   192  # Append the odex for the 2nd arch if we have one.
   193  installed_odex += $($(TARGET_2ND_ARCH_VAR_PREFIX)DEFAULT_DEX_PREOPT_INSTALLED_IMAGE)
   194  else  # boot jar
   195  ifeq ($(LOCAL_MODULE_CLASS),JAVA_LIBRARIES)
   196  # For a Java library, by default we build odex for both 1st arch and 2nd arch.
   197  # But it can be overridden with "LOCAL_MULTILIB := first".
   198  ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE)))
   199  # For system server jars, we build for only "first".
   200  my_module_multilib := first
   201  else
   202  my_module_multilib := $(LOCAL_MULTILIB)
   203  endif
   204  # #################################################
   205  # Odex for the 1st arch
   206  my_2nd_arch_prefix :=
   207  include $(BUILD_SYSTEM)/setup_one_odex.mk
   208  # #################################################
   209  # Odex for the 2nd arch
   210  ifdef TARGET_2ND_ARCH
   211  ifneq ($(TARGET_TRANSLATE_2ND_ARCH),true)
   212  ifneq (first,$(my_module_multilib))
   213  my_2nd_arch_prefix := $(TARGET_2ND_ARCH_VAR_PREFIX)
   214  include $(BUILD_SYSTEM)/setup_one_odex.mk
   215  endif  # my_module_multilib is not first.
   216  endif  # TARGET_TRANSLATE_2ND_ARCH not true
   217  endif  # TARGET_2ND_ARCH
   218  # #################################################
   219  else  # must be APPS
   220  # The preferred arch
   221  my_2nd_arch_prefix := $(LOCAL_2ND_ARCH_VAR_PREFIX)
   222  include $(BUILD_SYSTEM)/setup_one_odex.mk
   223  ifdef TARGET_2ND_ARCH
   224  ifeq ($(LOCAL_MULTILIB),both)
   225  # The non-preferred arch
   226  my_2nd_arch_prefix := $(if $(LOCAL_2ND_ARCH_VAR_PREFIX),,$(TARGET_2ND_ARCH_VAR_PREFIX))
   227  include $(BUILD_SYSTEM)/setup_one_odex.mk
   228  endif  # LOCAL_MULTILIB is both
   229  endif  # TARGET_2ND_ARCH
   230  endif  # LOCAL_MODULE_CLASS
   231  endif  # boot jar
   232  
   233  built_odex := $(strip $(built_odex))
   234  built_vdex := $(strip $(built_vdex))
   235  built_art := $(strip $(built_art))
   236  installed_odex := $(strip $(installed_odex))
   237  installed_vdex := $(strip $(installed_vdex))
   238  installed_art := $(strip $(installed_art))
   239  
   240  ifdef built_odex
   241  ifeq (true,$(my_process_profile))
   242  $(built_odex): $(my_built_profile)
   243  $(built_odex): PRIVATE_PROFILE_PREOPT_FLAGS := --profile-file=$(my_built_profile)
   244  else
   245  $(built_odex): PRIVATE_PROFILE_PREOPT_FLAGS :=
   246  endif
   247  
   248  ifndef LOCAL_DEX_PREOPT_FLAGS
   249  LOCAL_DEX_PREOPT_FLAGS := $(DEXPREOPT.$(TARGET_PRODUCT).$(LOCAL_MODULE).CONFIG)
   250  ifndef LOCAL_DEX_PREOPT_FLAGS
   251  LOCAL_DEX_PREOPT_FLAGS := $(PRODUCT_DEX_PREOPT_DEFAULT_FLAGS)
   252  endif
   253  endif
   254  
   255  my_system_server_compiler_filter := $(PRODUCT_SYSTEM_SERVER_COMPILER_FILTER)
   256  ifeq (,$(my_system_server_compiler_filter))
   257  my_system_server_compiler_filter := speed
   258  endif
   259  
   260  my_default_compiler_filter := $(PRODUCT_DEX_PREOPT_DEFAULT_COMPILER_FILTER)
   261  ifeq (,$(my_default_compiler_filter))
   262  # If no default compiler filter is specified, default to 'quicken' to save on storage.
   263  my_default_compiler_filter := quicken
   264  endif
   265  
   266  ifeq (,$(filter --compiler-filter=%, $(LOCAL_DEX_PREOPT_FLAGS)))
   267    ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE)))
   268      # Jars of system server, use the product option if it is set, speed otherwise.
   269      LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=$(my_system_server_compiler_filter)
   270    else
   271      ifneq (,$(filter $(PRODUCT_DEXPREOPT_SPEED_APPS) $(PRODUCT_SYSTEM_SERVER_APPS),$(LOCAL_MODULE)))
   272        # Apps loaded into system server, and apps the product default to being compiled with the
   273        # 'speed' compiler filter.
   274        LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=speed
   275      else
   276        ifeq (true,$(my_process_profile))
   277          # For non system server jars, use speed-profile when we have a profile.
   278          LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=speed-profile
   279        else
   280          LOCAL_DEX_PREOPT_FLAGS += --compiler-filter=$(my_default_compiler_filter)
   281        endif
   282      endif
   283    endif
   284  endif
   285  
   286  my_generate_dm := $(PRODUCT_DEX_PREOPT_GENERATE_DM_FILES)
   287  ifeq (,$(filter $(LOCAL_DEX_PREOPT_FLAGS),--compiler-filter=verify))
   288  # Generating DM files only makes sense for verify, avoid doing for non verify compiler filter APKs.
   289  my_generate_dm := false
   290  endif
   291  
   292  # No reason to use a dm file if the dex is already uncompressed.
   293  ifeq ($(LOCAL_UNCOMPRESS_DEX),true)
   294  my_generate_dm := false
   295  endif
   296  
   297  ifeq (true,$(my_generate_dm))
   298  LOCAL_DEX_PREOPT_FLAGS += --copy-dex-files=false
   299  LOCAL_DEX_PREOPT := nostripping
   300  my_built_dm := $(dir $(LOCAL_BUILT_MODULE))generated.dm
   301  my_installed_dm := $(patsubst %.apk,%,$(LOCAL_INSTALLED_MODULE)).dm
   302  my_copied_vdex := $(dir $(LOCAL_BUILT_MODULE))primary.vdex
   303  $(eval $(call copy-one-file,$(built_vdex),$(my_copied_vdex)))
   304  $(my_built_dm): PRIVATE_INPUT_VDEX := $(my_copied_vdex)
   305  $(my_built_dm): $(my_copied_vdex) $(ZIPTIME)
   306  	$(hide) mkdir -p $(dir $@)
   307  	$(hide) rm -f $@
   308  	$(hide) zip -qD -j -X -9 $@ $(PRIVATE_INPUT_VDEX)
   309  	$(ZIPTIME) $@
   310  $(eval $(call copy-one-file,$(my_built_dm),$(my_installed_dm)))
   311  endif
   312  
   313  # By default, emit debug info.
   314  my_dexpreopt_debug_info := true
   315  # If the global setting suppresses mini-debug-info, disable it.
   316  ifeq (false,$(WITH_DEXPREOPT_DEBUG_INFO))
   317    my_dexpreopt_debug_info := false
   318  endif
   319  
   320  # PRODUCT_SYSTEM_SERVER_DEBUG_INFO overrides WITH_DEXPREOPT_DEBUG_INFO.
   321  # PRODUCT_OTHER_JAVA_DEBUG_INFO overrides WITH_DEXPREOPT_DEBUG_INFO.
   322  ifneq (,$(filter $(PRODUCT_SYSTEM_SERVER_JARS),$(LOCAL_MODULE)))
   323    ifeq (true,$(PRODUCT_SYSTEM_SERVER_DEBUG_INFO))
   324      my_dexpreopt_debug_info := true
   325    else ifeq (false,$(PRODUCT_SYSTEM_SERVER_DEBUG_INFO))
   326      my_dexpreopt_debug_info := false
   327    endif
   328  else
   329    ifeq (true,$(PRODUCT_OTHER_JAVA_DEBUG_INFO))
   330      my_dexpreopt_debug_info := true
   331    else ifeq (false,$(PRODUCT_OTHER_JAVA_DEBUG_INFO))
   332      my_dexpreopt_debug_info := false
   333    endif
   334  endif
   335  
   336  # Never enable on eng.
   337  ifeq (eng,$(filter eng, $(TARGET_BUILD_VARIANT)))
   338  my_dexpreopt_debug_info := false
   339  endif
   340  
   341  # Add dex2oat flag for debug-info/no-debug-info.
   342  ifeq (true,$(my_dexpreopt_debug_info))
   343    LOCAL_DEX_PREOPT_FLAGS += --generate-mini-debug-info
   344  else ifeq (false,$(my_dexpreopt_debug_info))
   345    LOCAL_DEX_PREOPT_FLAGS += --no-generate-mini-debug-info
   346  endif
   347  
   348  # Set the compiler reason to 'prebuilt' to identify the oat files produced
   349  # during the build, as opposed to compiled on the device.
   350  LOCAL_DEX_PREOPT_FLAGS += --compilation-reason=prebuilt
   351  
   352  $(built_odex): PRIVATE_DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS)
   353  $(built_vdex): $(built_odex)
   354  $(built_art): $(built_odex)
   355  endif
   356  
   357  ifneq (true,$(my_generate_dm))
   358    # Add the installed_odex to the list of installed files for this module if we aren't generating a
   359    # dm file.
   360    ALL_MODULES.$(my_register_name).INSTALLED += $(installed_odex)
   361    ALL_MODULES.$(my_register_name).INSTALLED += $(installed_vdex)
   362    ALL_MODULES.$(my_register_name).INSTALLED += $(installed_art)
   363  
   364    ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_odex)
   365    ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_vdex)
   366    ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(built_installed_art)
   367  
   368    # Make sure to install the .odex and .vdex when you run "make <module_name>"
   369    $(my_all_targets): $(installed_odex) $(installed_vdex) $(installed_art)
   370  else
   371    ALL_MODULES.$(my_register_name).INSTALLED += $(my_installed_dm)
   372    ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(my_built_dm) $(my_installed_dm)
   373  
   374    # Make sure to install the .dm when you run "make <module_name>"
   375    $(my_all_targets): $(installed_dm)
   376  endif
   377  
   378  # Record dex-preopt config.
   379  DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT := $(LOCAL_DEX_PREOPT)
   380  DEXPREOPT.$(LOCAL_MODULE).MULTILIB := $(LOCAL_MULTILIB)
   381  DEXPREOPT.$(LOCAL_MODULE).DEX_PREOPT_FLAGS := $(LOCAL_DEX_PREOPT_FLAGS)
   382  DEXPREOPT.$(LOCAL_MODULE).PRIVILEGED_MODULE := $(LOCAL_PRIVILEGED_MODULE)
   383  DEXPREOPT.$(LOCAL_MODULE).VENDOR_MODULE := $(LOCAL_VENDOR_MODULE)
   384  DEXPREOPT.$(LOCAL_MODULE).TARGET_ARCH := $(LOCAL_MODULE_TARGET_ARCH)
   385  DEXPREOPT.$(LOCAL_MODULE).INSTALLED := $(installed_odex)
   386  DEXPREOPT.$(LOCAL_MODULE).INSTALLED_STRIPPED := $(LOCAL_INSTALLED_MODULE)
   387  DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS) := $(sort \
   388    $(DEXPREOPT.MODULES.$(LOCAL_MODULE_CLASS)) $(LOCAL_MODULE))
   389  
   390  endif # LOCAL_DEX_PREOPT
   391  
   392  # Profile doesn't depend on LOCAL_DEX_PREOPT.
   393  ALL_MODULES.$(my_register_name).INSTALLED += $(my_installed_profile)
   394  ALL_MODULES.$(my_register_name).BUILT_INSTALLED += $(build_installed_profile)
   395  
   396  my_process_profile :=
   397  
   398  $(my_all_targets): $(my_installed_profile)