Android中如何不编译源生模块

如果想让自己的app 替换系统的app 比如使用闪电浏览器替换系统的Browser

首先把闪电浏览器放到 vendor/rockchip/common/apps

 Android.mk

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

LOCAL_MODULE := Lightning
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_PREBUILT_JNI_LIBS := \
	lib/libjbigi.so
include $(BUILD_PREBUILT)

关于系统默认的Browser浏览器有以下处理方式

1、直接删掉Browser这个目录方案

这是个暴力的解决办法,但是移植性、维护性差一些。如果有的板卡需要,有的不需要,这样就不能删除了。

或者将Browser下的Android.mk进行修改 使其不进行编译

这个方案改动较大

2、Android中源生给出的替换方案
这个方案Android源生是存在的,仔细看下build/core/*.mk 就会发现有个变量叫LOCAL_OVERRIDES_PACKAGES

这个变量跟LOCAL_PACKAGE_NAME一样,在app的Android.mk中添加需要替换掉什么app(让此app不参与编译)只需要设定这个变量即可。

例如,在闪电浏览器的Android.mk文件中添加LOCAL_OVERRIDES_PACKAGES := Browser

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

LOCAL_MODULE := Lightning
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)

LOCAL_OVERRIDES_PACKAGES := Browser

LOCAL_CERTIFICATE := platform
LOCAL_PREBUILT_JNI_LIBS := \
	lib/libjbigi.so
include $(BUILD_PREBUILT)

这里设定好LOCAL_OVERRIDES_PACKAGES 就可以让Browser不参与编译。

注意,这个参数是起的一个替换的作用,比如有了launcher3后,不需要让系统编译launcher2了,就可以在launcher3下的Android.mk加上LOCAL_OVERRIDES_PACKAGES := Launcher2,这样launcher2就不会编译进系统了

但是,这样修改有个缺点。如果是单个的应用,这样修改没有问题,但是如果是很多应用,那就需要修改每个应用的mk 文件。这就产生了第 3 中修改方案。

3、统一管理方案
对于第2点的方案似乎已经达到目的了,但是如果不是替换,而是简单的控制不让其参与编译,这个变量是无法设定的。

来看下这里统一管理的方案,在Android中的makefile中有个变量PRODUCT_PACKAGES,这个变量是控制模块是否参与编译,我们在device目录下看到很多这样的设定,这时候如果为了项目或者板卡维护,直接修改device下的PRODUCT_PACKAGES变量就可以了。但是有时候会看到有些模块不是在device下面控制,而是放在了build下面,这个时候为了项目维护性,不能直接修改build下的变量。

有了这样的顾虑,为了以后项目维护性,想了一个办法,那就是用一个变量统一管理,以后不管是什么项目不需要源生的或者device下面已经设定好的PRODUCT_PACKAGES,只需要设定这个变量就可以了。

3、统一管理方案
对于第2点的方案似乎已经达到目的了,但是如果不是替换,而是简单的控制不让其参与编译,这个变量是无法设定的。

来看下这里统一管理的方案,在Android中的makefile中有个变量PRODUCT_PACKAGES,这个变量是控制模块是否参与编译,我们在device目录下看到很多这样的设定,这时候如果为了项目或者板卡维护,直接修改device下的PRODUCT_PACKAGES变量就可以了。但是有时候会看到有些模块不是在device下面控制,而是放在了build下面,这个时候为了项目维护性,不能直接修改build下的变量。

有了这样的顾虑,为了以后项目维护性,想了一个办法,那就是用一个变量统一管理,以后不管是什么项目不需要源生的或者device下面已经设定好的PRODUCT_PACKAGES,只需要设定这个变量就可以了。

在build/target/product/core.mk中

#
# Copyright (C) 2007 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# Base configuration for communication-oriented android devices
# (phones, tablets, etc.).  If you want a change to apply to ALMOST ALL
# devices (including non-phones and non-tablets), modify
# core_minimal.mk instead. If you care about wearables, you need to modify
# core_tiny.mk in addition to core_minimal.mk.

PRODUCT_PACKAGES += \
    BasicDreams \
    BlockedNumberProvider \
    BookmarkProvider \
    Browser \
    CaptivePortalLogin \
    CertInstaller \
    DocumentsUI \
    DownloadProviderUi \
    ExternalStorageProvider \
    FusedLocation \
    InputDevices \
    KeyChain \
    Keyguard \
    LatinIME \
    Launcher2 \
    ManagedProvisioning \
    MtpDocumentsProvider \
    PicoTts \
    PacProcessor \
    libpac \
    PrintRecommendationService \
    ProxyHandler \
    SharedStorageBackup \
    StorageManager \
    TeleService \
    VpnDialogs \

ifneq ($(strip $(TARGET_BOARD_PLATFORM_PRODUCT)), box)
PRODUCT_PACKAGES += \
    CalendarProvider \
    PrintSpooler \
    Telecom \
    MmsService \
    Settings
endif

$(call inherit-product, $(SRC_TARGET_DIR)/product/core_base.mk)

可以在这里进行统一添加和去除

猜你喜欢

转载自blog.csdn.net/u010823818/article/details/132292356
今日推荐