【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 rootadb 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 应用的调试与发布效率,避免了繁琐的命令行手动输入。你可以将它们直接保存在项目工程根目录或构建输出目录下,双击即可一键完成部署或清理。

相关推荐
RD_daoyi1 小时前
外链权重暴跌至13%,品牌提及反超传统链接——2026年不做Digital PR,你的独立站等于隐形
运维·网络·学习·机器学习·搜索引擎
电商API_180079052471 小时前
企业ERP进销存场景|京东商品详情接口自动同步方案|凭证鉴权批量调用技术实操
大数据·运维·人工智能·爬虫·数据挖掘·网络爬虫
张小姐的猫2 小时前
【Linux】网络编程 —— HTTP协议(上)
linux·运维·服务器·网络·http·单例模式·策略模式
xexpertS2 小时前
分布式系统过载治理:如何通过较小服务控制请求节奏
微服务·自动化
小稻穗2 小时前
市场调研样本选型坐标系:2026六家国内样本平台能力横向校验
大数据·运维·数据分析
用户69371750013842 小时前
Claude Code终端日志Token占用实测:一个过滤器砍掉60%-90%
android·前端·后端
AOwhisky2 小时前
Python 学习笔记(第十三期)——运维自动化(下·前篇):远程命令执行——paramiko基础篇
运维·python·学习·云原生·自动化·运维开发·paramiko
蝉蜕日记2 小时前
AccumuPDF高级版 v2.57 | 视图文转换PDF,合并分割压缩
android·智能手机·pdf·生活·软件需求
吐了啊取名字太难3 小时前
美颜系统AI修图本地跑并支持Mac、win、安卓、iOS不卡顿
android·人工智能·windows·数码相机·mac·ai编程