在 Android 系统级开发或定制 ROM 过程中,我们经常需要将编译好的 APK 部署到 /system/priv-app/ 目录下作为系统核心应用,或者彻底清理掉旧的系统应用。如果每次都手动敲 adb 指令,不仅效率低下,还容易遗漏权限设置或目录创建。
本文将分享两个非常实用的 Windows批处理(BAT)脚本,分别用于一键推送到系统应用目录 和彻底卸载清理系统应用。
一、 为什么不能直接 adb install?
在 Android 系统开发中,/system/priv-app/ 目录下的应用具有最高级别的系统特权(Privileged App)。将 APK 放入该目录需要满足以下条件才能正常工作:
-
正确的目录结构 :Android 5.0 之后,系统应用必须放在
/system/priv-app/应用名/应用名.apk的独立文件夹内。 -
挂载写权限 :
/system分区默认只读,推送前需要adb root和adb remount。 -
权限与属主 :推送后的 APK 必须赋予
644权限(chmod 644),属主设为system:system,否则开机后系统无法加载。 -
清除
/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 下的更新包)。
该脚本的逻辑为:
-
通过
adb shell pm path <包名>查询应用实际路径。 -
解析路径,确认其是否位于
priv-app目录下。 -
动态提取对应的文件夹名称,直接
rm -rf删掉系统目录中的应用包。 -
顺带执行
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
四、 使用注意事项与踩坑指南
-
adb remount失败问题:-
如果提示
remount failed,通常是因为系统开启了 verity 校验。 -
解决方法 :先在终端运行
adb disable-verity,然后adb reboot重启设备,之后即可正常运行脚本。
-
-
包名与文件名适配:
- 在使用脚本二(卸载脚本)之前,请务必将
APP_PKGS变量替换为您自己项目的实际包名。
- 在使用脚本二(卸载脚本)之前,请务必将
-
验证是否成功:
-
设备重启完成后,可以通过以下命令验证应用是否被成功安装为系统应用:
Bash
adb shell pm path <您的包名> -
如果返回路径类似于
/system/priv-app/...,说明已经成功挂载为系统特权应用!
-
总结
这两个脚本能够显著提升系统级 Android 应用的调试与发布效率,避免了繁琐的命令行手动输入。你可以将它们直接保存在项目工程根目录或构建输出目录下,双击即可一键完成部署或清理。