Supprimer des applications préinstallées sur Android via la sur-déclaration de modules

Les trois approches classiques pour retirer une application système lors d’une compilation AOSP sont :

  1. Commenter la ligne correspondante dans le fichier Android.mk du module.
  2. Renommer le fichier Android.mk en Android.mk.bak pour le neutraliser.
  3. Éditer le fichier device.mk (ou équivalent) et supprimer le nom du module de la liste PRODUCT_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.

Étiquettes: Android AOSP LOCAL_OVERRIDES_PACKAGES Build System make

Publié le 8 octobre à 04h10