删除上传文件的 ADB 操作步骤
1. 确认文件存储路径
你的 WebServerService.java
使用 getFilesDir()
保存上传文件,路径为:
/data/user/0/com.test.web/files/
com.test.web
是你的应用包名(见AndroidManifest.xml
)。/data/user/0/
是用户 0 的数据目录(单用户设备默认)。files/
是getFilesDir()
对应的子目录。
注意:/data/
目录是受保护的,需要使用 run-as
或 root 权限访问。
2. 连接设备并启动 ADB
确保设备已连接到电脑,且 ADB 调试已启用。
-
检查设备连接:
adb devices
输出示例:
List of devices attached emulator-5554 device
如果未看到设备,确保:
- 设备 USB 调试已开启(设置 > 开发者选项 > USB 调试)。
- 安装了 ADB(Android SDK 工具或独立 ADB)。
-
启动 ADB shell:
adb shell
3. 使用 run-as
访问应用私有目录
由于文件在 /data/user/0/com.test.web/files/
,普通 shell 无权限访问。使用 run-as
以应用身份访问:
adb shell
run-as com.test.web
cd files
ls
run-as com.test.web
:以com.test.web
应用身份运行。cd files
:进入文件目录。ls
:列出上传的文件(例如test.txt
,image.jpg
)。
示例输出:
test.txt image.jpg
4. 删除指定文件
在 run-as
shell 中,使用 rm
命令删除文件:
rm test.txt
- 删除单个文件:
rm <filename>
(例如rm test.txt
)。 - 删除多个文件:
rm file1 file2
(例如rm test.txt image.jpg
)。 - 删除所有文件:
rm *
(谨慎使用,确保只删除需要的内容)。
验证删除:
ls
确认文件已移除。
5. 退出 shell
删除完成后,退出 run-as
和 ADB shell:
exit # 退出 run-as
exit # 退出 adb shell
如果 run-as
失败的解决方法
某些设备(尤其是 Android 10+ 或非 debug 构建)可能限制 run-as
,报错如 run-as: package not debuggable
。以下是替代方案:
方案 1:检查应用是否可调试
确保 AndroidManifest.xml
中的 application
标签启用调试:
<application
android:debuggable="true"
... >
- 默认情况下,开发版 APK (
debug
构建) 已启用android:debuggable
。 - 如果是
release
构建,需手动设置(不推荐生产环境)。 - 修改后重新安装应用:
adb install -r app-debug.apk
方案 2:使用 root 权限
如果设备已 root,可直接访问 /data/
:
adb shell
su
cd /data/user/0/com.test.web/files
ls
rm test.txt
su
:切换到 root 用户(需设备已 root)。- 直接操作文件,无需
run-as
。 - 注意:root 操作有风险,谨慎删除。
方案 3:通过应用内删除功能
如果 run-as
和 root 不可用,可在 WebServerService.java
添加删除文件端点(例如 /delete/<filename>
),通过 Web 界面删除。以下是实现代码:
修改 WebServerService.java
在 MyWebServer.serve
方法中添加 /delete/
处理:
// 在 serve 方法的 if-else 链中添加
else if (uri.startsWith("/delete/") && method == Method.GET) {
return handleFileDelete(uri);
}
添加 handleFileDelete
方法:
private Response handleFileDelete(String uri) {
try {
String fileName = uri.substring("/delete/".length());
File storageDir = getFilesDir();
File file = new File(storageDir, fileName);
if (file.exists()) {
if (file.delete()) {
Log.d(TAG, "File deleted: " + fileName);
return newFixedLengthResponse(Response.Status.OK, "text/plain", "File deleted: " + fileName);
} else {
Log.e(TAG, "Failed to delete file: " + fileName);
return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, "text/plain", "Failed to delete: " + fileName);
}
} else {
return newFixedLengthResponse(Response.Status.NOT_FOUND, "text/plain", "File not found: " + fileName);
}
} catch (Exception e) {
Log.e(TAG, "Error deleting file: " + e.getMessage());
return newFixedLengthResponse(Response.Status.INTERNAL_ERROR, "text/plain", "Delete failed: " + e.getMessage());
}
}
更新 assets/www/index.html
在文件列表页面(/files
)添加删除链接:
// 在 handleFileList 方法的 html.append 部分修改
html.append("<li><a href=\"/download/").append(file.getName()).append("\">")
.append(file.getName()).append("</a> ")
.append("<a href=\"/delete/").append(file.getName()).append("\">Delete</a></li>");
使用方法:
-
访问
http://<device-ip>:8080/files
,点击文件名旁的 “Delete” 链接。 -
浏览器返回 “File deleted: ”。
-
Logcat 确认:
WebServerService: File deleted: test.txt
方案 4:清除应用数据
如果只需清空所有上传文件,可清除应用数据(会删除 getFilesDir()
下的所有文件):
adb shell pm clear com.test.web
- 警告:这会重置应用所有数据(包括设置、缓存),仅在必要时使用。
其他注意事项
- 文件大小:
getFilesDir()
空间有限(通常几十 MB 到几 GB,视设备)。若上传大文件,检查剩余空间:adb shell df /data/user/0/com.test.web
- 安全性:当前上传/下载无认证,建议后续添加 HTTP Basic Authentication 保护
/delete/
端点。 - 批量删除:若需频繁删除,可在 Web 界面添加批量删除功能(复选框 + POST 请求)。
测试步骤
- 确认文件存在:
adb shell run-as com.test.web ls files
- 删除文件:
rm test.txt ls # 验证文件已删除
- 若使用 Web 删除:
- 更新
WebServerService.java
和index.html
。 - 访问
http://<device-ip>:8080/files
,点击 “Delete”。
- 更新
- 检查 Logcat:
adb logcat | grep WebServerService
如果遇到问题
如果无法删除文件,请提供:
- ADB 错误信息(例如
run-as
失败)。 - 设备信息:Android 版本、是否 root。
- 文件路径:确认是否在
/data/user/0/com.test.web/files/
。 - 应用类型:
debug
或release
构建。
我可以进一步调试或提供替代方案(例如更复杂的删除端点或 root 工具)。
总结
通过 ADB 使用 run-as com.test.web
访问 /data/user/0/com.test.web/files/
,以 rm
命令删除上传文件。若 run-as
不可用,可用 root 权限直接操作,或在 WebServerService.java
添加 /delete/<filename>
端点,通过 Web 界面删除。当前速度(10MB/s)已优化,功能正常。若需 HTTPS、认证、批量删除或 SIP/OnVIF 集成,请告诉我,我可以提供详细代码!