KivyMD应用运行崩溃,报ModuleNotFoundError: No module named '_lzma'
解决Android打包时
ModuleNotFoundError: No module named '_lzma'问题 问题分析
你的KivyMD应用依赖Instaloader,而Instaloader间接导入了Python标准库的lzma模块,该模块依赖C扩展_lzma。Android打包环境默认未编译这个扩展,导致运行时报错。在Github Actions中,.buildozer目录是构建过程中临时生成的,无法提前手动修改其中的文件,所以需要通过配置或脚本自动化解决。
解决方案
方案1:添加依赖并调整NDK版本
- 修改
buildozer.spec文件:- 更新
requirements,添加lzma和pyliblzma(作为备用依赖):requirements = kivy,kivymd,python3,hostpython3,pillow,certifi,instaloader,requests,android,lzma,pyliblzma - 设置兼容的NDK版本(旧版NDK可能缺少xz库支持,推荐25b及以上):
android.ndk = 25b
- 更新
方案2:自动补丁lzma.py(适合Github Actions环境)
如果方案1仍报错,可通过构建脚本自动修改标准库的lzma.py,处理导入错误:
- 在项目根目录创建一个
fix_lzma.sh脚本,内容如下:# 找到lzma.py的路径并修改 LZMA_PATH=$(find .buildozer/android/platform/build-*/build/other_builds/python3/*/python3/Lib -name lzma.py) sed -i '27s/from _lzma import */try: from _lzma import * except ImportError: from pyliblzma import */' $LZMA_PATH - 修改
buildozer.spec,添加构建后执行的命令:
这个命令会在Android构建完成后,自动找到android.post_build_command = bash fix_lzma.shlzma.py并修改第27行的导入逻辑,当_lzma不存在时, fallback到pyliblzma。
方案3:禁用Instaloader的lzma依赖(不推荐)
如果你的应用不需要Instaloader的lzma相关功能,可以修改Instaloader的源码,但这可能导致部分功能失效:
- 在项目中创建一个自定义的
nodeiterator.py(覆盖Instaloader的对应文件),移除或注释掉import lzma的语句,但需测试确保核心功能正常。
验证
在Github Actions中重新触发构建,构建完成后安装到Android设备测试,确认崩溃问题解决。
内容的提问来源于stack exchange,提问作者Mr Stranger
相关产品推荐
相关产品推荐

