使用Kivy/KivyMD+Instaloader构建APK时遇backports模块缺失错误
解决KivyMD应用打包APK后backports模块缺失问题
问题背景
使用Kivy+KivyMD框架开发应用,引入instaloader模块,通过Github Action(CI)打包APK后启动立即崩溃。最初报错ModuleNotFoundError: No module named '_lzma',修改lzma.py导入逻辑后,新出现ModuleNotFoundError: No module named 'backports'错误。
初始崩溃日志
I/python ( 8065): Traceback (most recent call last): I/python ( 8065): File "/github/workspace/.buildozer/android/app/main.py", line 9, in <module> I/python ( 8065): File "/github/workspace/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/stalkgram/arm64-v8a/instaloader/__init__.py", line 16, in <module> I/python ( 8065): File "/github/workspace/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/stalkgram/arm64-v8a/instaloader/instaloader.py", line 24, in <module> I/python ( 8065): File "/github/workspace/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/python-installs/stalkgram/arm64-v8a/instaloader/nodeiterator.py", line 7, in <module> I/python ( 8065): File "<frozen zipimport>", line 259, in load_module I/python ( 8065): File "/github/workspace/.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Lib/lzma.py", line 27, in <module> I/python ( 8065): ModuleNotFoundError: No module named '_lzma' I/python ( 8065): Python for android ended.
CI配置(build.yml)
name: CI on: push: branches: [main] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Get Date id: get-date run: | echo "::set-output name=date::$(/bin/date -u "+%Y%m%d")" shell: bash - name: Cache Buildozer global directory uses: actions/cache@v2 with: path: .buildozer_global key: buildozer-global-${{ hashFiles('buildozer.spec') }} - uses: actions/cache@v2 with: path: .buildozer key: ${{ runner.os }}-${{ steps.get-date.outputs.date }}-${{ hashFiles('buildozer.spec') }} - name: Install AIDL run: | sudo apt-get update sudo apt-get install build-essential sudo apt-get install libstdc++6 sudo apt-get install aidl sudo apt-get install -y liblzma-dev pip3 install backports.lzma pip3 install backports.weakref - name: Build with Buildozer uses: ArtemSBulgakov/buildozer-action@v1 id: buildozer with: command: buildozer android debug buildozer_version: master - name: Modify lzma.py run: | cd .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Lib sudo apt-get install -y liblzma-dev pip3 install backports.lzma pip3 install backports.weakref cd /home/runner/work/Stalkgram/Stalkgram ls sudo cp lzma.py .buildozer/android/platform/build-arm64-v8a_armeabi-v7a/build/other_builds/python3/arm64-v8a__ndk_target_21/python3/Lib - name: Upload artifacts uses: actions/upload-artifact@v2 with: name: package path: ${{ steps.buildozer.outputs.filename }}
buildozer.spec依赖配置
requirements = python3==3.9.10,hostpython3==3.9.10,kivy==2.1.0,pillow,kivymd==1.1.1,certifi,android,instaloader==4.10.1,plyer==2.1.0
尝试的修复及新错误
修改lzma.py导入逻辑:
修改前:
from _lzma import * from _lzma import _encode_filter_properties, _decode_filter_properties
修改后:
try: from _lzma import * from _lzma import _encode_filter_properties, _decode_filter_properties except ImportError: from backports.lzma import * from backports.lzma import _encode_filter_properties, _decode_filter_properties
修改后出现新错误:
I/python ( 7917): File "/github/workspace/.buildozer/android/app/lzma.py", line 31, in <module> I/python ( 7917): ModuleNotFoundError: No module named 'backports' I/python ( 7917): Python for android ended.
解决方案
1. 补充backports依赖到buildozer.spec
当前requirements未包含backports.lzma和backports.weakref,Buildozer只会打包指定依赖。更新requirements:
requirements = python3==3.9.10,hostpython3==3.9.10,kivy==2.1.0,pillow,kivymd==1.1.1,certifi,android,instaloader==4.10.1,plyer==2.1.0,backports.lzma,backports.weakref
2. 调整CI流程,确保修改lzma.py时机正确
当前在Buildozer构建完成后修改lzma.py,此时依赖已打包进APK,修改无效。需在构建前完成修改:
- 将自定义
lzma.py放在项目根目录 - 在Buildozer构建步骤前添加复制命令,替换到对应Python库路径
更可靠的方式是使用Buildozer的patches功能:
在buildozer.spec中添加:
patches = patches/lzma.patch
创建patches/lzma.patch文件,包含对lzma.py的修改补丁,Buildozer会自动在构建过程中应用。
3. 升级NDK版本(可选,无需依赖backports)
Python 3.9+在更高版本NDK(如NDK 25+)中可能已内置_lzma模块。修改buildozer.spec中的NDK版本:
android.ndk = 25b
移除backports相关依赖和lzma.py的修改,重新构建。
验证步骤
- 更新buildozer.spec的requirements或NDK配置
- 调整CI流程,确保补丁/修改在构建前生效
- 重新运行Github Action构建
- 安装APK测试启动情况
内容的提问来源于stack exchange,提问作者Mr Stranger
相关产品推荐
相关产品推荐

