使用Python Cryptodome开发Android Kivy应用时启动崩溃问题求助
Kivy+Buildozer打包APK引入Cryptodome RSA后手机崩溃的解决办法
问题描述
用Kivy开发Android应用,通过Buildozer打包成APK。引入Cryptodome实现RSA加解密前代码运行正常,电脑端测试也没问题,但手机上启动应用直接崩溃,报错如下:
ImportError: CFFI with optimize=2 fails due to pycparser bug.
AttributeError: undefined symbol: PyObject_GetBuffer
已在buildozer.spec中添加必要依赖,但问题未解决,需要修复该问题,或寻找可在Android上运行的替代Python RSA模块。
针对Cryptodome的修复方案
1. 调整CFFI优化等级规避bug
在buildozer.spec的[app]段添加配置,强制CFFI使用优化等级1,绕过pycparser的bug:
android.extra_pip_args = --no-build-isolation # 设置环境变量修改CFFI优化等级 os.environ['CFFI_OPT_LEVEL'] = '1'
也可以直接指定兼容版本的CFFI,在requirements中添加:
requirements = python3,kivy,pycryptodome,cffi==1.15.0
2. 使用Cryptodome的纯Python封装接口
避免调用依赖编译的底层模块,改用高层纯Python实现的API,比如Crypto.PublicKey.RSA和Crypto.Cipher.PKCS1_OAEP:
from Crypto.PublicKey import RSA from Crypto.Cipher import PKCS1_OAEP # 生成密钥对 key_pair = RSA.generate(2048) private_key = key_pair.export_key() public_key = key_pair.publickey().export_key() # 加密数据 cipher = PKCS1_OAEP.new(RSA.import_key(public_key)) encrypted_data = cipher.encrypt(b"需要加密的内容") # 解密数据 cipher = PKCS1_OAEP.new(RSA.import_key(private_key)) decrypted_data = cipher.decrypt(encrypted_data)
3. 修复ctypes符号未定义问题
在buildozer.spec的requirements中明确添加ctypes,同时检查是否有其他依赖库冲突,移除不必要的第三方模块:
requirements = python3,kivy,pycryptodome,ctypes
替代的纯Python RSA模块
如果Cryptodome的问题无法解决,推荐使用纯Python实现的rsa模块,无需编译,Android兼容性更好:
- 在
buildozer.spec的requirements中添加rsa - 示例代码:
import rsa # 生成2048位密钥对 pub_key, priv_key = rsa.newkeys(2048) # 加密 encrypted = rsa.encrypt(b"需要加密的内容", pub_key) # 解密 decrypted = rsa.decrypt(encrypted, priv_key)
该模块支持PKCS#1 v1.5和OAEP加密,性能略低于Cryptodome,但足以满足常规需求。
内容的提问来源于stack exchange,提问作者big_shlomi
相关产品推荐
相关产品推荐

