使用Buildozer打包的Kivy应用如何在Android端用os.mkdir创建目录
Kivy+Buildozer打包Android应用
os.mkdir()创建目录失效的原因与修复方案 为什么你的写法一直不生效
- 直接运行
os.mkdir("a")的写法在Android环境下完全失效:Android应用运行时没有PC端的可写公共根目录权限,相对路径默认指向应用沙箱内的临时受限目录,无权限写入时系统会直接拦截创建操作,不会弹出可见提示,你在手机文件管理器里自然找不到对应目录。 - 拼接
os.getcwd()路径执行创建也必然失败:Buildozer打包的Kivy应用默认工作目录指向APK内部的只读资源分区,这个路径从系统层面就是只读的,往里面拼接路径调用mkdir操作,无论你把这行代码放在导入Kivy之前还是之后执行,结果都是被拦截失败。 - 单独导入os模块、调整代码执行顺序解决不了问题:核心矛盾不是Python代码的执行逻辑,是Android系统的存储权限模型和PC端Linux环境完全不同,默认状态下Kivy应用既没有申请存储权限,也不会自动暴露可写目录的真实路径。
可直接落地的修复步骤
- 修改Buildozer配置文件,提前声明所需的存储权限:
- 如果你只需要创建应用内部的私有目录,不需要用户在系统文件管理器里看到这个目录,不需要额外申请特殊权限,只要把目录创建在应用专属的私有路径下即可,这个路径是系统默认开放读写的,路径规则为
/data/data/你的应用包名/files/,直接在这个路径下拼接自定义目录名执行os.makedirs(自定义路径, exist_ok=True),不会出现权限拦截。 - 如果你需要创建用户可见的公共目录(比如存储下载文件、导出的文档),需要在Buildozer配置里声明
WRITE_EXTERNAL_STORAGE、READ_EXTERNAL_STORAGE权限,同时适配Android 13以上的细粒度存储权限规则,并且在应用启动后动态向用户发起权限申请,不能直接用硬编码的存储路径执行创建。
- 如果你只需要创建应用内部的私有目录,不需要用户在系统文件管理器里看到这个目录,不需要额外申请特殊权限,只要把目录创建在应用专属的私有路径下即可,这个路径是系统默认开放读写的,路径规则为
- 不要硬拼接外部存储路径:如果需要在公共存储区域创建目录,要通过PyJNIus调用Android系统的环境类获取真实的外部存储根路径,不要自己凭印象拼类似
/sdcard/的硬编码路径,不同Android厂商的路径规则有差异,硬编码很容易拼错实际不存在的路径。 - 排错时不要靠逐文件检索找目录:直接抓取应用运行的日志,
os.mkdir()失败时一定会抛出权限不足、路径不存在的对应异常,Kivy打包后的默认配置会把未捕获的异常输出到系统日志,不抓日志很容易把“异常被拦截”误判为“目录没生成”。
内容的提问来源于stack exchange,提问作者Benjamin VB
相关产品推荐
相关产品推荐

