admin管理员组

文章数量:1614278

如果项目要求用自己开发的应用替换安卓原生的应用,这里以Launcher为例。

目录

    • 前提
    • 方案1
    • 方案2
    • 方案3

前提

  1. 在自己编写的launcher的AndroidManifest.xml中必需要有以下语句
<manifest xmlns:android="http://schemas.android/apk/res/android"
            package="com.xxx.mylauncher"
            android:sharedUserId="android.uid.system">  ***
            ... ...
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
                <category android:name="android.intent.category.HOME" />    ***
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
            ... ...
</manifest> 

方案1

1.注释掉原生launcher AndroidManifest.xml的category为HOME项的intent-filter,这样的话原生launcher就不会接收处理启动的intent

             <intent-filter>
                 <action android:name="android.intent.action.MAIN" />
	             <!-- <category android:name="android.intent.category.HOME" /> -->
                 <category android:name="android.intent.category.DEFAULT" />
                 <category android:name="android.intent.category.MONKEY"/>
                 <category android:name="android.intent.category.LAUNCHER_APP" />
             </intent-filter>     

2.将编译好的mylauncher.apk文件拷贝到安卓代码树的目录下,通常是在vendor下的厂商目录中(当然也可以按需创建一个文件目录),例如

LINUX/android/vendor/xiaomi/

在此目录下新建Android.mk,内容如下:

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

LOCAL_MODULE := mylauncher
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform

include $(BUILD_PREBUILT)

完成后新建的目录下应该有如下两个文件

LINUX/android/vendor/xiaomi/
    mylauncher.apk
    Android.mk

3.将mylauncher.apk编译到rom中,在项目的mk文件中添加

# add my own launcher
PRODUCT_PACKAGES += mylauncher

注意:
在编译的输出文件查找原生launcher相关的文件进行删除后在再全编译(否则之前的launcher可能会被打包到rom中)

cd out/target/product/xxx
find . | grep -i launcher

方案2

如方案1所示第一步,如果可以找到原生launcher的AndroidManifest.xml。那么直接rm或者重命名其Android.mk,这样的话原生的launcher就不会被编译到rom中,系统启动的话可选的launcher就只有你自己开发的,所以其它步骤不变的话也是可以起到同方案1的效果。

方案3

在自己apk的Android.mk添加以下覆盖宏是比较正式的做法,表明这个apk将覆盖LOCAL_OVERRIDES_PACKAGES 列出的apk。

LOCAL_OVERRIDES_PACKAGES := Home Launcher2 Launcher3

所以方案1的步骤2的Android.mk就变成了如下

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

LOCAL_MODULE := mylauncher
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_CERTIFICATE := platform
LOCAL_OVERRIDES_PACKAGES := Home Launcher2 Launcher3

include $(BUILD_PREBUILT)

之所以这么做是参考了Launcher3 的做法,我们在Launcher3的mk文件可以看到

/packages/apps/Launcher3/Android.mk
... ...
LOCAL_OVERRIDES_PACKAGES := Home Launcher2
... ...

本文标签: 系统android