裁剪,首先需要明白模块加载的原理,在其相关的变量中过滤掉要裁剪的模块即可。

一、移除原生应用的多种方式

https://blog.csdn.net/supernova_TOP/article/details/126708316

本文列举了四种方式移除原生系统中默认内置的应用(以Email为例),推荐使用方法四

方法一、改写Android.mk

方式1.重命名Email的Android.mk

将Email的Android.mk 重命名为Android.mk.bak,使得在编译时不会加载其mk因此Email应用不会被编译进系统。

packages\apps\Email\Android.mk -> packages\apps\Email\Android.mk.bak

缺点:当需要移除多个应用时不便于统一管理和管控;当需要恢复预置时,修改繁琐
优点:操作简单

方式2.make时传递变量,通过变量控制Android.mk的编译

以下是一个示例,假设你想禁止编译名为external/some_module的模块:

# external/some_module/Android.mk

# 检查是否设置了某个禁止编译的变量
ifdef DISABLE_SOME_MODULE

# 如果设置了,则不编译这个模块
else # DISABLE_SOME_MODULE

# 正常情况下的模块编译代码
include $(CLEAR_VARS)

LOCAL_MODULE := some_module
LOCAL_SRC_FILES := some_module.c

# 其他模块编译设置...

include $(BUILD_SHARED_LIBRARY) # 或者其他适当的宏

endif # DISABLE_SOME_MODULE

然后,在编译Android系统时,你可以通过定义DISABLE_SOME_MODULE变量来禁止编译该模块:

# 在你的编译命令中添加此变量定义
DISABLE_SOME_MODULE=true make -j$(nproc)

或者在环境变量中设置:

export DISABLE_SOME_MODULE=true

然后执行编译命令

make -j$(nproc)
这样,当你编译Android系统时,some_module模块就不会被包含在内。

方法二、PRODUCT_PACKAGES移除/注释Email

在device/…/*.mk预置Email处删除该应用模块的预置
device/qcom/qssi/base.mk

PRODUCT_PACKAGES := \
    AccountAndSyncSettings \
    DeskClock \
    AlarmProvider \
    Bluetooth \
    BluetoothExt \
    Calculator \
    Calendar \
    Camera \
    CellBroadcastReceiver \
    CertInstaller \
    DrmProvider \
-   Email \
    Gallery2 \
    LatinIME \
    Music \
    ...

缺点:未记录移除应用,当要还原时繁琐
优点:修改简单,方便批量移除

方法三、使用LOCAL_OVERRIDES_PACKAGES标签

使用LOCAL_OVERRIDES_PACKAGES属性使得指定模块不参与编译.

1、在device下新建Android.mk
device/qcom/xxx/Android.mk

+include $(CLEAR_VARS)
+LOCAL_MODULE := remove_unused_apps
+
+LOCAL_MODULE_CLASS := ETC
+LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
+LOCAL_OVERRIDES_PACKAGES += \
+    Email

PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(LOCAL_OVERRIDES_PACKAGES))

2、PRODUCT_PACKAGES 添加remove_unused_apps
device/qcom/qssi/base.mk

+PRODUCT_PACKAGES += \
+    remove_unused_apps

原理:

  • LOCAL_OVERRIDES_PACKAGES表示使用某以模块替换/覆盖其定义的模块,使得一个或多个模块不参与系统编译,从而达到移除指定应用的目的。
  • LOCAL_MODULE_CLASS 用来定义了模块类型和预置路径。
    LOCAL_MODULE_CLASS := ETC //其他类型模块,预置于/system/etc
    LOCAL_MODULE_CLASS := STATIC_LIBRARIES //静态库类型,预置于/system/lib
    LOCAL_MODULE_CLASS := EXECUTABLES //可执行文件类型,预置于/system/bin
    LOCAL_MODULE_CLASS := JAVA_LIBRARIES //jar包类型
    LOCAL_MODULE_CLASS := SHARED_LIBRARIES //动态库,预置于/system/lib
    LOCAL_MODULE_CLASS := APPS //apk类型
    缺点:预置了多余etc目录

上面的写法其实有点重复,不如以下方式
https://blog.csdn.net/u010823818/article/details/132292356

比如替换系统的Luncher,可以在自定义的Luncher的Android.mk中配置 LOCAL_OVERRIDES_PACKAGES := Launcher3即可将原生Luncher屏蔽掉, LOCAL_OVERRIDES_PACKAGES += xx可将其它的模块屏蔽。

方法四、配置TARGET_REMOVE_PACKAGES属性

新定义TARGET_REMOVE_PACKAGES属性用于移除应用
build/make/core/main.mk

   $(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 _pif_modules := $(filter-out $(TARGET_REMOVE_PACKAGES), $(_pif_modules))) \
   $(eval ### Resolve the :32 :64 module name) \

在device的mk中设置TARGET_REMOVE_PACKAGES属性
device/qcom/qssi/base.mk

TARGET_REMOVE_PACKAGES := \
     Email

优点:方便管理和记录默认应用的移除

总结
虽然上述方法都能移除原生应用Email,但综合考虑推荐一劳永逸的方法四移除原生应用,方便移除多个应用和重新预置应用,代码功能清晰明确。

方法五:自定义PRODUCT_DEL_PACKAGES变量

基本思路是从product_MODULES中过滤掉自定义的变量,在自定义的变量中定义要删除的包名。
https://blog.csdn.net/hubinbin595959/article/details/105799239
https://blog.csdn.net/wzl_show/article/details/111991846

1.修改build目录main.mk

ifdef FULL_BUILD
  # 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.
  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))

  #sheldon patch begin
  product_MODULES := $(filter-out $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEL_PACKAGES), $(product_MODULES))
  #sheldon patch end

此处是根据PRODUCT_DEL_PACKAGES来过滤预置的app;
2.修改build目录product.mk

增加PRODUCT_DEL_PACKAGES属性使之生效,之后就可以在mk文件中使用了。

 _product_var_list :=
…
PRODUCT_DEL_PACKAGES
…

3.在.mk中使用PRODUCT_DEL_PACKAGES属性

例如在third_apps.mk文件中增加 PRODUCT_DEL_PACKAGES`

PRODUCT_PACKAGES += DeviceTest

PRODUCT_DEL_PACKAGES += \
                        Browser2 \
                        BasicDreams \
                        Calendar \
                        CalendarProvider \
                        Contacts \
                        DocumentsUI \
                        Email \
                        Exchange2 \

这样预置应用中就不会包含以上 PRODUCT_DEL_PACKAGES 添加这些。

二、移除so库

https://blog.csdn.net/wzl_show/article/details/111991846

分类: 裁剪

0 条评论

发表回复

您的电子邮箱地址不会被公开。