移除预制应用,首先想到的3个方法:
1. 注释掉对应模块 .mk文件中的内容。
2. 重命名对应模块 .mk文件,比如android.mk.bk
3. 找到项目的mk文件,找到 PRODUCT_PACKAGES,注释掉目标模块。
以上方法修改针对单个模块还好,如果是多个模块的话,修改目录多,繁琐,并且不容易记录跟踪。所以下面介绍第四种方法:
利用LOCAL_OVERRIDES_PACKAGES
LOCAL_OVERRIDES_PACKAGES:原本用意是 如果预置的APK,要覆盖原生apk,则需在android.mk中的添加LOCAL_OVERRIDES_PACKAGES,此变量可以使其他的模块不加入编译。
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 := \
android-support-v4
LOCAL_PACKAGE_NAME := MyMusic # 预制的app,替换下面原声的Music app
LOCAL_OVERRIDES_PACKAGES := Music # 不参与编译
LOCAL_MODULE_PATH := $(PRODUCT_OUT)/system/app
LOCAL_CERTIFICATE := platform
LOCAL_PRIVATE_PLATFORM_APIS := true
include $(BUILD_PACKAGE)
上面的例子意思是用MyMusic来代替原生的Music, 原声的Music不再编译。
我们来跟一下LOCAL_OVERRIDES_PACKAGES:
# 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))
LOCAL_OVERRIDES_PACKAGES被赋值给了2个变量。在build/下
grep -nr "PACKAGES.*.OVERRIDES"
# make/core/main.mk
# Filter out the overridden packages before doing expansion
product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \
$(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))
最后在main.mk中可以看到,大概意思是product_MODULES的值,会剔除那些PACKAGES.$(p).OVERRIDES 标注的模块,而PACKAGES.$(p).OVERRIDES这个值,根据上面一步步看,就是LOCAL_OVERRIDES_PACKAGES制定的模块。
那么了解了LOCAL_OVERRIDES_PACKAGES的使用和原理后,就可以考虑如何删除预制应用了。
1. 在项目目录下新建一个android.mk
2. 定义DELETE_PACKAGES变量,将要删除的模块赋值给它。
将DELETE_PACKAGES赋值给PACKAGES.$(LOCAL_MODULE).OVERRIDES
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
# 定义一个变量DELETE_PACKAGES,将所有想要删除的模块赋值给DELETE_PACKAGES
DELETE_PACKAGES := \
DeleteApp1 \
DeleteApp2
# 定义一个LOCAL_MODULE,由于它没有指定任何的编译目标,所以它编译出来的是空
LOCAL_MODULE := override_packages
LOCAL_MODULE_TAGS := optional
# 将DELETE_PACKAGES复制给PACKAGES.$(LOCAL_MODULE).OVERRIDES,达到和
# LOCAL_OVERRIDES_PACKAGES一样的作用。
PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(DELETE_PACKAGES))
include $(BUILD_PHONY_PACKAGE)
3. 将override_packages 加入到项目的mk中:
PRODUCT_PACKAGES += override_packages
done.