在 Android 系统定制中常见一个问题某个预装应用没有注册BOOT_COMPLETED广播接收器但产品要求它在设备开机后自动启动。如果无法修改 APK无源码、签名限制、第三方交付可以在 Framework 层做兜底拉起。一、需求背景目标应用包名com.longzhiye.custom目标效果系统完成BOOT_COMPLETED分发后自动启动该应用仅在系统用户USER_SYSTEM执行避免多用户重复拉起二、改动总览本次修改集中在frameworks/base/services/core/java/com/android/server/am/UserController.java核心改动有 3 个新增自动拉起配置常量在BOOT_COMPLETED完成后调度启动逻辑实现应用启动与异常兜底日志三、关键实现解析1新增常量配置// Longzhiye app package to force-start after boot when APK has no BOOT_COMPLETED receiver.privatestaticfinalStringBOOT_AUTO_LAUNCH_PACKAGEcom.longzhiye.custom;privatestaticfinallongBOOT_AUTO_LAUNCH_DELAY_MS100;说明BOOT_AUTO_LAUNCH_PACKAGE目标包名BOOT_AUTO_LAUNCH_DELAY_MS延迟执行时间避免与开机阶段任务抢占时序2插入 BOOT_COMPLETED 后触发点mBootCompletedtrue;scheduleBootAutoLaunchApp(userId);这一步非常关键在系统确认BOOT_COMPLETED处理完成后进入自动拉起流程。3仅系统用户执行并延迟启动privatevoidscheduleBootAutoLaunchApp(UserIdIntintuserId){if(userId!UserHandle.USER_SYSTEM){return;}mHandler.postDelayed(()-startBootAutoLaunchApp(userId),BOOT_AUTO_LAUNCH_DELAY_MS);}设计目的仅允许USER_SYSTEM执行避免多用户重复触发使用postDelayed让启动动作更平滑减少开机瞬时冲突4启动逻辑与兜底处理privatevoidstartBootAutoLaunchApp(UserIdIntintuserId){finalContextcontextmInjector.getContext();try{IntentlaunchIntentcontext.getPackageManager().getLaunchIntentForPackage(BOOT_AUTO_LAUNCH_PACKAGE);if(launchIntentnull){launchIntentnewIntent(Intent.ACTION_MAIN);launchIntent.addCategory(Intent.CATEGORY_LAUNCHER);launchIntent.setPackage(BOOT_AUTO_LAUNCH_PACKAGE);}launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);context.startActivityAsUser(launchIntent,UserHandle.of(userId));Slogf.i(TAG,Boot auto-launch: started BOOT_AUTO_LAUNCH_PACKAGE);}catch(Exceptione){Slogf.e(TAG,Boot auto-launch: failed to start BOOT_AUTO_LAUNCH_PACKAGE,e);}}实现要点优先使用getLaunchIntentForPackage()获取应用主入口若返回空回退为ACTION_MAIN CATEGORY_LAUNCHER添加FLAG_ACTIVITY_NEW_TASK满足系统服务上下文启动 Activity 要求使用startActivityAsUser()指定用户启动全量异常捕获并记录日志便于排查启动失败原因四、方案优势不改 APK适合预装闭源应用改动集中只改 Framework 单一模块可观测性强有明确成功/失败日志风险可控用户过滤 延迟调度 异常兜底五、注意事项包名硬编码维护成本高建议后续改为系统属性或 overlay 配置延迟时间建议按机型调优必要时可提升至 100ms~1000ms需验证目标应用确实存在可启动 Activity多用户/用户切换场景建议加幂等保护防止重复拉起六、验证建议开机后检查日志成功Boot auto-launch: started com.longzhiye.custom失败Boot auto-launch: failed to start com.longzhiye.custom