想让MacroDroid里的某个宏,只在手机第一次开机时“悄悄”运行一次,之后再开机就“默默休息”?这个需求很常见,比如自动配置初始Wi-Fi、跳过冗长的新手引导,或是为特定应用初始化一堆权限。
实现“仅首次有效”的核心思路,就是让宏自己记住“我已经执行过了”。下面介绍三种主流方法,从最通用到最深入系统,帮你找到最适合的那一个。

用变量标记“已执行”状态
这是最推荐、最通用的方法,逻辑清晰且无需特殊权限。原理非常简单:用一个变量作为“已执行”的记号。
第一步:打上“已完成”标记。 在你设计的宏的动作列表末尾,添加一个「设置变量」动作。变量名可以设为 first_boot_done,值设置为 true。这个动作意味着,只要宏成功跑完一遍,就会留下这个标记。
第二步:设置“准入”检查。 然后,在这个宏的「约束」条件里,添加一个「变量检查」。选择刚才的变量名 first_boot_done,条件设为「不存在」或「等于」→「空」。这样一来,只有在这个标记不存在(即宏从未运行过)时,约束条件才满足,宏才会被允许执行。
第三步:大功告成。 保存宏。之后无论设备重启多少次,只要 first_boot_done 这个变量还在,约束就会把它拦下来,宏便不会再触发。
需要注意的是,这个变量默认储存在MacroDroid的应用数据里。如果你卸载并重装了MacroDroid,变量会随之丢失,宏就会再次执行——这反倒完美符合“仅首次启动有效”的初衷。如果非要追求即使重装APP也不运行,就得配合外部存储(比如把标记写入SD卡文件),但会引入不必要的复杂性,一般不推荐这么做。
利用系统属性判断真正首次启动
如果想绕过应用层,直接从Android系统层面判断是否为“人生第一次”,可以尝试检测系统属性。不过,这条路对设备权限有要求。
方法一:检测启动计时。 在宏的约束中添加「系统属性」条件,输入属性名 ro.boottime.system,条件选「等于」,值填 0。这个思路是,部分厂商定制的系统在首次启动时,会把这个记录系统启动耗时的属性设为0,之后的每次启动才会是实际的毫秒数。
方法二:检查启动原因文件。 添加约束→「文件存在与内容」,路径填入 /data/property/persist.sys.boot.reason,内容匹配填 bootloader 或 recovery。首次正常启动时,这个文件可能是空的或包含特定标识。但请注意,这个文件的路径和内容因手机厂商不同差异很大,需要自己用 adb shell 命令先确认一下。
关键前提: 上面这两种系统级的方法,通常都需要Root权限。没有Root的设备,很可能无法读取 /data/property/ 目录下的文件,或者某些 ro.* 开头的属性,直接添加条件可能会失败。
绑定“设备首次开机”硬件事件
最后这个方法比较巧妙,它利用了Android系统启动过程中的一个时间差,而且不需要Root权限。
第一步:捕捉启动时刻。 触发器选择「设备事件」→「系统启动完成」。
第二步:耐心等待。 紧接着添加一个「等待」动作,设定延迟15秒左右。这是为了确保系统的各项服务(包括我们接下来要查询的)已经完全准备就绪。
第三步:查询硬件身份。 添加动作「执行Shell命令」,命令框里填上 getprop ro.serialno,并把输出保存到一个变量里,比如 serial_check。这个命令是获取设备的序列号。
第四步:用空值判断。 最后,为这个宏添加一个约束:「变量检查」,变量选 serial_check,条件「等于」,值留空。这里的逻辑是,在非常首次的启动过程中,硬件序列号 ro.serialno 可能有一小段初始化时间,在这个短暂窗口内查询会返回空字符串。而之后的任何一次启动,这个值都肯定已经存在了。
这个方法巧妙地利用了系统内核启动早期的时序特点,无需Root,兼容性比直接读系统属性要好。但它只适用于那些可以在启动后立即执行的任务场景。