Android7.0 启动Launcher流程

本文详细剖析了Android7.0系统启动过程中SystemServer的main函数执行、时间设置、Looper创建、本地库加载、服务启动等步骤。接着,重点讨论了启动Java层服务的过程,包括PowerManagerService、PackageManagerService、Settings、Permission与GID的关系、apk解析与优化、系统服务启动等。最后,介绍了如何通过AMS启动Launcher,使应用程序在桌面展示。

    在前文分析启动SystemServer流程可以知道在ZygoteInit中通过反射机制执行SystemServer的main函数,从而进入到SystemServer中。在SystemServer的main函数中所做的事情很简单,就是创建SystemServer对象并调用它的run函数进一步处理。


    如果设备的时间为1970年之前的话,就会将手机时间设置为1970年。为SystemServer创建主线程的Looper,并且进入消息循环。加载一个叫做android_servers的本地库,它提供本地方法的接口。之后调用本地函数启动sensor service。为系统进行创建Context,创建SystemServiceManager进行管理系统服务。

            // Mmmmmm... more memory!
            VMRuntime.getRuntime().clearGrowthLimit();   //每次开机都会清理一下内存, 获取更多的内存空间

            VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);   //内存使用相关

            Build.ensureFingerprintProperty();    //指纹配置

            // Within the system server, it is an error to access Environment paths without
            // explicitly specifying a user.
            Environment.setUserRequired(true);     

            // Within the system server, any incoming Bundles should be defused
            // to avoid throwing BadParcelableException.
            BaseBundle.setShouldDefuse(true);

            // Ensure binder calls into the system always run at foreground priority.
            BinderInternal.disableBackgroundScheduling(true);

            BinderInternal.setMaxThreads(sMaxBinderThreads);     //增加Binder数量

            android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);   //设置systemserver为前台进程
            android.os.Process.setCanSelfBackground(false);    //不能自己变为后台进程
            Looper.prepareMainLooper();      //准备main looper

            System.loadLibrary("android_servers");     //初始化本地的服务

            performPendingShutdown();    //检查上次是否关机发生问题

            createSystemContext();   //初始化上下文

    以上处理完后就开始启动Java层的各个服务首先将一些比较重要并且比较复杂相互之间有依赖的服务统一启动,而大部分系统服务的启动是由SystemServiceManager进行统一管理,仍然基于反射等机制,根据启动类的class name进行创建类的实例。例如启动 PowerManagerService过程:

        mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
将PowerManagerService的class传递给SystemServiceManager从而启动PowerManagerService. 所要启动的类必须是SystemService的子类.

    /**
     * Creates and starts a system service. The class must be a subclass of
     * {@link com.android.server.SystemService}.
     *
     * @param serviceClass A Java class that implements the SystemService interface.
     * @return The service instance, never null.
     * @throws RuntimeException if the service fails to start.
     */
    @SuppressWarnings("unchecked")
    public <T extends SystemService> T startService(Class<T> serviceClass) {
        try {
            final String name = serviceClass.getName();    //获取class的name
            Slog.i(TAG, "Starting " + name);
            Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

            // Create the service.
            if (!SystemService.class.isAssignableFrom(serviceClass)) {
                throw new RuntimeException("Failed to create " + name
                        + ": service must extend " + SystemService.class.getName());
            }
            final T service;
            try {
  
<think>嗯,用户问的是如何在Android系统中提前启动Launcher的方法或配置。首先,我需要回忆一下Android系统启动流程。通常,开机后系统会启动各种服务,比如SystemServer,然后才会启动Launcher。用户提到的“提前启动”应该是指让Launcher在系统启动过程中更早地被加载,避免出现像“android正在启动”这样的提示弹窗,特别是在设置第三方Launcher为默认时。 根据引用内容,特别是引用[1]提到的fallbackhome机制,在Android 7.0之后,当系统解锁前,如果有多个Launcher,系统会显示这个弹窗。用户希望绕过这个,直接进入默认的Launcher。那么解决方案可能需要修改系统服务,比如ActivityManagerService或者PackageManagerService,调整Launcher启动逻辑。 查看引用[1]中的核心类,如PackageParser.java、ActivityManagerService.java和ActivityTaskManagerInternal.java。可能需要在AMS中找到处理Launcher启动的部分,比如在系统启动过程中,当检测到默认Launcher已设置时,跳过fallbackhome的步骤,直接启动Launcher。 另外,引用[3]和[4]提到SystemUI和SystemServer的启动流程。可能需要调整系统服务的启动顺序,确保Launcher在SystemUI之后尽快启动。或者修改Zygote的配置,加快SystemServer的初始化,从而更早启动Launcher。 用户可能需要修改系统源码中的相关部分,比如在ActivityManagerService中调整启动Launcher的条件判断,或者在启动流程中提前触发Launcher启动。另外,可能需要处理权限和条件检查,确保在系统未完全就绪时也能启动Launcher,这可能会涉及安全性问题,需要谨慎处理。 还可能涉及修改启动脚本或配置文件,如引用[5]中的init.zygote*.rc,调整服务的启动顺序。但具体如何操作需要查看系统启动流程的详细步骤,找到合适的切入点。 总结起来,可能的解决方案包括修改系统服务的代码,调整启动顺序,禁用fallbackhome机制,或者提前触发Launcher启动。需要具体分析相关类的实现,找到关键逻辑进行修改,并进行测试以确保系统稳定性。</think>### Android系统提前启动Launcher的实现方法 #### 核心思路 通过修改系统服务启动流程和FallbackHome机制,使系统在初始化阶段跳过默认的「android正在启动」弹窗,直接启动已设置的默认Launcher。该需求主要涉及系统服务的启动顺序和权限校验逻辑调整[^1][^3]。 --- #### 实现步骤及关键代码 1. **禁用FallbackHome机制** 在`ActivityManagerService.java`中修改默认Launcher启动判断条件: ```java // frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java private boolean hasPreferredHomeActivity() { // 原逻辑会检查是否已设置默认Launcher // 修改为强制返回true,跳过FallbackHome return true; } ``` 2. **提前触发Launcher启动** 在`SystemServer`启动阶段优化服务初始化顺序: ```java // com/android/server/SystemServer.java private void startOtherServices() { // 将Launcher启动优先级提升到系统服务初始化早期阶段 mActivityManagerService.systemReady(() -> { startLauncherEarly(); // 新增自定义启动方法 }, ...); } ``` 3. **修改PackageManager的过滤条件** 在`PackageParser.java`中调整Launcher的解析逻辑: ```java // frameworks/base/core/java/android/content/pm/PackageParser.java public static boolean isLauncher(ActivityInfo info) { // 添加第三方Launcher的包名白名单或放宽过滤条件 return info.isHomeActivity || customCheck(info.packageName); } ``` --- #### 关键配置调整 在`AndroidManifest.xml`中声明Launcher权限: ```xml <activity android:name=".CustomLauncher"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> <!-- 强制设为默认 --> </intent-filter> </activity> ``` --- #### 验证方法 1. 查看开机日志过滤关键信息: ```bash adb logcat | grep -E "ActivityTaskManager|FallbackHome" ``` 2. 通过`dumpsys activity activities`确认首个启动的Activity是否为目标Launcher --- #### 注意事项 1. 需处理多用户场景下的权限校验(参考`ActivityTaskManagerInternal.java`中的多用户适配逻辑)[^1] 2. 避免与SystemUI启动产生冲突(参考`startSystemUi`的调用时序)[^3] 3. 需签名系统证书才能修改上述核心类
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值