在抖音、小红书或小黑盒的可见视频/图片上原地长按,拖入右侧“保存”区即可保存当前画面。作品标题/正文或评论文字可拖到“复制”,也可拖到“存图”生成白底黑字图片;评论配图拖到“保存”。
这是 Root + Zygisk/Vector 模块方案。它优先在目标 App 进程内部读取真正的 TextureView / ImageView / SurfaceView;播放器 Surface 没有可读 Buffer 时,才由 Super Drag 自己的 root 桥截取合成画面、临时隐藏上层 UI 并按播放器区域裁剪。
长按内容 → 取消原生长按 → 识别作品文案/视频帧/主图/评论文字/评论图片 → 显示右侧操作区 → 同指拖入并松手 → 保存、复制或生成文字图片
| 环节 | 实现 |
|---|---|
| 注入 | libxposed API 102;作用域为抖音、小红书、小黑盒三个包 |
| 手势 | Hook Activity.dispatchTouchEvent;小红书静止 300 ms、其余 400 ms 触发,移动超过 slop 则取消 |
| 作品文案 | 识别抖音正文、小红书标题/正文、小黑盒标题/正文,可复制或保存为白底黑字图片 |
| 评论文字 | 按各 App 的评论列表/正文结构识别,可复制或保存为白底黑字图片 |
| 评论图片 | 识别评论列表内的大图/表情,过滤小头像,直接读取 Drawable 后保存 |
| 取帧 | TextureView.getBitmap() / ImageView.Drawable / SurfaceView + PixelCopy;失败时 root 屏幕取帧 |
| 去 UI | 直接取渲染层;root 回退时隐藏目标路径外的同级 View 两帧,再裁成 SurfaceView 区域 |
| 拖放 | 向 DecorView 临时加入右侧保存区并调用 startDragAndDrop() |
| 保存 | Pictures/SuperDrag/SuperDrag_yyyyMMdd_HHmmss.jpg,JPEG 质量 95 |
| root 隔离 | Magisk 只授权 com.superdrag.app;目标 App 本体不获得 root,截图 Provider 只接受模块和白名单目标包 UID |
- MuMu 模拟器 1:Android 12 / API 32,x86_64 + ARM Native Bridge,1080×1920
- Root:Kitsune Mask 31 system mode(MuMu 内置 Root 关闭)
- 框架:NeoZygisk 2.3 + Vector 2.2 / libxposed API 102
- 抖音:官网 APK 40.1.0,包名
com.ss.android.ugc.aweme - 小红书:9.43.1,包名
com.xingin.xhs - 小黑盒:1.3.393,包名
com.max.xiaoheihe
要求:JDK 17+、Android SDK platform 34+。
git clone https://github.com/cakeni/super-drag.git
cd super-drag
.\gradlew.bat :app:assembleDebug
adb install -r .\app\build\outputs\apk\debug\app-debug.apk在 Vector 中启用模块,并把作用域设为三个目标 App 的用户 0:
su -c /data/adb/modules/zygisk_vector/cli modules enable com.superdrag.app
su -c /data/adb/modules/zygisk_vector/cli scope set com.superdrag.app com.ss.android.ugc.aweme/0 com.xingin.xhs/0 com.max.xiaoheihe/0随后强制停止并重新打开目标 App。检查日志:
su -c /data/adb/modules/zygisk_vector/cli log cat
adb logcat -s SuperDrag应能看到:
loaded into process: com.ss.android.ugc.aweme, api=102
hooking com.ss.android.ugc.aweme (longPress=400ms)
首次使用先打开 Super Drag → SurfaceView 视频页 → 授权/测试 root 取帧,在 Magisk 中只允许 Super Drag。公开取帧路径不需要调用 su,这一步是为部分 Surface 播放器的回退路径预授权。
- TextureView:静止长按后同指拖入保存区并落盘
- SurfaceView + PixelCopy:同指拖放并落盘
- 两类保存图均不含实验页上层按钮/文字
- SurfaceView root 回退:保存 720×1509,实验页顶部提示和底部按钮均未入图
- 拖到保存区外不会误保存
- Android 15 冷启动后
su、Zygisk、Vector 自动工作 - 抖音 40.1.0 在 x86_64 AVD 上通过 ARM 转译启动
- Vector 在抖音主进程和子进程加载模块;主进程完成 hook
- 抖音真实视频暂停后同指拖放:命中
ImageView帧并保存 828×1472;顶部频道、右侧按钮、文案和底栏均未入图 - 抖音作品文案:推荐流
desc与详情页tv_desc均可拖入“复制” - 抖音真实评论文字:拖入“复制”后粘贴验证内容完整
- 抖音真实评论配图:命中 217×291 附件并独立保存,未混入头像或评论 UI
- 评论头像、日期和空白区域不穿透到底层视频
- 小红书:视频暂停帧 1080×1920、图文主图 1200×1600、评论文字及 210×280 评论配图均完成保存/复制闭环
- 小红书作品文案:视频正文及图文标题/正文均可拖入“复制”
- 小红书原生视频/图文长按菜单已被接管;评论 BottomSheet 的原生长按直接重定向到超级拖放
- 小黑盒:图文主图 662×1440、视频暂停帧 1080×607、主评论文字及 216×216 评论配图均完成保存/复制闭环
- 小黑盒作品文案:推荐流与详情页标题/正文均可拖入“复制”
- 文字存图:文字面板同时提供“复制/存图”,小黑盒真实正文已生成 1080×604 白底黑字 JPEG 并落盘
- 抖音页面实际命中
SurfaceView时的 root 回退仍需逐页面人工验证;自动实验页已通过 - HyperOS Root 真机验证
- 不 Root 时,第三方 App 不能跨进程 Hook 目标 App、读取其播放器
Surface,也不能强迫它主动提供ClipData;只能退化成无障碍 + 屏幕截图,因此通常会包含 UI,达不到本项目的“干净帧 + 同指拖放”。 - 小米/Android 的标准拖放 API 只解决应用自己发起拖拽的情况,不能让外部普通 App 给未适配的内容 App 补上这个交互。
- 此原型不绕过下载限制、DRM 或隐私同意;仅处理用户设备当前可正常显示的画面。请只保存你有权保存的内容。
- 文字图片最多排版 60 行,超出部分以省略号结束,避免超长文本生成过大的 Bitmap。
- 若页面不使用标准
TextureView、SurfaceView或ImageView,日志会显示no render view found,届时需要针对该播放器页面单独适配。 - ARM64 App 通过 Native Bridge 跑在 x86_64 模拟器上时,第三方原生库仍可能偶发崩溃/ANR;这是模拟器转译边界,不是拖放手势本身。真机应使用与设备 ABI 匹配的版本。