Buildozer打包KivyMD生成APK打开后闪退问题求助
适配KivyMD项目的Buildozer打包解决方案
完整requirements配置
闪退的核心原因为未声明项目依赖的第三方库,调整后的requirements配置如下,适配kivy2.0.0、kivymd0.104.1版本:requirements = python3,kivy==2.0.0,kivymd==0.104.1,numpy,nltk,tflite-runtime,keras-applications,keras-preprocessing
配置说明:
- numpy直接使用Buildozer提供的预编译安卓版本即可,无需指定过高版本,避免出现编译兼容问题
- 不直接引入完整keras和tensorflow,安卓端仅需tflite-runtime即可运行轻量化的tflite格式模型,你需要提前将本地训练好的h5格式keras模型转换为tflite格式,避免完整tensorflow无法在安卓端运行、包体积过大的问题
- nltk为纯Python库,可直接兼容安卓,但注意打包后无法自动下载语料库,需要提前将用到的nltk语料文件放到项目目录,随assets资源一同打包
额外buildozer.spec配置调整
除了requirements之外,还需要调整以下配置避免后续闪退:
# 将nltk语料、tflite模型作为assets资源打包进APK android.add_assets = ./nltk_data,./model.tflite # 适配kivy2.0.0的NDK版本要求 android.ndk = 21b # 调整安卓API版本,提升兼容性 android.api = 30 # 给APP分配足够的运行内存,避免模型加载时OOM闪退 android.heap_size = 512m
代码适配调整
你需要在main.py入口最开始添加路径适配逻辑,避免nltk、模型加载失败:
import os import nltk # 安卓端环境路径适配 if "ANDROID_APP_PATH" in os.environ: # 指定nltk语料库路径 nltk_data_path = os.path.join(os.environ["ANDROID_APP_PATH"], "assets", "nltk_data") nltk.data.path.append(nltk_data_path) # 指定tflite模型路径 model_path = os.path.join(os.environ["ANDROID_APP_PATH"], "assets", "model.tflite") else: # 本地测试路径 nltk_data_path = "./nltk_data" model_path = "./model.tflite" nltk.data.path.append(nltk_data_path)
模型加载部分替换为tflite加载逻辑:
import tflite_runtime.interpreter as tflite interpreter = tflite.Interpreter(model_path=model_path) interpreter.allocate_tensors() input_details = interpreter.get_input_details() output_details = interpreter.get_output_details()
内容的提问来源于stack exchange,提问作者Tanish
相关产品推荐
相关产品推荐

