Les trois approches classiques pour retirer une application système lors d’une compilation AOSP sont :
- Commenter la ligne correspondante dans le fichier
Android.mkdu module. - Renommer le fichier
Android.mkenAndroid.mk.bakpour le neutraliser. - Éditer le fichier
device.mk(ou équivalent) et supprimer le nom du module de la listePRODUCT_PACKAGES.
Ces méthodes fonctionnent, mais deviennent rapidement ingérables dès qu’il faut enlever plusieurs dizaines d’applications : modifications éparpillées, difficiles à auditer et à maintenir.
Une solution plus élégante consiste à exploiter la variable LOCAL_OVERRIDES_PACKAGES à l’échelle du produit.
Principe de LOCAL_OVERRIDES_PACKAGES
Cette variable est prévue pour qu’un APK tiers remplace officiellement une application native. En l’utilisant, on empêche la compilation de l’application ciblée. Exemple :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_STATIC_JAVA_LIBRARIES := androidx.core_core
LOCAL_PACKAGE_NAME := ZenPlayer
LOCAL_OVERRIDES_PACKAGES := Music
LOCAL_CERTIFICATE := platform
include $(BUILD_PACKAGE)
Ici, ZenPlayer remplace Music ; le module Music est donc ignoré.
Comment le moteur de compilation filtre-t-il les modules ?
La chaîne Make enregistre la liste des modules à surcharger :
# make/core/prebuilt_internal.mk
PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
# make/core/package_internal.mk
PACKAGES.$(LOCAL_PACKAGE_NAME).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
Puis, dans main.mk, le filtrage s’effectue :
product_MODULES := $(filter-out \
$(foreach m,$(product_MODULES),$(PACKAGES.$(m).OVERRIDES)), \
$(product_MODULES))
Technique générique : module « ghost » dédié au nettoyage
Créons un module factice chargé uniquement de déclarer les applications à exclure :
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
# Liste des applications à supprimer
EXCLUDE_LIST := \
BasicDreams \
Browser \
Calendar \
Email \
MusicFX
LOCAL_MODULE := purge_apps
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := FAKE
# Transfert de la liste vers le moteur de compilation
PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(EXCLUDE_LIST))
include $(BUILD_PHONY_PACKAGE)
Enfin, il suffit d’ajouter ce module factice dans le fichier device.mk (ou tout autre fichier inclus dans la définition du produit) :
PRODUCT_PACKAGES += purge_apps
Aucune application listée dans EXCLUDE_LIST ne sera compilée, sans toucher aux sources originales et sans multiplier les patchs.