如何验证App预置为特权App功能正常?

0 阅读4分钟

看到 build completed successfully 且产物已经输出到了 out/target/product/qssi/system/priv-app/RemoteControl/RemoteControl.apk

下面为您提供一套免刷全量镜像快速调试以及烧录后完整验证的标准流程,帮助您一步步验证:

  1. 是否真正以“系统特权应用”身份被系统识别
  2. 开机自启、保活、特权权限、双目视频分屏等核心功能是否正常

一、 快速推送验证

如果你手头有开机可连 ADB 的工程样机,并且是 userdebug 版本,可以通过 adb remount 直接把刚才编译出来的产物推送到手机上测试,无需等待漫长的整机烧录。

1. 推送 APK 和 权限白名单

在你的 Linux 编译服务器终端执行:

# 1. 获取 root 并重新挂载 system 分区为可读写
adb root
adb remount

# 2. 推送特权 APK
adb shell mkdir -p /system/priv-app/RemoteControl
adb push out/target/product/qssi/system/priv-app/RemoteControl/RemoteControl.apk /system/priv-app/RemoteControl/

# 3. 核心:推送权限白名单 XML
adb push out/target/product/qssi/system/etc/permissions/privapp-permissions-remote.xml /system/etc/permissions/

# 4. 修复文件权限(防止开机读不到)
adb shell chmod 644 /system/priv-app/RemoteControl/RemoteControl.apk
adb shell chmod 644 /system/etc/permissions/privapp-permissions-remote.xml

# 5. 重启设备生效
adb reboot

二、 核心验证 1:验证是否具备“特权系统 APP”身份

设备重启完成后,执行以下 ADB 命令检查系统识别状态:

1. 验证安装路径是否为系统特权路径

adb shell pm path com.xxxx.robot
  • 预期输出
    package:/system/priv-app/RemoteControl/RemoteControl.apk
    
    (如果显示的是 /data/app/... 说明还是普通第三方安装,必须显示 /system/priv-app/... 才代表是预置特权)

2. 验证特权标志位(PRIVILEGED

adb shell dumpsys package com.xxxx.robot | grep -E "flags=|privFlags="
  • 预期输出中必须同时包含:
    • FLAG_SYSTEM
    • PRIVATE_FLAG_PRIVILEGED

3. 验证特权白名单是否加载无报错

adb logcat -d -s PackageManager | grep -i "Privileged permission"
  • 预期输出:返回为空(没有任何 warning 或 error),说明申请的 BATTERY_STATSDELETE_PACKAGESWRITE_SECURE_SETTINGS 等特权权限已被系统白名单完全放行。

三、 核心验证 2:验证开机自启与置顶能力

我们之前在 RootWindowContainer.java 修改了系统级拉起逻辑,并且在 App 中设置了 persistent="true"

1. 验证开机自动启动时延

  1. 执行 adb reboot 重启设备。
  2. 观察设备屏幕:开机动画一结束,具微遥控 APP(MainActivity)应直接呈现在最前台
  3. 通过抓取启动日志确认耗时:
    adb logcat -d | grep -E "ATMS_Kiosk|Displayed com.xxxx.robot"
    
    • 会看到系统打印 Kiosk: Auto-started RemoteControlApp on top of Launcher,耗时通常在开机完成后 200ms~500ms 内呈现。

2. 验证退回原生桌面与再进入

  1. 在具微遥控 APP 界面按 Home 键 或执行底部上滑手势
    • 预期效果:应能正常平滑退回到 Android 原生桌面(Launcher3),不会被锁死或强行弹回
  2. 点击原生桌面上的具微遥控图标:
    • 预期效果:秒级切回遥控主操作台。

四、 核心验证 3:验证常驻保活与防杀死(Persistent 机制)

因为在 AndroidManifest.xml 中配置了 android:persistent="true",系统内核赋予了最高保活级别。

1. 查看进程 OOM 优先级

adb shell ps -ef | grep com.micbotics.robot

记下该进程的 PID(假设是 2345),然后查看它的 oom_score_adj

adb shell cat /proc/2345/oom_score_adj
  • 预期输出:一个很小的负数(通常是 -800-700)。
  • 说明系统已将其标记为核心系统常驻进程,无论是打开大型游戏还是内存爆满,LowMemoryKiller 绝对不会杀死它

2. 模拟异常崩溃自动复活

尝试强行杀死该进程:

adb shell kill -9 2345
  • 预期效果:观察 ps -ef,系统 ActivityManagerService 会在 1 秒内自动重新 fork 出新的进程 并恢复运行。

五、 核心验证 4:业务功能验证(双目分屏与全盘文件访问)

1. 验证所有文件访问权限(MANAGE_EXTERNAL_STORAGE

检查 App 是否无需弹窗直接拥有文件管理能力:

adb shell appops get com.micbotics.robot MANAGE_EXTERNAL_STORAGE
  • 预期输出Uid mode: MANAGE_EXTERNAL_STORAGE: allow

2. 验证双目摄像头视频硬解渲染性能

连接机器狗图传,进入双目分屏界面:

  1. 观察两个 SurfaceView(主视/副视)是否能同时流畅出流。
  2. 通过 GPU / SurfaceFlinger 监控是否存在丢帧或中间合成延迟:
    adb shell dumpsys SurfaceFlinger --latency com.micbotics.robot/com.micbotics.robot.activity.MainActivity
    
  3. 检查是否有硬件解码通道报错:
    adb logcat -s CCodec MediaCodec
    
    • 确认双路均走的是硬件解码器(如 c2.qti.avc.decoder / OMX.qcom.video.decoder.avc),无卡顿与显存溢出。

按照上述步骤全部跑通,即可证明您的特权 APP 预置与系统定制完全成功,达到出厂交付标准!