05 Android系統之刪除Android原生內置APK

兩種方法

爲了在編譯階段將內置apk給異常,下面提供2中方法。

  • 直接找到添加這個apk的mk文件,從 PRODUCT_PACKAGES 中刪除
  • 通過添加模塊,LOCAL_OVERRIDES_PACKAGES定義要覆蓋的apk

目錄結構

hinzer@ubuntu:android-10$ tree ./device/mi/pure/
./device/mi/pure/
├── Android.mk
├── AndroidProducts.mk
├── BoardConfig.mk
├── product01.mk

操作過程

1、 直接從 PRODUCT_PACKAGES 中刪除

# step1 找到apk添加到 PRODUCT_PACKAGES 的那個mk文件
$ mgrep Contacts

# step2 從改mk文件中移除配置項
.....

# step3 清理system目錄,重新編譯
$ rm -rf out/target/product/pure/system

# step4 驗證
make -j4 && emulator

2、 通過 LOCAL_OVERRIDES_PACKAGES 刪除

  1. 在Product下添加一個模塊remove_unused_module
$ vim Android.mk

include $(CLEAR_VARS)
LOCAL_MODULE := remove_unused_module
LOCAL_MODULE_TAGS := optional

LOCAL_MODULE_CLASS := FAKE     # 指定編譯輸出的目錄爲 $(PRODUCT_OUT)/fake_packages
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_OVERRIDES_PACKAGES += \
   Contacts \
   Email  			#這裏添加要覆蓋的apk

include $(BUILD_SYSTEM)/base_rules.mk

$(LOCAL_BUILT_MODULE):
	$(hide) echo "Fake: $@"
	$(hide) mkdir -p $(dir $@)
	$(hide) touch $@

PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))
  1. remove_unused_module添加到對應product文件的PRODUCT_PACKAGES配置
PRODUCT_PACKAGES += remove_unused_module
  1. 清理out/target/product/pure/system目錄,驗證
$ rm -rf out/target/product/pure/system
$ make -j4 && emulator

原理補充(PRODUCT_PACKAGES)

對於第一種方法,通過mgrep命令能夠搜索到這個mk文件定義了PRODUCT_PACKAGES,直接移除就ok。對於第二種方法,在 main.mk 裏面有對 OVERRIDES_PACKAGES 進行處理(在android-10源碼中對這個關鍵詞進行檢索)

# Lists most of the files a particular product installs, including:
# - PRODUCT_PACKAGES, and their LOCAL_REQUIRED_MODULES
# - PRODUCT_COPY_FILES
# The base list of modules to build for this product is specified
# by the appropriate product definition file, which was included
# by product_config.mk.
# Name resolution for PRODUCT_PACKAGES:
#   foo:32 resolves to foo_32;
#   foo:64 resolves to foo;
#   foo resolves to both foo and foo_32 (if foo_32 is defined).
#
# Name resolution for LOCAL_REQUIRED_MODULES:
#   If a module is built for 2nd arch, its required module resolves to
#   32-bit variant, if it exits. See the select-bitness-of-required-modules definition.
# $(1): product makefile
define product-installed-files
  $(eval _mk := $(strip $(1))) \
  $(eval _pif_modules := \
    $(PRODUCTS.$(_mk).PRODUCT_PACKAGES) \
    $(if $(filter eng,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_ENG)) \
    $(if $(filter debug,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_DEBUG)) \
    $(if $(filter tests,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_TESTS)) \
    $(if $(filter asan,$(tags_to_install)),$(PRODUCTS.$(_mk).PRODUCT_PACKAGES_DEBUG_ASAN)) \
    $(call auto-included-modules) \
  ) \
  $(eval ### Filter out the overridden packages and executables before doing expansion) \
  $(eval _pif_overrides := $(call module-overrides,$(_pif_modules))) \
  $(eval _pif_modules := $(filter-out $(_pif_overrides), $(_pif_modules))) \
  $(eval ### Resolve the :32 :64 module name) \
  $(eval _pif_modules_32 := $(patsubst %:32,%,$(filter %:32, $(_pif_modules)))) \
  $(eval _pif_modules_64 := $(patsubst %:64,%,$(filter %:64, $(_pif_modules)))) \
  $(eval _pif_modules_rest := $(filter-out %:32 %:64,$(_pif_modules))) \
  $(eval ### Note for 32-bit product, 32 and 64 will be added as their original module names.) \
  $(eval _pif_modules := $(call get-32-bit-modules-if-we-can, $(_pif_modules_32))) \
  $(eval _pif_modules += $(_pif_modules_64)) \
  $(eval ### For the rest we add both) \
  $(eval _pif_modules += $(call get-32-bit-modules, $(_pif_modules_rest))) \
  $(eval _pif_modules += $(_pif_modules_rest)) \
  $(call expand-required-modules,_pif_modules,$(_pif_modules),$(_pif_overrides)) \
  $(filter-out $(HOST_OUT_ROOT)/%,$(call module-installed-files, $(_pif_modules))) \
  $(call resolve-product-relative-paths,\
    $(foreach cf,$(PRODUCTS.$(_mk).PRODUCT_COPY_FILES),$(call word-colon,2,$(cf))))
endef

有定義
$(eval _pif_modules := $(filter-out $(_pif_overrides), $(_pif_modules)))
filter-out是Makefile語法支持的函數,從$(_pif_modules)中 反選過濾出$(_pif_overrides)之外的所有modules。

涉及到android build系統,我現在也還沒搞清楚邏輯鏈,有待補充。

參考資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章