You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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版本

  1. 修改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,处理导入错误:

  1. 在项目根目录创建一个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
    
  2. 修改buildozer.spec,添加构建后执行的命令:
    android.post_build_command = bash fix_lzma.sh
    
    这个命令会在Android构建完成后,自动找到lzma.py并修改第27行的导入逻辑,当_lzma不存在时, fallback到pyliblzma。

方案3:禁用Instaloader的lzma依赖(不推荐)

如果你的应用不需要Instaloader的lzma相关功能,可以修改Instaloader的源码,但这可能导致部分功能失效:

  • 在项目中创建一个自定义的nodeiterator.py(覆盖Instaloader的对应文件),移除或注释掉import lzma的语句,但需测试确保核心功能正常。

验证

在Github Actions中重新触发构建,构建完成后安装到Android设备测试,确认崩溃问题解决。

内容的提问来源于stack exchange,提问作者Mr Stranger

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:43:17