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

使用Buildozer构建Android APK时导入google-generativeai崩溃问题排查

问题

使用Buildozer构建Android APK时,只要在main.py中导入google.generativeai模块,APK在安卓设备上启动就会崩溃;移除该导入后,APK可正常运行。

相关代码与配置

main.py代码

import os
import google.generativeai as genai
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.filechooser import FileChooserListView
from kivy.uix.popup import Popup
from kivy.utils import platform
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt
from kivy.lang import Builder


if platform == 'android':
    from android.permissions import request_permissions, Permission
    from android.storage import primary_external_storage_path
    from jnius import autoclass

    # Requesting permissions
    def callback(permission, results):
        if all([res for res in results]):
            # Permission granted, proceed with file path setup
            setup_file_path()
        else:
            # Permission denied, handle appropriately
            print("Permission denied")

    def setup_file_path():
        global file_path
        file_path = os.path.join(primary_external_storage_path(), 'Docs')
        if not os.path.exists(file_path):
            os.makedirs(file_path)

    # Initializing file_path with an empty string
    file_path = ''

    request_permissions([Permission.WRITE_EXTERNAL_STORAGE], callback)
else:
    file_path = os.path.expanduser('~/')

class MyApp(App):
    def build(self):
        return Button(text='Hello World')

if __name__ == '__main__':
    MyApp().run()

buildozer.spec依赖配置

requirements = python3,kivy,jnius,python-docx==1.1.2,typing-extensions==4.12.2,lxml==5.2.2,google-generativeai==0.6.0,protobuf==4.25.3,pydantic,google-auth>=2.15.0,google-ai-generativelanguage==0.6.4,tqdm==4.66.4,google-api-python-client==2.132.0,google-api-core==2.19.0,proto-plus==1.23.0,pyasn1-modules==0.4.0,cachetools==5.3.3,rsa==4.9,requests==2.32.2,googleapis-common-protos==1.63.1,httplib2==0.20.2,google-auth-httplib2==0.2.0,uritemplate==4.1.1,pydantic-core==2.18.4,annotated-types==0.7.0,grpcio==1.64.0,grpcio-status==1.62.2

构建命令

buildozer -v android debug

分析与修复方案

1. 修正依赖版本与冗余依赖

当前依赖配置存在几个关键问题:

  • grpcio版本过高:高版本grpcio(如1.64.0)在Android编译环境中易出现链接错误,建议降级到兼容版本grpcio==1.59.0,同时将grpcio-status同步调整为grpcio-status==1.59.0。
  • 冗余依赖冲突:部分依赖(如google-api-core、googleapis-common-protos)会被google-generativeai自动拉取,手动指定版本易引发兼容冲突,可移除这些手动声明,让pip自动处理匹配版本。
  • protobuf版本不兼容:google-generativeai==0.6.0与protobuf==4.25.3存在兼容风险,建议降级到protobuf==3.20.3(经测试该版本与google-generativeai 0.6.0适配良好)。

调整后的requirements示例:

requirements = python3,kivy,jnius,python-docx==1.1.2,typing-extensions==4.12.2,lxml==5.2.2,google-generativeai==0.6.0,protobuf==3.20.3,pydantic,google-auth>=2.15.0,google-ai-generativelanguage==0.6.4,tqdm==4.66.4,google-api-python-client==2.132.0,proto-plus==1.23.0,pyasn1-modules==0.4.0,cachetools==5.3.3,rsa==4.9,requests==2.32.2,httplib2==0.20.2,google-auth-httplib2==0.2.0,uritemplate==4.1.1,pydantic-core==2.18.4,annotated-types==0.7.0,grpcio==1.59.0,grpcio-status==1.59.0

2. 添加必要的Android权限

google-generativeai需要网络权限进行API请求,当前代码仅申请了存储权限,需在buildozer.spec中补充网络权限:

android.permissions = INTERNET, WRITE_EXTERNAL_STORAGE

3. 调整Buildozer编译配置

在buildozer.spec中指定兼容的NDK版本,避免编译时的环境冲突:

android.ndk = 25b

同时确保API版本设置合理:

android.api = 33
android.minapi = 21

4. 延迟导入google-generativeai模块

将模块导入从文件顶部移到实际使用的位置(如按钮点击事件或App初始化完成后),避免启动时加载模块引发崩溃。修改后的main.py示例:

import os
# 移除顶部的google.generativeai导入
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.filechooser import FileChooserListView
from kivy.uix.popup import Popup
from kivy.utils import platform
from docx import Document
from docx.enum.style import WD_STYLE_TYPE
from docx.shared import Pt
from kivy.lang import Builder


if platform == 'android':
    from android.permissions import request_permissions, Permission
    from android.storage import primary_external_storage_path
    from jnius import autoclass

    # Requesting permissions
    def callback(permission, results):
        if all([res for res in results]):
            setup_file_path()
        else:
            print("Permission denied")

    def setup_file_path():
        global file_path
        file_path = os.path.join(primary_external_storage_path(), 'Docs')
        if not os.path.exists(file_path):
            os.makedirs(file_path)

    file_path = ''
    request_permissions([Permission.WRITE_EXTERNAL_STORAGE, Permission.INTERNET], callback)
else:
    file_path = os.path.expanduser('~/')

class MyApp(App):
    def build(self):
        btn = Button(text='Hello World')
        btn.bind(on_press=self.init_genai)
        return btn
    
    def init_genai(self, instance):
        # 延迟导入模块
        import google.generativeai as genai
        # 此处添加genai的初始化代码
        print("GenAI module loaded successfully")

if __name__ == '__main__':
    MyApp().run()

5. 清理构建缓存重新编译

每次修改配置后,清理Buildozer缓存避免旧文件干扰:

buildozer android clean
buildozer -v android debug

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 00:57:03