使用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
相关产品推荐
相关产品推荐

