Android开机自启动实现:从BOOT_COMPLETED广播到WorkManager的兼容方案
1. 项目缘起为什么“开机自启动”是个技术活在Android开发中实现App开机自启动是一个看似基础实则暗藏玄机的功能。无论是需要常驻后台提供服务的工具类应用还是需要在设备启动后立即同步数据的应用这个需求都相当普遍。然而很多开发者尤其是初学者在实现这个功能时往往会遇到“为什么我的Receiver收不到广播”、“为什么在Android 8.0API 26及以上版本失效了”、“为什么会被系统杀掉”等一系列问题。这背后是Android系统权限收紧、后台限制策略演进以及不同厂商定制ROM带来的重重挑战。今天我们就来彻底拆解这个功能从原理到实践从兼容性到保活策略手把手带你实现一个稳定可靠的开机自启动方案。2. 核心原理认识BOOT_COMPLETED广播与BroadcastReceiver开机自启动的核心机制依赖于系统在启动完成后发出的一个标准广播ACTION_BOOT_COMPLETED。我们的App通过注册一个BroadcastReceiver广播接收器来监听这个广播一旦收到即可执行我们预设的初始化代码。2.1 BroadcastReceiver的工作机制BroadcastReceiver是Android四大组件之一它是一个专注于接收并处理广播的组件。其工作模式是“订阅-发布”。系统或应用发布一个广播事件所有注册监听了该广播的BroadcastReceiver都会收到通知并触发其onReceive方法。对于开机广播有两种注册方式静态注册Manifest-declared在AndroidManifest.xml文件中声明。这种方式下即使App进程未启动系统也会在广播发出时唤醒App进程并调用Receiver。这是实现开机自启动最经典的方式。动态注册Context-registered在代码中通过registerReceiver方法注册。这种方式要求注册时App进程必须存活因此无法用于接收开机广播因为设备启动时你的App进程肯定还没起来。所以实现开机自启动我们必须使用静态注册。2.2 理解BOOT_COMPLETED广播的发送时机ACTION_BOOT_COMPLETED广播是在系统完成启动并且可以开始启动用户级进程时发出的。这里有几个关键点用户解锁后不它发送得更早。在用户看到锁屏界面并输入密码/图案之前系统可能已经发送了该广播。这意味着你的Receiver会在用户与设备交互之前就被调用。所有应用都会收到吗是的但前提是应用已经安装了并且其Receiver被静态注册来监听此广播。系统会向所有符合条件的Receiver发送广播。顺序如何系统并未严格规定接收顺序不同App的Receiver执行顺序是不确定的。因此你的启动逻辑不应依赖其他App是否已启动。3. 基础实现从零开始编写一个开机启动的Receiver让我们从一个最简化的可运行例子开始。假设我们有一个MainActivity希望在开机后自动启动它实际场景中更可能是启动一个Service后文会详述。3.1 第一步在AndroidManifest.xml中声明权限和Receiver这是最关键的一步任何遗漏都会导致功能失效。?xml version1.0 encodingutf-8? manifest xmlns:androidhttp://schemas.android.com/apk/res/android packagecom.example.bootstartdemo !-- 1. 声明接收开机广播所需的权限 -- uses-permission android:nameandroid.permission.RECEIVE_BOOT_COMPLETED / application android:allowBackuptrue android:iconmipmap/ic_launcher android:labelstring/app_name android:themestyle/AppTheme activity android:name.MainActivity intent-filter action android:nameandroid.intent.action.MAIN / category android:nameandroid.intent.category.LAUNCHER / /intent-filter /activity !-- 2. 声明我们的广播接收器 -- receiver android:name.BootCompletedReceiver android:enabledtrue android:exportedtrue intent-filter !-- 3. 指定要监听的开机完成广播 -- action android:nameandroid.intent.action.BOOT_COMPLETED / !-- 4. (可选但推荐) 监听锁屏解除广播作为补充或替代 -- action android:nameandroid.intent.action.USER_PRESENT / /intent-filter /receiver /application /manifest关键点解析RECEIVE_BOOT_COMPLETED权限这是一个普通权限normal permission在安装时即被授予无需运行时动态申请。但没有它系统不会将广播发送给你的App。Receiver属性android:enabledtrue确保该接收器是启用的。android:exportedtrue表示该Receiver可以被系统或其他应用此处是系统调用。对于接收系统广播的Receiver通常需要设置为true。从Android 12API 31开始如果Receiver声明了intent-filter则必须显式声明android:exported为true或false否则安装会失败。ACTION_USER_PRESENT这个广播在用户解锁设备输入密码/图案/指纹等成功后发送。有些厂商的省电策略可能会延迟或阻止BOOT_COMPLETED后启动Activity但USER_PRESENT的触发时机更贴近用户真实可用状态两者同时监听可以提高成功率。3.2 第二步实现BootCompletedReceiver类在Java目录下创建BootCompletedReceiver.java。package com.example.bootstartdemo; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; public class BootCompletedReceiver extends BroadcastReceiver { private static final String TAG BootCompletedReceiver; Override public void onReceive(Context context, Intent intent) { String action intent.getAction(); Log.d(TAG, 收到广播: action); if (Intent.ACTION_BOOT_COMPLETED.equals(action) || Intent.ACTION_USER_PRESENT.equals(action)) { // 注意这里不能执行耗时操作onReceive执行时间很短超时会导致ANR。 // 通常的做法是启动一个Service或Activity。 // 示例启动MainActivity Intent launchIntent new Intent(context, MainActivity.class); // 必须添加FLAG_ACTIVITY_NEW_TASK因为从非Activity上下文启动Activity需要此标志 launchIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(launchIntent); // 或者更常见的做法是启动一个Service // Intent serviceIntent new Intent(context, MyBackgroundService.class); // context.startService(serviceIntent); // 注意Android 8.0后的限制见下文 Toast.makeText(context, App已随系统启动, Toast.LENGTH_SHORT).show(); } } }关键点与踩坑预警onReceive在主线程执行所有代码都运行在主线程UI线程。严禁在此进行任何网络请求、数据库复杂查询、文件读写等耗时操作否则会触发Application Not Responding (ANR)错误导致应用无响应。正确的做法是如果初始化工作很重应该在onReceive内启动一个Service或JobIntentService将耗时任务交给后台线程处理。启动Activity必须加FLAG_ACTIVITY_NEW_TASKBroadcastReceiver的onReceive方法提供的Context不是Activity上下文。从这种上下文启动Activity必须为Intent添加Intent.FLAG_ACTIVITY_NEW_TASK标志否则会崩溃。Toast可能不显示在极早的启动阶段系统UI可能还未完全准备好此时调用Toast.makeText().show()可能无法显示。这属于正常现象不应依赖Toast作为功能是否成功的判断。4. 兼容性挑战应对Android 8.0及更高版本的后台限制如果你的应用targetSdkVersion 26Android 8.0你会发现上面的代码可能失效了。这是因为Android 8.0引入了一项重要的后台执行限制。4.1 后台服务限制与JobScheduler在Android 8.0之前我们可以在BootCompletedReceiver的onReceive中直接调用context.startService()来启动一个后台服务。但从8.0开始当应用处于后台时即对用户不可见系统不允许其创建和运行后台服务。在开机这个场景下你的App进程是被系统广播唤醒的此时它没有可见的Activity属于“后台应用”。因此context.startService()调用将会抛出IllegalStateException。解决方案是使用JobScheduler或其更易用的封装如WorkManager。JobScheduler是Android系统提供的一个智能任务调度框架。你可以创建一个JobService然后在BootCompletedReceiver中调度它。系统会在合适的时机例如连接网络后、设备空闲时运行你的任务同时更好地统筹系统资源。4.2 使用WorkManager实现兼容方案WorkManager是Jetpack组件之一它兼容了JobScheduler,GcmNetworkManager和AlarmManager提供了统一API是处理延迟、可延期后台任务的首选。第一步添加依赖在app/build.gradle文件中添加依赖dependencies { def work_version 2.8.1 // 使用最新稳定版 implementation androidx.work:work-runtime:$work_version // 如果需要Kotlin协程支持添加 -ktx // implementation androidx.work:work-runtime-ktx:$work_version }第二步创建后台工作任务创建一个继承自Worker的类在doWork()中执行你的启动逻辑。package com.example.bootstartdemo; import android.content.Context; import android.util.Log; import androidx.annotation.NonNull; import androidx.work.Worker; import androidx.work.WorkerParameters; public class BootStartWorker extends Worker { private static final String TAG BootStartWorker; public BootStartWorker(NonNull Context context, NonNull WorkerParameters workerParams) { super(context, workerParams); } NonNull Override public Result doWork() { // 这里在后台线程执行可以执行一些轻量级初始化 Log.d(TAG, BootStartWorker 开始执行后台任务); // 例如初始化数据库、同步配置、启动必要的Foreground Service等 // 注意如果要在Worker中启动Activity仍然需要主线程和NEW_TASK标志这通常不是好设计。 // 更常见的做法是Worker执行完数据准备后通过Notification通知用户用户点击通知再打开Activity。 // 模拟一些工作 try { Thread.sleep(2000); // 模拟2秒工作 } catch (InterruptedException e) { e.printStackTrace(); return Result.failure(); } Log.d(TAG, BootStartWorker 任务完成); // 返回结果指示成功、失败或重试 return Result.success(); } }第三步在BootCompletedReceiver中调度Work修改之前的BootCompletedReceiverOverride public void onReceive(Context context, Intent intent) { String action intent.getAction(); Log.d(TAG, 收到广播: action); if (Intent.ACTION_BOOT_COMPLETED.equals(action) || Intent.ACTION_USER_PRESENT.equals(action)) { // 使用WorkManager调度一个一次性任务 OneTimeWorkRequest bootWorkRequest new OneTimeWorkRequest.Builder(BootStartWorker.class) .setInitialDelay(10, TimeUnit.SECONDS) // 延迟10秒执行避免刚开机系统繁忙 .setConstraints( new Constraints.Builder() .setRequiredNetworkType(NetworkType.CONNECTED) // 可选需要网络 .build() ) .build(); WorkManager.getInstance(context).enqueue(bootWorkRequest); Log.d(TAG, 已调度开机启动Work任务); } }为什么这样更好兼容性WorkManager自动根据API级别选择最佳的实现方式。灵活性可以设置执行约束如需要网络、充电状态、延迟、重试策略等。系统友好系统可以批量处理多个应用的Job优化电量消耗。5. 厂商适配应对国产ROM的“魔改”与限制这是实现稳定开机自启动最棘手的一环。华为、小米、OPPO、vivo等国内厂商为了提升续航和流畅度都有一套非常激进的后台管理和自启动管控策略。即使你的代码完全符合Android标准在这些设备上也可能无法正常工作。5.1 常见厂商限制手段广播屏蔽系统直接不发送BOOT_COMPLETED广播给非白名单应用。关联启动限制禁止应用通过广播相互唤醒。你的Receiver即使被调用尝试启动Service或Activity也可能被拦截。后台进程保活限制即使你的Service成功启动也可能在几分钟后被系统强制停止Force Stop。手动设置开关系统设置中提供了“自启动管理”、“电池优化”、“后台弹出界面”等开关默认通常是关闭的。5.2 应对策略与实操指南没有银弹只能多管齐下尽可能提高成功率。策略一引导用户手动设置最重要且最有效在App首次启动或相关功能模块中清晰友好地引导用户去系统设置中打开权限。这是最合规、最稳定的方式。检测与提示可以尝试监听一次广播如果收不到则推断可能被限制弹出引导对话框。跳转设置页提供一键跳转到对应品牌手机自启动管理页面的功能需要分品牌处理通过Intent跳转特定Activity。由于各厂商界面不统一此功能维护成本较高。策略二加入厂商推送白名单对于需要强保活的应用如IM、推送服务可以考虑集成各厂商的推送SDK如小米推送、华为推送、OPPO推送等。集成后应用通常会被加入系统的后台保活白名单这不仅能提升推送到达率也间接提高了开机自启动的成功率。但这意味着你需要维护多个SDK复杂度陡增。策略三多广播监听与进程保活技巧监听多个广播除了BOOT_COMPLETED和USER_PRESENT还可以尝试监听ACTION_PACKAGE_ADDED自身应用更新后、ACTION_MY_PACKAGE_REPLACED等作为触发时机补充。前台服务Foreground Service在BootCompletedReceiver中启动一个前台服务。前台服务需要显示一个无法关闭的通知告知用户该服务正在运行。从Android 9API 28开始使用前台服务需要申请FOREGROUND_SERVICE权限并在onReceive中调用startForegroundService()然后在Service的onCreate或onStartCommand中迅速调用startForeground()。这是保活能力较强的方式但会常驻通知栏对用户体验有影响。一像素保活页面一种“黑科技”在收到广播后启动一个透明的、大小为1像素的Activity使其成为前台应用从而避免进程被立即杀死。待后台初始化完成后再finish这个Activity。这种方法非常规可能在新系统版本上失效且可能被应用商店审核拒绝不推荐普通应用使用。重要提示过度追求保活可能导致应用被系统标记为“行为异常”进而引发更严格的限制甚至被用户手动强制停止或卸载。务必在功能必要性和用户体验之间找到平衡。6. 测试与调试如何验证你的开机自启动是否生效开发完成后测试是关键。你不可能每次都重启真机来测试。6.1 使用Android模拟器或真机命令测试方法一通过ADB命令发送广播这是最高效的测试方法。确保设备通过USB连接并已开启调试模式。# 发送标准开机完成广播 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED # 如果你的Receiver指定了包名可以更精确地发送 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -p com.example.bootstartdemo # 发送用户解锁广播 adb shell am broadcast -a android.intent.action.USER_PRESENT -p com.example.bootstartdemo执行命令后立即在Android Studio的Logcat中过滤你的应用包名或BootCompletedReceiver的TAG查看日志是否打印。如果Receiver被正确触发你会看到onReceive中的日志。方法二重启模拟器Android Studio的模拟器提供了快速重启选项。在模拟器运行状态下点击工具栏的...更多按钮在Extended controls窗口中选择Power标签点击Cold boot now冷启动或Quick boot快速启动如果支持。冷启动会模拟完整的关机开机流程一定会发送BOOT_COMPLETED广播。6.2 测试不同场景与兼容性首次安装后重启安装App后不手动打开直接重启设备。这是检验静态注册是否有效的标准场景。升级后重启更新App版本后重启确保Receiver依然有效。强制停止后重启在系统设置中“强制停止”你的App然后重启。在Android 3.1系统上被用户强制停止的应用将无法接收任何广播直到用户再次手动启动该应用。这是一个重要的系统保护机制你的应用必须能正确处理这种情况即开机不自启是正常行为。不同API级别测试使用模拟器创建Android 6.0、8.0、10.0、12.0等不同版本的设备镜像进行测试验证WorkManager等兼容性代码是否正常工作。7. 进阶考量安全、隐私与最佳实践在实现功能的同时我们必须关注安全、隐私和系统资源消耗。7.1 避免滥用与隐私风险最小化启动范围只应在绝对必要时才使用开机自启动。例如杀毒软件、系统工具、需要实时同步数据的应用是合理的。一个普通的游戏或阅读App请求开机自启动会被用户和系统视为恶意行为。明确告知用户在隐私政策或应用描述中清晰说明为何需要开机自启动权限以及如何使用相关数据。提供关闭选项在应用设置中应该提供“允许开机启动”的开关让用户可以自主控制。7.2 性能优化最佳实践延迟初始化在BootCompletedReceiver或启动的Worker中只执行最最核心、必要的初始化如建立数据库连接、加载关键配置。其他非紧急任务如拉取用户消息、更新内容应该延迟到应用第一次进入前台时或者通过WorkManager设置为在设备空闲、连接Wi-Fi时执行。使用轻量级进程如果启动的是一个Service考虑是否可以通过android:process属性将其运行在一个独立的轻量级进程中避免主进程因Service崩溃而受影响。及时释放资源在后台任务完成后如果不再需要应及时停止Service释放CPU和内存资源。对于使用前台服务的任务完成后应降级为普通服务或直接停止。7.3 应对Android 10的启动限制从Android 10API 29开始对后台Activity的启动增加了更严格的限制。如果你的App从后台例如在BootCompletedReceiver中启动一个Activity该Activity可能无法启动具体取决于目标SDK版本和系统版本。建议在开机启动场景下尽量避免直接启动主界面Activity。取而代之的是启动一个前台服务在通知栏告知用户应用已准备就绪用户点击通知再进入Activity。使用WorkManager执行后台数据准备完成后发送一个高优先级通知引导用户点击进入应用。如果必须启动Activity请确保你的应用具有SYSTEM_ALERT_WINDOW悬浮窗权限或者启动的Activity是透明的、不干扰用户的小窗口但仍需谨慎可能影响用户体验。实现一个健壮的Android App开机自启动功能是一个与Android系统版本和厂商生态持续“博弈”的过程。核心在于理解系统机制尊重平台规则采用官方推荐的兼容方案如WorkManager并积极引导用户在系统设置中授权。对于绝大多数应用而言开机后执行一些轻量级的初始化或数据同步是合理需求通过本文介绍的标准方法结合厂商适配指引完全可以实现一个稳定、合规的自启动方案。记住良好的用户体验和系统友好性永远是衡量功能成功与否的最终标准。

相关新闻

让 Hermes 每天凌晨自动巡检服务器:AI 运维 Agent 实战

让 Hermes 每天凌晨自动巡检服务器:AI 运维 Agent 实战

前面几篇,我们一直在解决一个问题:如何让 AI 从聊天助手,变成一个真正参与工作的系统。我们给 Hermes 加了:Gateway,让任务可以主动进入;Cron,让任务可以定时触发;Kanban&#xff0c…

2026/10/13 12:02:50 阅读更多 →
嵌入式秋招面经:5大核心模块高频考题与实战避坑总结

嵌入式秋招面经:5大核心模块高频考题与实战避坑总结

前言:在嵌入式开发面试中,基础知识面的广度和深度是考察的重点。本文结合当前主流嵌入式开发需求,针对通信协议、C语言、STM32 外设、RTOS 实时操作系统以及Linux 系统五大核心板块,整理了面试中最常见的高频问题及精简解答。适合…

2026/10/10 4:51:42 阅读更多 →
Dhizuku技术架构深度解析:Android设备所有者权限共享机制的设计与实现

Dhizuku技术架构深度解析:Android设备所有者权限共享机制的设计与实现

Dhizuku技术架构深度解析:Android设备所有者权限共享机制的设计与实现 【免费下载链接】Dhizuku A tool that can share DeviceOwner permissions to other application. 项目地址: https://gitcode.com/gh_mirrors/dh/Dhizuku Dhizuku作为一个创新的Android…

2026/9/26 16:56:35 阅读更多 →

最新新闻

Spark集合操作全解析:union、join、笛卡尔积的原理与性能陷阱

Spark集合操作全解析:union、join、笛卡尔积的原理与性能陷阱

如果你处理过这样一个需求——把两份来源不同的用户数据合并成一份,或者找出最近30天活跃用户和付费用户的重叠人群,又或者把订单表关联到用户维度表上做统计——你大概率会第一时间想到Spark。但在Spark里,“集合”这个概念被拆成了好几组AP…

2026/10/14 4:50:57 阅读更多 →
从123456到密码管理器:弱密码破解原理与账号安全加固指南

从123456到密码管理器:弱密码破解原理与账号安全加固指南

1. 从“123456”说起:这个最熟悉的数字串到底藏了多少坑我敢打赌,看到“123456”这四个字的瞬间,你脑子里闪过的绝对不是一串数字,而是某个网站的登录页、某个多年没改过的密码,或者某次帮亲戚重装系统时顺手敲下的默认…

2026/10/14 4:50:57 阅读更多 →
轻量模型部署实战:3.8B开源模型从能跑到跑稳

轻量模型部署实战:3.8B开源模型从能跑到跑稳

这个标题是我某天半夜临时建的一个内部备忘录。Strata 是我们那边的统一推理服务层,3.8-Flash-Next 是某开源语言模型项目跑出来的一个轻量分支,参数体量不大,但做生产化接入的时候问题一点不比大模型少。后来这句话被同事转述成“Strata 跑 …

2026/10/14 4:50:57 阅读更多 →
Strata平台部署Qwen3.8-Flash-Next实战:从模型加载到接口调优全记录

Strata平台部署Qwen3.8-Flash-Next实战:从模型加载到接口调优全记录

前几天我们内部接到一个挺常见的任务:一台GPU服务器,一个刚拿到的轻量级模型,要在“Strata”这个内部自研的部署平台上跑起来,对外提供HTTP接口,给业务方调用。模型代号叫“Qwen3.8-Flash-Next”,名字看起来…

2026/10/14 4:50:57 阅读更多 →
前端性能优化实战:从浏览器渲染原理到加载与交互调优

前端性能优化实战:从浏览器渲染原理到加载与交互调优

前端性能优化这个话题,我在团队内部讲过很多次,每次讲完都觉得还能再展开不少。最近接了一个业务线的性能专项,把从前端资源加载到交互流畅度这条链路重新捋了一遍,顺手把过程中的经验和踩过的坑整理下来。这篇文章适合两类人看&a…

2026/10/14 4:50:57 阅读更多 →
大模型预判RTL综合PPA:数字前端设计的实时物理实现顾问

大模型预判RTL综合PPA:数字前端设计的实时物理实现顾问

1. 项目概述:这不是又一个“大模型EDA”的概念秀,而是RTL设计流程里真实卡点的破局尝试PPA-RTL——这个标题里没有花哨的缩写游戏,PPA就是功耗(Power)、性能(Performance)、面积(Are…

2026/10/14 4:49:57 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →