【Android 系统开发】使用 BAT 脚本高效自动化管理 /system/priv-app/ 系统应用(安装与卸载)

在 Android 系统级开发或定制 ROM 过程中,我们经常需要将编译好的 APK 部署到 /system/priv-app/ 目录下作为系统核心应用,或者彻底清理掉旧的系统应用。如果每次都手动敲 adb 指令,不仅效率低下,还容易遗漏权限设置或目录创建。

本文将分享两个非常实用的 Windows批处理(BAT)脚本,分别用于一键推送到系统应用目录 和彻底卸载清理系统应用。

一、 为什么不能直接 adb install?

在 Android 系统开发中,/system/priv-app/ 目录下的应用具有最高级别的系统特权(Privileged App)。将 APK 放入该目录需要满足以下条件才能正常工作:

  1. 正确的目录结构 :Android 5.0 之后,系统应用必须放在 /system/priv-app/应用名/应用名.apk 的独立文件夹内。

  2. 挂载写权限 :/system 分区默认只读,推送前需要 adb root 和 adb remount。

  3. 权限与属主 :推送后的 APK 必须赋予 644 权限(chmod 644),属主设为 system:system,否则开机后系统无法加载。

  4. 清除 /data 分区覆盖 :如果之前通过 adb install 安装过同名应用,数据会在 /data/app 中覆盖系统应用,必须先清理。

下面这两个脚本正是针对这些痛点设计的。

二、 脚本一:一键推送 APK 到 /system/priv-app/

1. 脚本功能与逻辑

  • 自动找包 :优先检测当前目录下的 release/ 文件夹,若没有则回退到当前脚本所在目录。

  • 环境准备 :自动获取 root 权限并重新挂载 /system 为可读写。

  • 冲突清理 :清理 /data 分区中的旧版本,避免覆盖生效。

  • 批量部署 :自动提取文件名创建同名文件夹,推送 APK 并修正文件权限(chmod 644 & chown system:system)。

  • 自动重启:部署完成后重启设备生效。

2. 完整代码(push_sys_app.bat)

DOS

复制代码
@echo off
setlocal enabledelayedexpansion

set "srcPath=%~dp0release"
set "destPath=%~dp0"

echo -------------------------------
echo Detecting APK source path...
set "apkSource=%srcPath%"
dir "%srcPath%\*.apk" >nul 2>nul
if errorlevel 1 (
    echo release dir not found, use current dir
    set "apkSource=%destPath%"
) else (
    echo Found APK files in release dir
)

set "tempFile=%temp%\push_apks.txt"
if exist "%tempFile%" del "%tempFile%"
if "%apkSource%"=="%srcPath%" (
    for %%f in ("%srcPath%\*.apk") do echo %%f >> "%tempFile%"
) else (
    for %%f in ("%destPath%\*.apk") do echo %%f >> "%tempFile%"
)

echo -------------------------------
echo Getting root and remount /system writable...
adb root
timeout /T 2 >nul
adb remount
if errorlevel 1 (
    echo [WARN] adb remount failed, verity may be enabled.
    echo        Run: adb disable-verity then reboot, then rerun.
    pause
    exit /b 1
)

:: 替换为您项目中的包名列表
for %%p in (com.xxx.xxx com.xxx.xxx ) do (
    echo Clean old /data version: %%p
    adb uninstall %%p >nul 2>nul
)

echo -------------------------------
echo Pushing each APK to /system/priv-app/^<APK filename^>/ ...
for /f "usebackq delims=" %%a in ("%tempFile%") do (
    set "name=%%~na"
    echo Push: %%~nxa  ->  /system/priv-app/!name!/
    adb shell "mkdir -p /system/priv-app/!name!"
    adb push "%%a" "/system/priv-app/!name!/!name!.apk"
    adb shell "chown system:system /system/priv-app/!name!/!name!.apk"
    adb shell "chmod 644 /system/priv-app/!name!/!name!.apk"
    echo -------------------------------
)
del "%tempFile%"

echo Install done, reboot to take effect...
adb reboot
echo After reboot verify: adb shell pm path com.wingderm.backstage (path should start with /system)
timeout /T 5 >nul
exit

三、 脚本二:一键彻底卸载/清理系统应用

1. 脚本功能与逻辑

彻底卸载一个系统应用并不能只靠 adb uninstall(那只会卸载 /data 下的更新包)。

该脚本的逻辑为:

  1. 通过 adb shell pm path <包名> 查询应用实际路径。

  2. 解析路径,确认其是否位于 priv-app 目录下。

  3. 动态提取对应的文件夹名称,直接 rm -rf 删掉系统目录中的应用包。

  4. 顺带执行 adb uninstall 清理掉 /data 下可能存在的残余数据。

2. 完整代码(uninstall_sys_app.bat)

DOS

复制代码
@echo off
setlocal enabledelayedexpansion

:: 在此处配置需要清理的包名列表(空格隔开)
set "APP_PKGS=com.xxx.xxx com.xxx.xxx "

echo Getting root and remount /system writable...
adb root
timeout /T 2 >nul
adb remount
if errorlevel 1 (
    echo [WARN] adb remount failed, verity may be enabled.
    echo        Run: adb disable-verity then reboot, then rerun.
    pause
    exit /b 1
)

for %%p in (%APP_PKGS%) do (
    echo Processing: %%p
    set "line="
    for /f "delims=" %%l in ('adb shell pm path %%p 2^>nul') do set "line=%%l"
    if defined line (
        set "line=!line:package:=!"
        echo    path: !line!
        echo !line! | findstr /C:"priv-app" >nul
        if !errorlevel!==0 (
            set "folder="
            for /f "tokens=3 delims=/" %%c in ("!line!") do set "folder=%%c"
            if defined folder (
                echo    delete /system/priv-app/!folder!
                adb shell "rm -rf /system/priv-app/!folder!"
            )
        )
        echo    uninstall /data overlay if any
        adb uninstall %%p >nul 2>nul
    ) else (
        echo    not installed, skip
    )
)

echo Reboot to take effect...
adb reboot
timeout /T 5 >nul
exit

四、 使用注意事项与踩坑指南

  1. adb remount 失败问题:

    • 如果提示 remount failed,通常是因为系统开启了 verity 校验。

    • 解决方法 :先在终端运行 adb disable-verity,然后 adb reboot 重启设备,之后即可正常运行脚本。

  2. 包名与文件名适配:

    • 在使用脚本二(卸载脚本)之前,请务必将 APP_PKGS 变量替换为您自己项目的实际包名。
  3. 验证是否成功:

    • 设备重启完成后,可以通过以下命令验证应用是否被成功安装为系统应用:

      Bash

      复制代码
      adb shell pm path <您的包名>
    • 如果返回路径类似于 /system/priv-app/...,说明已经成功挂载为系统特权应用!

总结

这两个脚本能够显著提升系统级 Android 应用的调试与发布效率,避免了繁琐的命令行手动输入。你可以将它们直接保存在项目工程根目录或构建输出目录下,双击即可一键完成部署或清理。

相关推荐
Coisinier5 小时前
docker命令管理镜像及容器
linux·运维·nginx·docker·容器·操作系统
应用市场6 小时前
离线小游戏做“每日挑战”:日期当随机种子,整局存成 JSON,再加一个“我不是机器人”
android·kotlin·游戏开发
fengkai45456 小时前
十三、Zabbix 监控
运维·服务器·zabbix·监控·网络设备
古法老登瞎折腾6 小时前
大数据智能运维实战(二):准备一个可复现的运维实验环境
java·大数据·运维·spring ai·mcp
数据中心的那点事儿6 小时前
艾特网能:GPU算力服务器冷却系统配套设计介绍
运维·服务器·gpu算力
一铭111996 小时前
海豹办公 1.9.15 跨端办公软件实践 文档兼容 Access 数据库与移动 WebView 排错
android·数据库·electron·开源软件·access
广州灵眸科技有限公司6 小时前
单芯片同时跑 Linux 与 RT-Thread:RV1126B的AMP异构方案完整拆解
linux·运维·服务器
xixiaoyunya7 小时前
把网站状态巡检自动化:从“每天手动刷一遍”到秒级无人值守
运维·自动化
有毒的教程7 小时前
Linux底层存储路由配置
linux·运维·网络
geats人山人海7 小时前
java 7异常
android·java·开发语言