蓝易云:Ubuntu 上导出 APP 的 base.apk 方法说明(含 Split 场景)
先把底层逻辑讲清:很多新应用是 Split APK(拆分包),pm path可能返回多条 APK 路径;其中.../base.apk才是你要的“基础包”。(NickstaDB)
合规提醒:仅建议用于你自有/已授权的应用备份与测试,别把它当“搬运工具”。🙂
原理解释表(快速选路)✅
| 场景 | 你能拿到什么 | 推荐动作 |
|---|---|---|
| 普通单 APK | 只有 1 条路径 | 直接pm path→adb pull(Stack Overflow) |
| Split APK(多条路径) | base + 多个 split | 先拉 base.apk,需要完整备份就全部拉走 (NickstaDB) |
| 系统/预装应用 | 路径可能在/system/... | 同样用pm path定位再拉 |
方案一:Ubuntu + ADB 导出(最稳的“交付级”方案)🔧
1)安装 ADB 工具链
sudo apt update sudo apt install -y android-tools-adb android-tools-fastboot adb version解释:
apt update:刷新软件索引,避免装到旧依赖。android-tools-adb:Ubuntu 常用的 ADB 包来源之一。(GeeksforGeeks)adb version:确认 ADB 可用,减少“后面步骤全白跑”。
2)连接手机并确认授权
adb devices解释:
该命令用于确认设备已被识别与授权;ADB 是与设备通信的命令行桥梁。(Android Developers)
若看到
unauthorized:手机端会弹授权框,需要点允许(否则无法导出)。
3)定位 包名
adb shell pm list packages | grep -i your_keyword解释:
pm list packages:列出已安装应用包名;grep用于快速筛选。得到包名后,后续所有动作都以它为“主键”。
4)拿到 APK 路径(关键一步:pm path)
adb shell pm path com.example.app解释:
pm path PACKAGE:输出该包对应的.apk路径(会以package:开头)。(sleticalboy)输出可能类似
package:/data/app/.../base.apk。(Stack Overflow)
5)只导出 base.apk
APK_PATH="$(adb shell pm path com.example.app | tr -d '\r' | sed 's/package://g' | grep -m1 'base\.apk$')" adb pull "$APK_PATH" ./base.apk解释:
第一行:把
pm path输出清洗成真实文件路径,并精准抓取以base.apk结尾的那条(避免 Split 场景抓错)。adb pull:把设备端文件拉到 Ubuntu 当前目录,命名为base.apk。(Stack Overflow)
方案二:Split APK “全量备份”(需要时再上)📦
你如果要“完整可还原”,通常要把 base + 所有 split 一起导出。
adb shell pm path com.example.app | tr -d '\r' | sed 's/package://g' | while read -r p; do adb pull "$p" ./apks/ done解释:
Split 应用会返回多条路径;循环逐个
pull,避免漏文件。(NickstaDB)./apks/:建议单独目录存放,方便归档与审计(别把目录当垃圾桶)。😄
工作流程图(vditor Mermaid)🧠
flowchart TD A[Ubuntu 安装 ADB] --> B[adb devices 确认识别/授权] B --> C[pm list packages 找包名] C --> D[pm path 输出 APK 路径] D --> E{是否多条路径?} E -->|否| F[adb pull 导出单 APK] E -->|是| G[grep base.apk 导出 base] G --> H[可选:循环 pull 全部 split]如果你把adb shell pm path 包名的输出贴出来(打码隐私字段即可),我可以直接告诉你:该应用是单包还是 Split,以及最省事的导出命令该怎么写。