野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 2828|回复: 2

[经验\资料] 【笔记】Android实现无APK源码开机自启动应用程序

[复制链接]
发表于 2025-4-23 22:15:23 | 显示全部楼层 |阅读模式
本帖最后由 erd-yunmu 于 2025-6-18 10:20 编辑

在Android开发或系统定制过程中,有时需要让第三方应用在设备开机时自动启动,但可能面临以下问题:
1.没有应用源码,无法直接修改APK代码添加开机广播接收。
2.系统限制,高版本Android禁止后台应用自启动,需特殊处理。
3.兼容性需求,需适配不同ROM

不知道选什么应用好,要么就简单选个系统自带播放器:android.rk.RockVideoPlayer 播放器应用名

调试使用adb调试am启动应用,adb shell am start -n android.rk.RockVideoPlayer/.RockVideoPlayer 启动视频播放器,执行能打开是否让应用启动。
ps:如果不知道怎么启动应用命令,就百度上查找如何使用am启动自己的应用,多尝试各种命令啥的能启动就行了。

下面我写了一个实现开机自启动脚本,它会检测系统是否完全启动(sys.boot_completed=1)等待系统就绪,并循环检查应用是否已安装,如果安装则尝试启动,失败后延迟2秒重试,直到成功启动应用界面脚本代码:
  1. #!/system/bin/sh

  2. # 等待系统完全启动(最多等待60秒)
  3. while [ "$(getprop sys.boot_completed)" != "1" ]; do
  4.     sleep 2
  5.     # 超时检测(60秒后退出)
  6.     count=$((count + 1))
  7.     if [ $count -gt 30 ]; then
  8.         echo "Boot timeout!" > /sdcard/start_app.log
  9.         exit 1
  10.     fi
  11. done

  12. # 检查应用是否安装(最多等待30秒)
  13. count=0
  14. while ! pm list packages | grep -q "android.rk.RockVideoPlayer"; do
  15.     sleep 2
  16.     # 超时检测(30秒后退出)
  17.     count=$((count + 1))
  18.     if [ $count -gt 15 ]; then
  19.         echo "App not found!" >> /sdcard/start_app.log
  20.         exit 2
  21.     fi
  22. done

  23. # 循环启动应用直到成功
  24. while true; do
  25.     # 尝试启动应用
  26. am start -n android.rk.RockVideoPlayer/.RockVideoPlayer > /sdcard/start_app.log 2>&1
  27.    
  28.     # 检查是否启动成功(通过检测当前Activity)
  29.     if dumpsys window windows | grep -E 'mCurrentFocus|mFocusedApp' | grep -q "android.rk.RockVideoPlayer"; then
  30.         echo "Start success!" >> /sdcard/start_app.log
  31.         break
  32.     fi
  33.    
  34.     # 失败后延迟2秒再试
  35.     sleep 2
  36. done
复制代码
脚本说明:
三重保险检测:

第一阶段:等待 sys.boot_completed=1 系统标志
第二阶段:通过 pm list packages 确认应用已安装
第三阶段:通过 dumpsys window 确认Activity已在前台 (防止用户强制退出应用)
错误处理:
每阶段都有超时机制(系统启动60秒/应用检测30秒)
所有操作日志记录到 /sdcard/start_app.log
启动验证:
使用 dumpsys window windows 检测当前焦点窗口,比单纯检查am命令返回值更可靠

第二个脚本:去掉循环检测是否被用户强制退出,去掉日志记录
  1. #!/system/bin/sh

  2. # 等待系统启动完成
  3. timeout=30
  4. while [ "$(getprop sys.boot_completed)" != "1" ] && [ $timeout -gt 0 ]; do
  5.     sleep 2
  6.     timeout=$((timeout - 1))
  7. done

  8. # 启动应用(指定当前用户)
  9. am start --user 0 -n android.rk.RockVideoPlayer/.RockVideoPlayer
复制代码
脚本说明:
等待系统就绪
持续检测 sys.boot_completed 系统属性
最多等待60秒(30次×2秒),超时自动退出(返回码 1)
严格的应用存在性检查
通过 pm list packages 验证播放器是否安装
最多等待30秒(15次×2秒),未找到则退出(返回码 2)
防重复启动机制
使用 dumpsys activity activities 检测播放器是否已在运行
仅当播放器未启动时才会执行启动命令

在机器上临时调试脚本:

1.先把系统挂载:adb root,再adb remount
2.执行adb push \电脑路径\android_shell.sh system/bin/android_shell.sh
3.最后执行adb reboot重启查看开机是否自启动应用。

以上调试结束,我在sdk源码上加了一个开机自启脚本,每个sdk都有,具体路径在/device/rockchip/处理器型号/android_shell.sh,把调试好的脚本自启动写入android_shell.sh里面,重新编译就实现开机自启动应用了,希望对你们有帮助~


回复

使用道具 举报

发表于 2025-4-29 14:54:33 | 显示全部楼层
自启动 咋设置的?按照这个方式 自启动不了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2025-4-29 18:30:44 | 显示全部楼层
确认命令am能启动应用吗?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2025-12-6 01:19 , Processed in 0.085822 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表