提取应用 APK 与查看源代码 - Runner + apktool 逆向入门
Runner 能做什么
Runner 本身不提供反编译功能——它只是把 shell 命令送给系统执行。真正的反编译工作交给 apktool、jadx 等工具。Runner 的价值是让提取 APK 这一步不需要 root:
- shell 权限下就能读取
/data/app/目录 - 把 APK 从安装目录复制到
/sdcard/后,就能用电脑上的反编译工具处理
步骤一:找到 APK 路径
首先要找到目标 App 的安装位置和 APK 文件路径。
# 获取 App 安装路径
pm path com.example.app
# 返回类似: package:/data/app/com.example.app-abcxyz==/base.apk
# 或者用 dumpsys 查
dumpsys package com.example.app | grep "codePath"
# 返回: codePath=/data/app/com.example.app-abcxyz==
步骤二:提取 APK
从 pm path 输出里拿到的路径,把 APK 复制出来:
cp /data/app/com.example.app-abcxyz==/base.apk /sdcard/runner-extract/com-example-app.apk
或者用更简洁的方式:
cp $(pm path com.example.app | cut -d: -f2) /sdcard/runner-extract/
步骤三:用电脑反编译
把 /sdcard/runner-extract/ 里的 APK 传到电脑,用以下工具反编译:
| 工具 | 输出 | 用途 |
|---|---|---|
| jadx | Java 源代码 + resources | 看 Java/Kotlin 层代码,最常用 |
| apktool | smali + XML | 看 smali 汇编层,修改 APK 重打包 |
| aapt2 | 资源清单 | 查 AndroidManifest.xml、资源 ID |
jadx 推荐的命令行方式:
jadx -d output-folder base.apk
GUI 版直接拖 APK 进去就行。
实战:提取并分析一个 App
假设你想看看抖音 Android 版内部用了什么网络库:
- 用 Runner 执行:
pm path com.ss.android.ugc.aweme
cp /data/app/com.ss.android.ugc.aweme-*/base.apk /sdcard/runner-extract/douyin.apk
- 把
/sdcard/runner-extract/douyin.apk传到电脑 - 用 jadx 打开,搜索关键词
OkHttp、Retrofit、Volley等网络框架 - 找到网络请求的封装逻辑,了解 App 的通信层设计
shell 权限为什么能读 /data/app/
Android 的 /data/app/ 目录本身是 drwxrwx--x 权限——owner 是 system,group 是 system,其他用户没有读权限。但是:
- Shizuku 的 shell 进程是
uid=2000(shell) gid=2000(shell) - shell 用户属于 Android 的
shellgroup,被 SELinux 策略授予了访问/data/app/的权限
所以Runner 的 shell 权限足够读取 APK 文件,不需要 root。但如果 App 使用了更严格的 SELinux label(file_contexts),shell 可能读不到——这种情况一般是 App 本身做了额外保护。
局限性
- Runner 只能帮你提取 APK,反编译和分析工作必须在电脑上完成
- 部分 App(尤其是银行类、支付类)可能对 APK 目录做了额外加密或混淆,即使提取出来也是加密状态
pm path只能拿到主 APK(base.apk),如果 App 用了 split APK(动态特性模块),需要额外找split_config.*.apk文件