Buildozer & WSL 2 打包Python文件为APK

在线打包

Convert Pygame code to android apk,选择

谷歌colab在线服务即可。但是因为会重置故鄙人想要在本地部署完整的buildozer打包流程。

本地打包 – 我的环境

Windows 11 + WSL 2 (Ubuntu 22.04)

根据上文在线打包的colab提供的代码一样,在Ubuntu里依次执行即可。

依赖问题

在buildozer init后找到buildozer.spec文件,在里面搜索requirements = ,然后修改为:

python3==3.10.12,kivy==2.3.0,pyjnius==1.5.0,hostpython3==3.10.12,pygame

随后再根据你需要的依赖添加包名即可,无需在机器内的pip下载该模块,打包时会自动下载一遍。

有关编译

这些包会进行本地编译,所以耗时极长,20~60分钟较为合理,若卡在某些步骤请检查网络代理配置。

一、代理问题

有时无法访问github.com、python.org等,导致git clone卡住最后超时。

你无需设置all_proxy、http_proxy等环境变量,只需将WSL2的网络模式设置为NAT:

然后开启代理软件的TUN Mode:

(注意:Service Mode要安装)

这时候就能ping通了:

二、Gradle打包时的 Java heap space与无法回收内存

无法回收内存(没有出现此问题不用看)

由于 Gradle 8.x 导致 OpenJDK 11 不兼容 / 无法在 WSL v1 上构建 apk 作者:Marcinosoft ·拉取请求 #3006 ·Kivy/Android 版 Python

由于 Gradle 8.x 导致 OpenJDK 11 不兼容 / 无法在 WSL v1 上构建 apk ·问题 #3000 ·Kivy/Android 版 Python

com.android.build.gradle.internal.tasks.CompressAssetsWorkAction:Java 堆空间 ·问题 #2984 ·Kivy/Android 版 Python

无法分配内存 ·问题 #1504 ·Kivy/Buildozer

总而言之:

1.切换 OpenJDK 版本至11

1.将 gradle-8.0.2 降级到 gradle-7.6.2,将 gradle:8.1.1 降级到 gradle:7.4.2 以保持 JDK 11 兼容性

sudo apt install -y openjdk-11-jdk
sudo update-alternatives --config java
(选择JDK11)

然后在buildozer.spec中找到

修改为

这样就会使用Gradle7.x构建。

Java heap space

造成的原因是资源文件体积过大,据本人经验,只要打包的资源文件超过200MB就会触发该错误。

解决方案是压缩文件体积,比如我游戏的背景图片都是相机原jpg图,数十张照片体积超过100MB。

经过可接受的压缩,将体积降到

成功打包。

性能问题

由于pygame对安卓平台很不友好,导致只能使用cpu渲染,所以帧率可谓极其缓慢。

解决方案是在你的程序中找到所有需要调用pygame绘制的地方,改为使用pysdl2实现。你可以整合一个pygame的api转sdl2的接口,然后实现sdl2绘制pygame的相同功能,最后替换即可。

Example: https://github.com/Himpq/GalEngine/

发表回复