最近的項目中,預計一下需求,客戶要求在某些版本中,刪除所有不需要的應用,只留下設置和相機應用,其他都需要刪除。
但是因爲同一條代碼線上面,還有其他的項目,因此不能影響到其他的項目,問題有些棘手。
基於此問題,我們想到了兩個解決方案。
1: 通過mk文件中的LOCAL_OVERRIDES_PACKAGES 屬性來覆蓋其他應用。
這種修改方法固然可行,但是因爲這個LOCAL_OVERRIDES_PACKAGES是在應用的mk中寫的,如果一次性刪除大量的應用。這個應用的mk文件就會添加很多,容易出錯。因此這種方案只適合覆蓋很少的幾個應用,不使用大面積的覆蓋應用。
2:參考系統原有的PRODUCT_PACKAGES 屬性寫一個屬於自己的PRODUCT_DEL_PACKAGES 屬性來進行特定應用的刪除,
這樣做只需要在相應項目的mk文件中添加 PRODUCT_DEL_PACKAGES 然後按照 PRODUCT_PACKAGES 添加應用的方法,將需要刪除的應用直接添加到 PRODUCT_DEL_PACKAGES 後面即可實現刪除應用的操作。這種做法使用於大面積刪除應用的情況。
下面是方案2的修改方法:總共兩個步驟
1:修改/build/core/product.mk ,在其中定義 PRODUCT_DEL_PACKAGES。如下面標紅色的部分。
PRODUCT_SHIPPING_API_LEVEL \
PRODUCT_DEL_PACKAGES \
define dump-product
$(info ==== $(1) ====)\
2:修改/build/core/main.mk ,添加具體功能實現方案。如下面標紅色部分。
# by product_config.mk.
product_MODULES := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_PACKAGES)
# Filter out the overridden packages before doing expansion
product_MODULES := $(filter-out $(foreach p, $(product_MODULES), \
$(PACKAGES.$(p).OVERRIDES)), $(product_MODULES))
$(info *********************************************************** )
$(info Del apk)
$(info $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEL_PACKAGES))
$(info $(space))
$(info before compile)
$(info $(product_MODULES))
$(info $(space)$(space))
$(info ************************************************************* )
product_MODULES := $(filter-out $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEL_PACKAGES), $(product_MODULES))
$(info ************************************************************ )
$(info Del apk)
$(info $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEL_PACKAGES))
$(info $(space))
$(info after compile)
$(info $(product_MODULES))
$(info $(space))
$(info ************************************************************)
# Resolve the :32 :64 module name
modules_32 := $(patsubst %:32,%,$(filter %:32, $(product_MODULES)))
modules_64 := $(patsubst %:64,%,$(filter %:64, $(product_MODULES)))
modules_rest := $(filter-out %:32 %:64,$(product_MODULES))
# Note for 32-bit product, $(modules_32) and $(modules_64) will be
# added as their original module names.
使用方式:
上面的修改使用方法與PRODUCT_PACKAGES的使用方法一致,請看下面例子:
直接在項目mk文件中的修改如下:
PRODUCT_DEL_PACKAGES := \
Browser \
Calendar \
Email \
Mms \
Music
問題排查方法:
通過上面的修改,如果發現存在問題,請直接在編譯的log中搜索before compile和
after compile,然後對比這兩個打印前後的信息,看下刪除功能是否OK