Android系统第一次开机启动Launcher黑屏问题

本文针对RK6.0平台在启动过程中出现的黑屏问题提供了两种解决方法。一是通过修改系统设置,使设备在首次启动时跳过设置向导直接进入桌面;二是调整桌面启动器的intent-filter优先级。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

RK6.0 在项目上做了个开机向导,开机向导结束后启动launcher,会出现一段时间黑屏问题,下面是解决办法很受用。感谢!
转载:
https://blog.csdn.net/dpppppp/article/details/81941550

现象:

系统第一次开机启动,进入桌面前黑屏10秒.

log信息:

01-21 09:30:26.806   575  1695 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] flg=0x10000000 cmp=com.android.provision/.DefaultActivity} from uid 0 on display 0
01-21 09:30:26.824   575  1695 I ActivityManager: Start proc 2471:com.android.provision/u0a29 for activity com.android.provision/.DefaultActivity

01-21 09:30:36.802   575   629 W ActivityManager: Launch timeout has expired, giving up wake lock!
01-21 09:30:36.852   575  1177 I ActivityManager: START u0 {act=android.intent.action.MAIN cat=[android.intent.category.HOME] 
1
2
3
4
5
启动超时:ActivityManager: Launch timeout has expired, giving up wake lock!,这与services/core/java/com/android/server/am/ActivityManagerService.java中的PROC_START_TIMEOUT一致。

    // How long we wait for a launched process to attach to the activity manager
    // before we decide it's never going to come up for real.
    static final int PROC_START_TIMEOUT = 10*1000;

解决方法:

方法1.在系统第一次启动时,一般都会有设置向导,完成设置后才能启动进入桌面。如果没有设置向导,可以修改系统设置的默认值:

frameworks/base/packages/SettingsProvider/res/values/defaults.xml

true

<bool name="def_device_provisioned">true</bool>

1
2
3
4
5
再在产品mk中去掉这两个app:

packages/apps/OneTimeInitializer
packages/apps/Provision
1
2
让系统直接启动桌面,不用启动Provision。Provision干的事情和SetupWizard、OneTimeInitializer类似。都是设置DEVICE_PROVISIONED和USER_SETUP_COMPLETE。

方法2.修改桌面启动器intent-filter的优先级:

<think>好的,我现在需要回答用户关于Android系统开机启动Launcher的关键代码的问题。首先,我需要回忆一下Android启动流程的基本知识,然后确定Launcher启动的具体环节。 Android启动流程大致分为几个阶段:Boot ROM、Bootloader、Linux内核、Init进程、Zygote、System Server,最后到启动Launcher。用户关心的是Launcher启动的关键代码,所以需要重点关注System Server之后的部分。 接下来,我应该考虑Launcher的入口在哪里。Launcher作为应用程序,应该有一个Activity,其intent-filter中声明了CATEGORY_HOME,这样系统启动时会寻找这个Activity作为主界面。因此,关键点可能在System Server启动后,ActivityManagerService负责启动这个具有HOME category的Activity。 然后,需要找到AMS中启动Launcher的相关代码。在SystemServer启动的过程中,会启动各种服务,其中ActivityManagerService的systemReady方法可能是触发Launcher启动的关键点。当系统服务准备就绪后,会调用该方法,进而发送启动Home Activity的intent。 此外,Launcher本身的AndroidManifest.xml中的声明也很重要,需要确认其intent-filter是否正确设置。例如,是否有android.intent.category.HOME和android.intent.action.MAIN的过滤条件。 可能还需要查看ActivityManagerService中的代码,特别是startHomeActivityLocked方法,这个方法应该是实际启动Launcher的地方。这里会构造一个Intent,设置Action为ACTION_MAIN,Category为CATEGORY_HOME,然后通过startActivity启动。 另外,需要考虑系统可能有多个Launcher应用的情况,此时会弹出选择框让用户选择。但默认情况下,系统会有一个预装的Launcher,比如Pixel的Launcher3,这时候会直接启动它。 总结一下,关键步骤包括: 1. SystemServer启动后,AMS的systemReady被调用。 2. AMS发送启动Home Activity的Intent。 3. Launcher应用的AndroidManifest.xml声明了对应的intent-filter。 4. AMS中的startHomeActivityLocked方法处理启动逻辑。 可能需要验证这些步骤对应的代码位置,例如在AOSP中的具体文件路径,比如ActivityManagerService.java中的相关方法,以及Launcher应用的清单文件配置。 最后,应该将这些信息整理成用户容易理解的步骤,并指出关键代码的位置和功能,帮助用户理解整个流程。</think>Android系统开机启动Launcher的核心流程涉及系统服务与组件交互,以下是关键步骤及对应代码解析: --- ### **1. 系统服务初始化阶段** 在`SystemServer`启动后,会初始化关键系统服务(如`ActivityManagerService`)。 - **代码入口**:`SystemServer.java`中的`startOtherServices()`方法 ```java // 代码路径:frameworks/base/services/java/com/android/server/SystemServer.java private void startOtherServices() { // ... mActivityManagerService.systemReady(() -> { // 系统服务准备就绪后触发Launcher启动 }, BOOT_TIMINGS_TRACE_LOG); } ``` --- ### **2. ActivityManagerService触发启动** `ActivityManagerService`(AMS)通过`systemReady()`方法通知系统就绪,并调用`startHomeOnAllDisplays()`启动Launcher。 - **关键方法**:`ActivityManagerService.systemReady()` ```java // 代码路径:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java public void systemReady(final Runnable goingCallback, TimingsTraceLog traceLog) { // ... startHomeOnAllDisplays(currentUserId, "systemReady"); // ... } ``` --- ### **3. 发送HOME Intent** AMS通过`startHomeActivityLocked()`方法构造`CATEGORY_HOME` Intent,启动Launcher。 - **核心逻辑**:`startHomeActivityLocked()` ```java boolean startHomeActivityLocked(int userId, String reason) { Intent intent = new Intent(Intent.ACTION_MAIN); intent.addCategory(Intent.CATEGORY_HOME); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 启动符合条件的Home Activity ActivityInfo aInfo = resolveActivityInfo(intent, userId); if (aInfo != null) { mActivityStartController.startHomeActivity(intent, aInfo, reason, userId); } return true; } ``` --- ### **4. Launcher声明为Home组件** Launcher需在`AndroidManifest.xml`中声明`CATEGORY_HOME`,例如系统默认Launcher的配置: ```xml <activity android:name=".Launcher" android:launchMode="singleTask" android:theme="@style/Theme.Launcher"> <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> ``` --- ### **5. 启动流程总结** 1. **系统启动完成**:`SystemServer`初始化AMS后调用`systemReady()`。 2. **发送HOME Intent**:AMS构造`ACTION_MAIN` + `CATEGORY_HOME`的Intent。 3. **匹配组件**:解析所有声明了`CATEGORY_HOME`的应用(如存在多个则弹出选择框)。 4. **启动Launcher**:启动目标Activity并显示主界面。 --- ### **关键代码路径** - **AMS启动逻辑**: - `frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java` - **Launcher实现**: - 系统默认Launcher代码位于`packages/apps/Launcher3/` 通过以上流程,Android系统完成从内核启动到用户界面(Launcher)加载的全过程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值