Files
workphone-sdk/sdk/scripts/clean_aochuang_device.sh

253 lines
7.1 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env bash
# 奥创工作手机 · 真机清机(保留机擎 com.system.cloudservice + Magisk/Frida 基建)
# 真源 Skill机擎/阿服/奥创真机清机/SKILL.md
# 用法:
# bash sdk/scripts/clean_aochuang_device.sh [--dry-run|--apply] [-s SERIAL] [--deep]
# 默认 --dry-run真清须显式 --apply
set -euo pipefail
SERIAL=""
MODE="dry-run"
DEEP=0
EVIDENCE_DIR=""
DEFAULT_SERIAL="xgfe65eimrrofyws"
# 奥创/S2 手机端包(资料真源:奥创微信控制接口与插件提取复用指南.md
AOCHUANG_PACKAGES=(
"org.xeslciw.manager" # XESlciw Manager v1.8.4
"top.zzz.vivwxjz" # VivWxjz 微信 Hook
"uni.UNI9421F6C" # AI数智员工 / 007 业务入口
)
# 可能关联(--deep 才卸)
AOCHUANG_OPTIONAL_PACKAGES=(
"io.github.vvb2060.mahoshojo" # 魔法少女(资料提及同链路工具)
)
KEEP_PACKAGES=(
"com.system.cloudservice" # 机擎 Agent禁止卸
"com.tencent.mm" # 微信(默认保留数据)
)
# 框架/寄生目录(须 root
AOCHUANG_ROOT_PATHS=(
"/data/adb/xesd"
"/data/adb/modules/xeslciw"
"/data/adb/modules/XESlciw"
"/data/adb/modules/grvjfe"
"/data/adb/modules/vivwxjz"
)
# 常见残留 app 分区路径(资料:奥创工作手机-复刻开发详解.md §APK路径
AOCHUANG_APP_DIRS=(
"/data/app/manager_sign"
"/data/app/VivWxjz"
"/data/app/~~*org.xeslciw.manager*"
"/data/app/~~*top.zzz.vivwxjz*"
"/data/app/~~*uni.UNI9421F6C*"
)
usage() {
cat <<'EOF'
奥创真机清机 — clean_aochuang_device.sh
bash sdk/scripts/clean_aochuang_device.sh [选项]
选项:
--dry-run 仅扫描+打印将执行的操作(默认)
--apply 实际清理(须 ADB device + 建议 Root
-s SERIAL 设备序列号(默认唯一在线设备或 xgfe65eimrrofyws
--deep 额外卸 mahoshojo + 清 007 业务 app 数据目录
--evidence DIR 留痕目录(默认 开发文档/8、部署/05-测试验收/YYYYMMDD_奥创清机_<serial>/
保留永不卸com.system.cloudservice、Magisk、机擎 Frida 基建
EOF
}
log() { printf '[%s] %s\n' "$(date '+%H:%M:%S')" "$*"; }
run_adb() { adb -s "$SERIAL" "$@"; }
run_sh() { run_adb shell "$@"; }
pick_su() {
run_sh 'for p in /sbin/su /system/bin/su /system/xbin/su su; do
if [ -x "$p" ] 2>/dev/null || command -v "$p" >/dev/null 2>&1; then echo "$p"; exit 0; fi
done; exit 1' 2>/dev/null || true
}
run_root() {
local cmd="$1"
local su
su="$(pick_su)"
if [[ -z "$su" ]]; then
log "WARN: 无 su跳过 root 操作: $cmd"
return 1
fi
if [[ "$MODE" == "dry-run" ]]; then
log "DRY su -c $(printf '%q' "$cmd")"
return 0
fi
run_sh "$su -c $(printf '%q' "$cmd")" || return 1
}
pkg_installed() {
local pkg="$1"
run_sh pm path "$pkg" 2>/dev/null | grep -q .
}
do_uninstall_pkg() {
local pkg="$1"
if ! pkg_installed "$pkg"; then
log "SKIP 未安装: $pkg"
return 0
fi
if [[ "$MODE" == "dry-run" ]]; then
log "DRY pm uninstall --user 0 $pkg"
log "DRY pm uninstall $pkg"
return 0
fi
log "卸载: $pkg"
run_sh pm disable-user --user 0 "$pkg" 2>/dev/null || true
run_sh am force-stop "$pkg" 2>/dev/null || true
run_sh pm uninstall --user 0 "$pkg" 2>/dev/null || run_sh pm uninstall "$pkg" 2>/dev/null || log "WARN 卸载失败: $pkg"
}
clear_pkg_data() {
local pkg="$1"
if [[ "$MODE" == "dry-run" ]]; then
log "DRY pm clear $pkg"
return 0
fi
run_sh pm clear "$pkg" 2>/dev/null || true
}
remove_root_path() {
local p="$1"
if [[ "$MODE" == "dry-run" ]]; then
log "DRY rm -rf $p"
return 0
fi
run_root "rm -rf $(printf '%q' "$p")" || true
}
scan_magisk_modules() {
log "== Magisk 模块扫描(名称含 xes/grvjfe/vivwx/lsposed 且非机擎) =="
run_root 'ls -1 /data/adb/modules 2>/dev/null' | while read -r m; do
[[ -z "$m" ]] && continue
if echo "$m" | grep -qiE 'xes|grvjfe|vivwx|lsposed|edxposed|xposed'; then
if echo "$m" | grep -qiE 'shamiko|zygisk|rezygisk|riru'; then
log "KEEP Magisk模块(机擎基建): $m"
else
if [[ "$MODE" == "dry-run" ]]; then
log "DRY 将禁用并移除模块: $m"
else
log "移除 Magisk 模块: $m"
run_root "touch /data/adb/modules/$m/disable" || true
run_root "rm -rf /data/adb/modules/$m" || true
fi
fi
fi
done || true
}
write_evidence() {
[[ -z "$EVIDENCE_DIR" ]] && return 0
mkdir -p "$EVIDENCE_DIR"
{
echo "# 奥创清机留痕 $(date '+%Y-%m-%d %H:%M:%S')"
echo "serial=$SERIAL mode=$MODE deep=$DEEP"
echo ""
echo "## pm list packages (filter)"
run_sh pm list packages 2>/dev/null | grep -iE 'xes|zzz|vivwx|UNI9421|mahoshojo|cloudservice' || true
echo ""
echo "## xesd"
run_sh "ls -la /data/adb/xesd/ 2>/dev/null || echo NO_XESD" || true
} >"$EVIDENCE_DIR/clean_report.txt"
log "留痕: $EVIDENCE_DIR/clean_report.txt"
}
while [[ $# -gt 0 ]]; do
case "$1" in
--apply) MODE="apply" ;;
--dry-run) MODE="dry-run" ;;
-s) SERIAL="${2:-}"; shift ;;
--deep) DEEP=1 ;;
--evidence) EVIDENCE_DIR="${2:-}"; shift ;;
-h|--help) usage; exit 0 ;;
*) echo "未知参数: $1"; usage; exit 1 ;;
esac
shift
done
if [[ -z "$SERIAL" ]]; then
SERIAL="$(adb devices 2>/dev/null | awk 'NR>1 && $2=="device" {print $1; exit}')"
[[ -z "$SERIAL" ]] && SERIAL="$DEFAULT_SERIAL"
fi
if ! adb devices 2>/dev/null | awk -v s="$SERIAL" '$1==s && $2=="device" {found=1} END{exit !found}'; then
echo "FAIL: 设备 $SERIAL 未在线adb devices 无 device"
exit 1
fi
if [[ -z "$EVIDENCE_DIR" ]]; then
EVIDENCE_DIR="$(cd "$(dirname "$0")/../.." && pwd)/开发文档/8、部署/05-测试验收/$(date '+%Y%m%d')_奥创清机_${SERIAL}"
fi
log "== 奥创真机清机 mode=$MODE serial=$SERIAL deep=$DEEP =="
for k in "${KEEP_PACKAGES[@]}"; do
if pkg_installed "$k"; then
log "KEEP 保留: $k"
fi
done
log "== 1/6 停止并卸载奥创 APK =="
for pkg in "${AOCHUANG_PACKAGES[@]}"; do
do_uninstall_pkg "$pkg"
done
if [[ "$DEEP" == "1" ]]; then
for pkg in "${AOCHUANG_OPTIONAL_PACKAGES[@]}"; do
do_uninstall_pkg "$pkg"
done
fi
log "== 2/6 清理 app 数据(已卸包) =="
for pkg in "${AOCHUANG_PACKAGES[@]}"; do
clear_pkg_data "$pkg"
done
log "== 3/6 移除框架目录 /data/adb/xesd 等 =="
for p in "${AOCHUANG_ROOT_PATHS[@]}"; do
remove_root_path "$p"
done
log "== 4/6 Magisk 奥创相关模块 =="
scan_magisk_modules
log "== 5/6 残留分区路径 =="
for p in "${AOCHUANG_APP_DIRS[@]}"; do
if [[ "$p" == *'*'* ]]; then
if [[ "$MODE" == "dry-run" ]]; then
log "DRY rm -rf $p"
else
run_root "rm -rf $p" 2>/dev/null || true
fi
else
remove_root_path "$p"
fi
done
log "== 6/6 重启提示 =="
if [[ "$MODE" == "apply" ]]; then
log "建议: adb -s $SERIAL rebootMagisk 模块变更后)"
fi
write_evidence
if [[ "$MODE" == "dry-run" ]]; then
log "完成dry-run。真清请: bash sdk/scripts/clean_aochuang_device.sh --apply -s $SERIAL"
log "验收: bash sdk/scripts/verify_aochuang_clean.sh -s $SERIAL"
else
log "完成apply。请跑验收脚本确认全绿。"
fi