android 修改默认Launcher

本文探讨了Android系统中Launcher的启动流程及如何通过修改代码来指定特定的Launcher为默认启动项。涉及修改源码中的Intent过滤器及在无源码情况下进行相应配置。

系统启动后, 会查找并运行Launcher,

有源码的情况下,可以通过修改Intent-filter中的android:priorty="N" N >=1; 一般我会设置 N=100;

没有源码的情况下, 要将第三方Launcher默认启动, 则需要在些过程做点修改.

 

 frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

    boolean startHomeActivityLocked(int userId) {
        if (mHeadless) {
            // Added because none of the other calls to ensureBootCompleted seem to fire
            // when running headless.
            ensureBootCompleted();
            return false;
        }

        if (mFactoryTest == SystemServer.FACTORY_TEST_LOW_LEVEL
                && mTopAction == null) {
            // We are running in factory test mode, but unable to find
            // the factory test app, so just sit around displaying the
            // error message and don't try to start anything.
            return false;
        }
        Intent intent = new Intent(
            mTopAction,
            mTopData != null ? Uri.parse(mTopData) : null);
        intent.setComponent(mTopComponent);
        if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {
            intent.addCategory(Intent.CATEGORY_HOME);
        }
   /** AnsonCode 2013.8.5 add Code**/
		try{
			final String specialPkg = "com.android.launcherX";
			mContext.getPackageManager().getApplicationEnabledSetting(specialPkg);
			intent.setPackage(specialPkg);
		}catch(Exception e){
			e.printStackTrace();
		}
   /** AnsonCode End **/
        ActivityInfo aInfo =
            resolveActivityInfo(intent, STOCK_PM_FLAGS, userId);
        if (aInfo != null) {
            intent.setComponent(new ComponentName(
                    aInfo.applicationInfo.packageName, aInfo.name));
            // Don't do this if the home app is currently being
            // instrumented.
            aInfo = new ActivityInfo(aInfo);
            aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId);
            ProcessRecord app = getProcessRecordLocked(aInfo.processName,
                    aInfo.applicationInfo.uid);
            if (app == null || app.instrumentationClass == null) {
                intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);
                mMainStack.startActivityLocked(null, intent, null, aInfo,
                        null, null, 0, 0, 0, 0, null, false, null);
            }
        }

        return true;
    }

 

 

 

 

<think>我们正在讨论如何在RK3566设备上更改Android 11的默认Launcher。根据引用[1]的内容,我们知道Rockchip的Android11源码中,默认LauncherLauncher3,位于`packages/apps/Launcher3`。现在需要替换为我们自己的Launcher。 引用[1]提供的方法如下: 1. 在源码目录`android/vendor/rockchip/common/apps/`下新建一个目录(例如`hybLauncher`)。 2. 将我们自己的Launcher的apk文件(例如`hybLauncher.apk`)拷贝到这个新建的目录中,并且要求文件夹名和apk文件名相同(不带扩展名)。 3. 在该目录下新建一个`Android.mk`文件,用于将我们的Launcher编译进系统。 但是,请注意,Android 11已经逐渐转向使用Soong构建系统(使用Android.bp),但Rockchip的源码中可能仍然支持Android.mk。因此,我们需要根据实际情况选择。 另外,我们还需要确保系统启动时默认使用我们的Launcher。这通常需要修改系统属性`ro.home.app`或者通过覆盖默认Launcher配置来实现。然而,在Android 11中,默认Launcher的设置可能还需要在`packages/apps/Launcher3`的位置进行替换,或者通过修改系统配置文件来设置。 根据引用[1]的步骤,我们还需要注意,在编译系统后,我们的Launcher会被编译进系统,并且需要移除原来的Launcher3(或者通过配置让系统选择我们的Launcher作为默认)。 然而,引用[1]并没有提到如何设置默认启动器。因此,我们可能需要额外的步骤: 4. 修改系统属性或者配置文件,将我们的Launcher设置为默认的Home应用。 在Android中,默认Launcher是通过在AndroidManifest.xml中声明特定的intent-filter来实现的。当有多个Launcher存在时,系统会在第一次启动时让用户选择。但我们要做的是预制系统,所以需要避免用户选择,直接设置我们的Launcher默认。 通常,我们可以通过以下方法之一: - 在设备overlay中修改`config_defaultHomeApp`,指向我们的Launcher的组件名(包名/类名)。 - 在系统启动的初始化脚本中设置`ro.home.app`属性为我们的Launcher的包名。 具体步骤: 方法一:通过overlay修改默认Launcher 1. 在设备树目录(例如`device/rockchip/rk356x`)下,找到overlay目录,修改`config_defaultHomeApp`的值。这个值通常在`core/res/res/values/config.xml`中定义,我们可以通过设备overlay覆盖它。 2. 创建一个overlay文件,例如:`device/rockchip/rk356x/overlay/packages/apps/Launcher3/res/values/config.xml`(如果存在Launcher3的overlay)或者更常见的在`frameworks/base/core/res/res/values/config.xml`的overlay。 3. 在overlay文件中添加: ```xml <resources> <string name="config_defaultHomeApp" translatable="false">com.example.hybLauncher/.MainActivity</string> </resources> ``` 其中`com.example.hybLauncher/.MainActivity`是我们自己Launcher的主Activity。 方法二:通过设置系统属性(如果平台支持) 在`device/rockchip/rk356x/system.prop`中添加: ro.home.app=com.example.hybLauncher 但是,需要注意的是,Rockchip平台可能有自己的设置方式。根据引用[1]的步骤,他们只是将apk放入vendor目录并编译,然后系统会自动替换。这是因为在Rockchip的common.mk中可能会自动处理vendor/apps下的应用,并且在第一次启动时,如果只有一个Launcher,那么它就会成为默认。但如果有多个(比如系统自带的Launcher3和我们的Launcher同时存在),那么就需要设置默认。 因此,为了确保我们的Launcher成为默认,我们需要移除系统自带的Launcher3。我们可以通过在自己的device.mk文件中添加: PRODUCT_PACKAGES -= Launcher3 这样在编译系统时就不会包含Launcher3。 总结步骤: 1. 将我们的Launcher apk(例如:hybLauncher.apk)放入`vendor/rockchip/common/apps/hybLauncher/`目录下。 2. 在该目录下创建`Android.mk`文件,内容如下: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Module name should match apk name to be installed LOCAL_MODULE := hybLauncher LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED include $(BUILD_PREBUILT) ``` 3. 在设备对应的makefile(例如`device/rockchip/rk356x/device.mk`)中,添加: ```makefile PRODUCT_PACKAGES += hybLauncher PRODUCT_PACKAGES -= Launcher3 ``` 4. 为了确保设置默认Launcher,我们还需要通过overlay设置`config_defaultHomeApp`(推荐)或者设置系统属性(如果平台支持)。这里我们采用overlay方式: 在设备overlay目录(例如`device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/`)下创建`config.xml`,内容为: ```xml <?xml version="1.0" encoding="utf-8"?> <resources> <string name="config_defaultHomeApp" translatable="false">com.example.hybLauncher/.MainActivity</string> </resources> ``` 注意:如果该overlay目录已经存在`config.xml`,则只需在其中添加或修改该字符串。 5. 重新编译系统并烧写。 注意:以上步骤假设我们的Launcher的包名为`com.example.hybLauncher`,主Activity为`MainActivity`,请根据实际情况修改。 另外,如果我们的Launcher没有签名,我们可以使用`LOCAL_CERTIFICATE := platform`来使用平台签名,但前提是我们有Launcher的源码并放在源码树中编译。如果只是预置apk,且apk没有签名,则使用`PRESIGNED`表示使用apk原有的签名(如果apk没有签名,则不能使用,必须签名)。 因此,如果我们的apk没有签名,我们需要先签名,或者使用`LOCAL_CERTIFICATE := platform`来让系统在编译时用平台签名。但注意,使用平台签名需要将apk放在`vendor/rockchip/common/apps`下,并且使用`LOCAL_CERTIFICATE := platform`,则修改`Android.mk`: ```makefile ... LOCAL_CERTIFICATE := platform ... ``` 如果使用Android.bp,则创建`Android.bp`文件: ```bp android_app_import { name: "hybLauncher", apk: "hybLauncher.apk", privileged: true, presigned: true, // 如果是预签名,否则使用certificate // certificate: "platform", // 如果需要平台签名 overrides: [], dex_preopt: { enabled: false, }, } ``` 但是,Rockchip的common.mk可能会自动处理vendor/apps下的应用,所以也可能不需要Android.mk,但为了保险,我们按照引用[1]的步骤创建Android.mk。 由于我们移除了Launcher3,并设置了默认Launcher,这样系统启动后就会使用我们的Launcher。 最后,编译系统: source build/envsetup.sh lunch rk3566_s-userdebug make -j8 ./mkimage.sh 注意:具体的lunch目标可能因设备而异,请根据实际情况选择。 以上步骤是在源码环境下操作,如果你没有完整的编译环境,可能需要先搭建环境。 如果用户没有源码环境,那么可能需要通过修改系统镜像来实现,但这种方法比较复杂,通常需要解包system.img,修改后重新打包,并且需要重新签名。这里我们只讨论有源码的情况。 相关问题: 1. 如果我不想移除Launcher3,而是希望保留两个Launcher,但设置默认启动器为我自己的Launcher,应该怎么做? 2. 在Android 11中,除了修改`config_defaultHomeApp`,还有哪些设置默认Launcher的方法? 3. 在Rockchip平台上,是否有其他特定的配置方式? 4. 如果使用Android.bp文件来预置apk,应该如何写? 5. 如何验证默认Launcher已经设置成功?</think>### 在RK3566设备上更改Android 11默认Launcher的步骤 #### 1. **创建Launcher目录** 在Android源码目录下创建专属目录: ```bash cd android/vendor/rockchip/common/apps/ mkdir hybLauncher # 目录名需与APK文件名一致 ``` #### 2. **放置APK文件** 将自定义Launcher的APK文件放入目录并重命名: ```bash cp /path/to/your_launcher.apk hybLauncher/hybLauncher.apk ``` **要求**:APK文件名必须与目录名完全相同(不含扩展名)。 #### 3. **编写编译脚本** 在`hybLauncher/`目录下创建`Android.mk`文件: ```makefile LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_MODULE := hybLauncher # 必须与目录名相同 LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := PRESIGNED # 使用APK原有签名 LOCAL_DEX_PREOPT := false # 禁用预优化 include $(BUILD_PREBUILT) ``` #### 4. **修改系统配置** 在设备配置文件中移除原Launcher并添加新Launcher(以`rk3566`设备为例): ```bash vim device/rockchip/rk356x/device.mk ``` 修改内容: ```makefile # 移除默认Launcher3 PRODUCT_PACKAGES := \ $(filter-out Launcher3, $(PRODUCT_PACKAGES)) # 添加自定义Launcher PRODUCT_PACKAGES += \ hybLauncher ``` #### 5. **设置默认Launcher** 在框架层覆盖配置(**关键步骤**): ```bash mkdir -p device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/ vim device/rockchip/rk356x/overlay/frameworks/base/core/res/res/values/config.xml ``` 添加内容: ```xml <?xml version="1.0" encoding="utf-8"?> <resources> <!-- 替换为你的Launcher包名和主Activity --> <string name="config_defaultHomeApp" translatable="false">com.example.hybLauncher/.MainActivity</string> </resources> ``` #### 6. **编译并烧写固件** ```bash source build/envsetup.sh lunch rk3566_s-userdebug # 选择对应目标 make -j$(nproc) # 编译 ./rkflash.sh # 使用Rockchip工具烧写 ``` #### 验证步骤 - 开机后观察是否直接进入自定义Launcher - 执行以下命令检查默认Home应用: ```bash adb shell cmd package resolve-activity -a android.intent.action.MAIN -c android.intent.category.HOME ``` ### 常见问题解决 1. **编译时报错`LOCAL_CERTIFICATE`不匹配** - 若使用平台签名:改为`LOCAL_CERTIFICATE := platform` - 若需重新签名:在`Android.mk`中添加`LOCAL_CERTIFICATE := YOUR_SIGNATURE` 2. **开机后出现Launcher选择弹窗** 检查`config_defaultHomeApp`是否配置正确,确保: - 包名和Activity路径完全匹配 - 已通过`PRODUCT_PACKAGES`移除原Launcher3 3. **APK未预装到系统中** 确认`PRODUCT_PACKAGES`中是否包含模块名,并检查`Android.mk`文件名拼写。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值