"android 系统内置了很多应用,比如说通信录,日历,计算器,相机等, 对于 TV 来说,这些应用是没有什么用的,只是占用系统空间而已。为了节剩一下系统空间,我们在编译系统时要把这些模块给去掉。 1. 从 PRODUCT_PACKAGES 中删除 比如说我们要删除通信录 Contacts 这个应用 ...."

不编译 android 原生应用

android 系统内置了很多应用,比如说通信录,日历,计算器,相机等, 对于 TV 来说,这些应用是没有什么用的,只是占用系统空间而已。为了节剩一下系统空间,我们在编译系统时要把这些模块给去掉。

1. 从 PRODUCT_PACKAGES 中删除

比如说我们要删除通信录 Contacts 这个应用,我们可以

xushaoqiu@ubuntu:~/svn/P_Android848/sourcecode/trunk/oreo-mstar-master$ mgrep Contacts
./packages/services/Telephony/Android.mk:3:# Build the Phone app which includes the emergency dialer. See Contacts
./packages/services/Car/car_product/build/car_base.mk:23:    ContactsProvider \
./packages/apps/Contacts/CleanSpec.mk:50:$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/Contacts_intermediates)
./packages/apps/Contacts/tests/Android.mk:13:LOCAL_PACKAGE_NAME := ContactsTests
./packages/apps/Contacts/tests/Android.mk:15:LOCAL_INSTRUMENTATION_FOR := Contacts
./packages/apps/Contacts/Android.mk:51:LOCAL_PACKAGE_NAME := Contacts
./packages/providers/ContactsProvider/tests2/Android.mk:23:    ContactsProviderTestUtils \
./packages/providers/ContactsProvider/tests2/Android.mk:32:LOCAL_PACKAGE_NAME := ContactsProviderTests2
./packages/providers/ContactsProvider/tests2/Android.mk:35:LOCAL_INSTRUMENTATION_FOR := ContactsProvider
./packages/providers/ContactsProvider/test_common/Android.mk:29:LOCAL_MODULE := ContactsProviderTestUtils
./packages/providers/ContactsProvider/tests/Android.mk:8:    ContactsProviderTestUtils \
./packages/providers/ContactsProvider/tests/Android.mk:18:LOCAL_PACKAGE_NAME := ContactsProviderTests
./packages/providers/ContactsProvider/tests/Android.mk:21:LOCAL_INSTRUMENTATION_FOR := ContactsProvider
./packages/providers/ContactsProvider/Android.mk:22:LOCAL_PACKAGE_NAME := ContactsProvider
./device/google/atv/products/atv_base.mk:32:    ContactsProvider \
./device/konka/konka_848/Android.mk:44: ContactsProvider \
./device/generic/car/common/product/core.mk:28:    Contacts \
./cts/tests/tests/contactsproviderwipe/Android.mk:36:LOCAL_PACKAGE_NAME := CtsContactsProviderWipe
./build/make/target/product/core_base.mk:24:    ContactsProvider \
./build/make/target/product/core.mk:33:    Contacts \
./build/make/target/product/core_tiny.mk:22:    ContactsProvider \
./platform_testing/build/tasks/tests/instrumentation_test_list.mk:32:    ContactsProviderTests \
./platform_testing/build/tasks/tests/instrumentation_test_list.mk:33:    ContactsProviderTests2 \
xushaoqiu@ubuntu:~/svn/P_Android848/sourcecode/trunk/oreo-mstar-master$

看一下搜索的结果应该可以知道是 ./build/make/target/product/core.mk 这个文件里面添加了 Contacts 应用。 很多系统原生的应用也是在这里面添加的。我们可以直接在这里面删除即可。

2. LOCAL_OVERRIDES_PACKAGES

虽然通过前面的方法基本上可以满足我们的需求了,但是需要修改系统原生的配置,不好维护。后来发现 mstar 有更好的方法。在 device 目录下的 Android.mk 里面添加一个模块 remove_unused_module

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

LOCAL_MODULE_CLASS := FAKE
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_OVERRIDES_PACKAGES += \
   PacProcessor \
   CtsShimPrebuilt 

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))

然后在 device.mk 里面添加

PRODUCT_PACKAGES += remove_unused_module

将要去掉的模块添加到 LOCAL_OVERRIDES_PACKAGES 就可以了,统一管理,很方便。

LOCAL_MODULE_CLASS := FAKE 指定编译输出的目录为 $(PRODUCT_OUT)/fake_packages, 也就是不会打包到系统里面。
LOCAL_OVERRIDES_PACKAGES 定义本模块要覆盖的模块,也就是本模块被编译的话,被覆盖的模块就不会被编译了。在 main.mk 里面有对 OVERRIDES_PACKAGES 进行处理

# Some packages may override others using LOCAL_OVERRIDES_PACKAGES.
# Filter out (do not install) any overridden packages.
overridden_packages := $(call get-package-overrides,$(modules_to_install))
ifdef overridden_packages
#  old_modules_to_install := $(modules_to_install)
  modules_to_install := \
      $(filter-out $(foreach p,$(overridden_packages),$(p) %/$(p).apk %/$(p).odex %/$(p).vdex), \
          $(modules_to_install))
endif

modules_to_install 是所有要编译的模块,
overridden_packages 就是指要覆盖的模块了,一般来说是通过在各模块的 Android.mk 里面通过 LOCAL_OVERRIDES_PACKAGES 指定的。
filter-out 就是过滤掉。
这段代码的意思就是将 overridden_packages 从 modules_to_install 中删除掉。

0     0     0     0     0    
0 回帖