能否将Android存储目录纳入Gradle Source Sets?Chaquopy开发疑问
问题核心分析
Gradle的sourceSets是构建阶段用来指定开发机器上项目源码/资源目录的配置,它完全不涉及Android设备运行时的内部存储路径——你配置的设备绝对路径,Gradle会当成开发机本地路径去创建空目录,自然没法访问设备存储里的用户文件,这方向从一开始就错了。
正确解决方案:运行时动态添加Python路径
Chaquopy支持在应用运行时,把设备存储目录添加到Python的sys.path中,这样解释器就能识别并加载该目录下的.py文件。具体分场景处理:
1. 访问应用内部存储目录(无需额外权限)
应用内部存储(比如/data/data/包名/files/)是私有目录,无需动态申请权限,直接获取路径并添加到sys.path即可:
Java/Kotlin代码示例
import com.chaquo.python.Python; import java.io.File; // 获取应用内部files目录 File internalFilesDir = getFilesDir(); String internalPath = internalFilesDir.getAbsolutePath(); // 将路径添加到Python的sys.path Python.getInstance().getModule("sys").get("path").callAttr("append", internalPath);
Python代码示例(脚本内处理)
import sys from com.chaquo.python import Python # 获取应用上下文 context = Python.getInstance().getApplication() internal_path = context.getFilesDir().getAbsolutePath() sys.path.append(internal_path)
2. 访问外部存储目录(Downloads/Documents)
Android 10及以上采用分区存储,不能直接用/storage/emulated/0/Download这种硬编码绝对路径,需要通过**存储访问框架(SAF)**让用户选择目标目录,再将选中的目录路径转换为真实路径后,添加到sys.path,添加逻辑和内部存储一致。
3. 直接执行指定.py文件
如果不需要import该目录下的模块,只是想直接运行某个用户生成的.py文件,可直接调用Chaquopy的API执行,无需添加到sys.path:
import com.chaquo.python.Python; // 传入用户生成的.py文件绝对路径 Python.getInstance().getModule("runpy").callAttr("run_path", "/path/to/user_script.py");
额外注意点
- 权限适配:Android 10以下需申请
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE动态权限;Android 10+用SAF访问外部存储无需动态权限,仅需在Manifest声明基础权限。 - 彻底区分构建阶段和运行阶段:
sourceSets只负责打包开发机项目内的文件,和设备运行时的存储路径没有任何关联。
内容的提问来源于stack exchange,提问作者Ten Dai
相关产品推荐
相关产品推荐

