Kivy打包APK运行报FileNotFoundError找不到users.json如何解决
问题核心原因
你代码中硬编码了本地开发环境的绝对路径/home/mrpravin21/Documents/Python3/Application6/users.json,安卓设备不存在该目录结构,读写时直接触发文件不存在异常导致闪退。
修复步骤
替换所有写死的绝对路径,使用Kivy提供的动态应用私有存储路径
安卓系统会为每个已安装应用分配专属的私有存储目录,该目录默认有读写权限,无需额外申请权限,可通过App.get_running_app().user_data_dir获取,示例代码如下:from kivy.app import App import os import json # 动态获取当前应用的私有存储路径 app_data_path = App.get_running_app().user_data_dir # 拼接得到users.json的完整路径 users_json_path = os.path.join(app_data_path, "users.json") # 初始化逻辑:首次运行文件不存在时创建 if not os.path.exists(users_json_path): # 无预设初始文件的场景:写入空的用户数据结构 with open(users_json_path, "w", encoding="utf-8") as f: json.dump({"users": []}, f) # 有预设初始users.json的场景:先读取打包进APK的初始文件再写入私有目录 # from kivy.resources import resource_find # init_file = resource_find("users.json") # if init_file: # with open(init_file, "r", encoding="utf-8") as src_f, open(users_json_path, "w", encoding="utf-8") as dst_f: # dst_f.write(src_f.read())后续所有读写用户数据的操作都使用
users_json_path变量即可,不要保留任何本地开发环境的绝对路径。若需要将预设的初始users.json打包进APK,修改buildozer.spec配置
找到spec文件中的source.include_exts配置项,添加json扩展名,确保项目根目录下的json文件会被打包:source.include_exts = py,png,jpg,kv,atlas,json也可以通过
source.include_files单独指定要打包的文件:source.include_files = users.json修改完成后重新用buildozer打包APK,安装测试即可修复闪退问题。
注意事项
不要尝试在安卓高版本(Android 10+)中读写公共存储目录,不仅需要额外申请权限,还极容易被系统权限拦截导致异常,应用私有目录足够存储普通的用户配置、凭证类数据。
内容的提问来源于stack exchange,提问作者mrpravin21
相关产品推荐
相关产品推荐

