剥离 AOSP 预安装包的最优雅方法是什么?

What is the most elegant way of striping AOSP of its pre-installed packages?

我正在尝试逐渐将 AOSP 从其默认应用程序中删除。但是我想知道我要应用的方法是否正确并且是最有效

在查看了各种方法后,我得出了以下 方法:(示例应用 - "package_name")

1. Pick particular app and find out its "LOCAL_PACKAGE_NAME"
2. Use "envsetup.sh" provided command "mgrep package_name"
3. Look at the output to determine where package_name is mentioned
4. Remove lines of code containing package_name from makefiles

我也偶然发现了这个解决方案:

Instead of modifying bunch of .mk files in AOSP in many folders, you can add a new module, a stub, and disable modules in its Android.mk using LOCAL_OVERRIDES_PACKAGES. If a module still appear in target, you'll probably need to add to LOCAL_OVERRIDES_PACKAGES another modules which added undesired packages via LOCAL_REQUIRED_MODULES.

但遗憾的是我还不知道如何构建一个新的 "module, a stub" 所以我现在不能应用这种方法。

我是否可以采取任何步骤来确保从我的构建中完全删除 特定应用程序而不伤害任何东西。如果有的话,您认为针对此特定任务的最优雅 解决方案是什么?什么(literature/docs/website)对我熟悉像上述案例一样对 AOSP 代码进行 "scratch-surface" 更改会有用?

如果这很重要,我现在要删除的是:计算器;日历;相机;钟;联系人;文件;画廊;消息;音乐; Phone;搜索;网络视图

提前感谢您的回复!

删除包

理想情况下,您应该更新设备配置以完全不包含这些包。

您的 device/ 目录中可能有一个类似于此的 .mk 文件:

# Common product definition.
$(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_x86_64.mk)

# Your device extensions.
$(call inherit-product, device/<company>/<device>/device.mk)

PRODUCT_NAME := my_x86_64
PRODUCT_DEVICE := x86_64
PRODUCT_BRAND := Android
PRODUCT_MODEL := My x86_64 Android Product

所有默认包都已通过通用产品定义间接添加 aosp_x86_64。您可以切换到 PRODUCT_PACKAGES 列表中没有计算器、日历、相机等的,例如 $(SRC_TARGET_DIR)/product/core_minimal.mk


替换包

如果您出于某种原因无法更改您的设备配置,您可以用较浅的包覆盖这些包。

Android.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := CalculatorOverride
LOCAL_OVERRIDES_PACKAGES := ExactCalculator
LOCAL_SDK_VERSION := current

include $(BUILD_PACKAGE)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest
    xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.android.calculator_override">
    <application/>
</manifest>

您必须将您的包添加到设备配置中的 PRODUCT_PACKAGES 列表中。如果您之前已经启动了您的设备,计算器应用程序将已经安装。在这种情况下清除 /data 分区。

此解决方案的缺陷是您并没有真正删除应用程序,而是用其他无法正常工作的应用程序替换它们。


临时黑客

如果您不关心在 AOSP 存储库中进行临时更改,测试删除这些应用程序后会发生什么情况的最快方法是更改​​ build/target/product/core.mk 中的列表。至少此列表可能是您的设备配置当前正在使用的列表。

如果您按照第一种方法更改已安装应用程序的模块定义,您将遇到与更改 AOSP 存储库相同的问题,只是在更多地方。


您最好的信息来源可能是 source.android.com。有一些书,但我还没有看到一本包含了 Treble 引入的深刻变化 Android。

您可以使用虚假模块覆盖不需要的模块。

1,定义一个伪模块并覆盖不需要的模块

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

UNWANTED_OVERRIDE_PACKAGES := \
   watchhome \
   all_your_unwanted_pacakge \
   each_pacakge_one_line
LOCAL_MODULE := override_packages
LOCAL_MODULE_TAGS := optional
PACKAGES.$(LOCAL_MODULE).OVERRIDES := $(strip $(UNWANTED_OVERRIDE_PACKAGES))
include $(BUILD_PHONY_PACKAGE)

https://gist.github.com/auxor/6e363e56eb1af430bfee8fe01916e4df

2,在你的 device.mk

中包含假模块
PRODUCT_PACKAGES += override_packages

这是在不修改的情况下覆盖模块的最干净的方法 build/target/