Quick and dirty filtering of present LOCAL_OPTIONAL_USES_LIBRARIES.

Filter LOCAL_OPTIONAL_USES_LIBRARIES by PRODUCT_PACKAGES. This has the
drawback that some present libraries may be filtered out as well, as the
full list of product packages is unknown until all Android.mk files have
been read.

This CL unblocks <uses-library> fixes for individual apps, which will be
necessary to dexpreopt them in the nearest future when the &-classpath
hack is removed in ART. Apps that are not fixed by then will loose
dexpreopt completely. This fix, although not perfect, lowers the risk of
loosing dexpreopt for many apps. In the future it may be replaced with a
better solution.

Bug: 132357300
Test: lunch aosp_cf_x86_64_phone-userdebug && m && launch_cvd \
        adb wait-for-device && adb root && adb logcat \
        | grep -E 'ClassLoaderContext [a-z ]+ mismatch'
        # empty grep output, no errors
Change-Id: I188cf240259f7a448623450e6a949e0784a21f87
This commit is contained in:
Ulya Trafimovich 2021-02-02 12:59:08 +00:00
parent 8aaf4ac383
commit 156c719179
1 changed files with 10 additions and 0 deletions

View File

@ -189,6 +189,16 @@ ifdef LOCAL_DEX_PREOPT
my_filtered_optional_uses_libraries := $(filter-out $(INTERNAL_PLATFORM_MISSING_USES_LIBRARIES), \ my_filtered_optional_uses_libraries := $(filter-out $(INTERNAL_PLATFORM_MISSING_USES_LIBRARIES), \
$(LOCAL_OPTIONAL_USES_LIBRARIES)) $(LOCAL_OPTIONAL_USES_LIBRARIES))
# TODO(b/132357300): This may filter out too much, as PRODUCT_PACKAGES doesn't
# include all packages (the full list is unknown until reading all Android.mk
# makefiles). As a consequence, a library may be present but not included in
# dexpreopt, which will result in class loader context mismatch and a failure
# to load dexpreopt code on device. We should fix this, either by deferring
# dependency computation until the full list of product packages is known, or
# by adding product-specific lists of missing libraries.
my_filtered_optional_uses_libraries := $(filter $(my_filtered_optional_uses_libraries), \
$(PRODUCT_PACKAGES))
ifeq ($(LOCAL_MODULE_CLASS),APPS) ifeq ($(LOCAL_MODULE_CLASS),APPS)
# compatibility libraries are added to class loader context of an app only if # compatibility libraries are added to class loader context of an app only if
# targetSdkVersion in the app's manifest is lower than the given SDK version # targetSdkVersion in the app's manifest is lower than the given SDK version