原版 Hamibot 原生是否在 AndroidManifest 内置声明了 MANAGE_EXTERNAL_STORAGE(管理所有文件)权限?启动 / 下载脚本时会不会主动弹窗申请该权限?
如果二次打包修改包名 / 应用名(你们改成 WLmob_AI),是否会丢失权限声明、导致无法申请全量文件读写权限,进而不能写入 Android/data/com.mzgy.svji/files/scripts 目录?
当 App 仅拥有媒体存储权限、没有全部文件权限时,脚本市场下载脚本是否会写入失败,scripts 文件夹空白?有无适配方案?
当前设备脚本市场点安装,前端显示安装成功,但 Android/data/com.mzgy.svji/files/scripts 文件夹为空,读文件直接返回不存在,是不是权限缺失导致写入拦截?
回答
原版 Hamibot 的 AndroidManifest.xml 中未内置声明 MANAGE_EXTERNAL_STORAGE 权限。Hamibot 严格遵循 Android 分区存储规范,脚本默认下载并保存在应用私有目录,无需也不依赖“管理所有文件”权限。启动或下载脚本时不会主动弹窗申请该权限。
针对你提出的四个问题,具体解答如下:
1. 原版是否声明全量文件权限及弹窗申请?
未声明,也不会弹窗申请。Hamibot 的脚本存储完全基于应用私有沙盒目录,系统默认授予该目录的读写权限,不需要动态申请 MANAGE_EXTERNAL_STORAGE 或外部存储权限。
2. 二次打包修改包名/应用名是否会导致权限丢失或写入失败?
会引发路径错配,而非权限丢失。修改包名(如 com.mzgy.svji)属于非官方二次打包行为。如果打包过程中未全局替换代码中硬编码的包名引用、未同步更新资源路径配置,会导致下载模块计算出的写入路径与实际运行环境不一致。这会造成“前端提示安装成功,但文件未落到预期位置”的现象。官方不保证二次打包版本的存储逻辑兼容性。
3. 仅有媒体权限时脚本市场下载是否会失败?有无适配方案?
不会失败。脚本市场下载仅依赖应用私有存储,与媒体权限或全量文件权限完全无关。若出现文件夹空白,根本原因是存储路径获取逻辑错误或二次打包配置遗漏。
适配方案:
- 停止硬编码路径,全部改用 Android Context 动态获取。
- 确保
AndroidManifest.xml未错误配置android:requestLegacyExternalStorage等与目标 Android 版本冲突的属性。 - 脚本文件读写统一使用 Hamibot 内置的
files模块或context.getFilesDir()。
4. 前端显示安装成功但 Android/data/.../scripts 为空,是否为权限拦截?
不是权限拦截,而是目录认知偏差。Hamibot 脚本实际默认存储在应用内部私有目录 /data/data/<包名>/files/scripts,该目录受系统保护,普通文件管理器无法直接访问,也不位于外部存储的 Android/data/ 路径下。你在 Android/data/com.mzgy.svji/files/scripts 看不到文件是正常现象,因为脚本根本不会写入该位置。
排查与验证建议:
- 以 Hamibot 客户端「脚本管理」列表能否正常显示和运行为准,不要依赖第三方文件管理器查看外部目录。
- 在脚本开头添加以下代码,打印真实工作路径进行核对:
// 文档地址 https://docs.hamibot.com/
toastLog('当前工作目录: ' + files.cwd());
toastLog('内部私有目录: ' + context.getFilesDir().getAbsolutePath());
- 若需验证文件是否真实写入,可通过
adb shell run-as <包名> ls files/scripts查看,或直接在 Hamibot 脚本中使用files.listDir()读取。 - 建议优先使用官方原版 Hamibot 进行功能验证。非官方修改版因包名替换、签名变更或配置遗漏引发的存储异常不在官方支持范围内。
如有原版 Hamibot 的脚本开发或路径调用问题,可提供具体日志,我会为你进一步定位。