出厂前一次性授权

完成「第一次系统确认」后,就能让后续所有「无障碍开关」+「录屏弹窗」终身不再人工点第二次 ------核心就是「出厂前一次性授权」三件套:

  1. ADB 授予 WRITE_SECURE_SETTINGS
  2. ADB 授予 PROJECT_MEDIA(录屏无弹窗)
  3. 把 App 拉进电池白名单 + 自启动白名单(防系统杀)

下面给出「产线 → 首次开机 → 终身后台」完整脚本与代码,照抄即可落地。


一、产线末端(USB 调试模式)一次性烧录

bash 复制代码
# 1. 让 App 拥有"写系统设置"权限(终身有效,恢复出厂才丢)--部分有效
adb shell pm grant 你的包名 android.permission.WRITE_SECURE_SETTINGS

# 2. 让 App 拥有"后台录屏"权限(终身有效,不再弹窗)--有效
adb shell appops set 你的包名 PROJECT_MEDIA allow

# 3. 电池优化白名单(防止省电杀后台)--有效
adb shell dumpsys deviceidle whitelist +你的包名

# 4. 可选:允许自启动(小米/华/OPPO 等)--部分有效
adb shell pm grant 你的包名 android.permission.RECEIVE_BOOT_COMPLETED

烧完即可关闭 USB 调试,设备发给用户。


二、首次开机代码(自动写回无障碍 + 后台录屏)

  1. 插件 APK(系统 priv-app 最佳,普通 APK 亦可)
kotlin 复制代码
// 在 Application.onCreate 里
if (!A11yUtil.isGranted(this)) {
    // 利用 WRITE_SECURE_SETTINGS 直接写系统字段
    A11yUtil.openService(this)          // 无障碍立即生效
}

// 录屏:不再 startActivityForResult,而是伪造已同意 Intent
val mgr = getSystemService(MEDIA_PROJECTION_SERVICE) as MediaProjectionManager
val fakeData = Intent().putExtra(EXTRA_RESULT_CODE, RESULT_OK)
val projection = mgr.getMediaProjection(RESULT_OK, fakeData) // 无弹窗
  1. A11yUtil 工具(通用)
kotlin 复制代码
object A11yUtil {
    fun isGranted(ctx: Context): Boolean {
        val am = ctx.getSystemService(Context.ACCESSIBILITY_SERVICE) as AccessibilityManager
        return am.getEnabledAccessibilityServiceList(AccessibilityServiceInfo.FEEDBACK_ALL_MASK)
            .any { it.id == "${ctx.packageName}/.PluginService" }
    }

    fun openService(ctx: Context): Boolean {
        if (isGranted(ctx)) return true
        val svc = "${ctx.packageName}/.PluginService"
        val old = Settings.Secure.getString(ctx.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES) ?: ""
        val newVal = "$old:$svc".replaceFirst(":", "")
        Settings.Secure.putString(ctx.contentResolver, Settings.Secure.ENABLED_ACCESSIBILITY_SERVICES, newVal)
        Settings.Secure.putInt(ctx.contentResolver, Settings.Secure.ACCESSIBILITY_ENABLED, 1)
        return isGranted(ctx)
    }
}

三、后续生命周期(升级 / 重启 / 后台被杀)

  • 升级:签名一致 → 系统保留 WRITE_SECURE_SETTINGSPROJECT_MEDIA0 次交互
  • 重启:BootReceiver 里再次 A11yUtil.openService() → 1 秒内恢复;
  • 后台被杀:服务 onUnbind() 里自恢复 → 用户无感知。

四、结果对照表

场景 无障碍开关 录屏弹窗 人工操作
首次安装(已预授权) ❌ 自动 ❌ 自动 0 次
版本升级 ❌ 自动 ❌ 自动 0 次
恢复出厂设置 ✅ 需重新烧录ADB ✅ 需重新烧录ADB 1 次(产线)

五、一句话总结

只要「出厂前」完成 ADB 三行命令 ,后续所有「无障碍开启」「录屏允许」都可代码自动完成,用户侧终身 0 次确认

这是目前 无 root、无系统签名 条件下,唯一能彻底消灭人工点击 的合法方案 。

相关推荐
g105655913943 分钟前
LAMP博客平台Wordpress实战
android·mysql·nginx·php
hunterandroid2 小时前
[Android 从零到一] Compose LazyColumn 性能优化:key、稳定性与重组治理
android·前端
pengyu2 小时前
【Kotlin 协程修仙录 · 元婴境 · 中阶】 | 操作符真解:Flow 中间操作符与数据流变幻术
android·kotlin
pengyu3 小时前
【Kotlin 协程修仙录 · 元婴境 · 初阶】 | 冷流初啼:Flow 的基础与响应式编程的入门
android·kotlin
wawo003 小时前
Kuikly实践-从Android compose迁移到kuikly compose
android
Carson带你学Android5 小时前
Android 版 MCP 正式登场:AppFunctions
android·ai编程·jetbrains
古法安卓8 小时前
Android-Direct Boot 阶段与 getFilesDir() 路径变更问题深度分析
android·java·android studio
阿巴斯甜8 小时前
Android Studio Detekt 使用
android
杉氧9 小时前
Flutter 跨平台多端适配与 Android/iOS 一键自动化打包发布
android·前端·flutter
Super 含9 小时前
Android 包体积优化(一):APK 到底大在哪里?从 APK 结构到体积分析
android·ide·vscode