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

使用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的修改,重新构建。

验证步骤

  1. 更新buildozer.spec的requirements或NDK配置
  2. 调整CI流程,确保补丁/修改在构建前生效
  3. 重新运行Github Action构建
  4. 安装APK测试启动情况

内容的提问来源于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 08:24:55