利用 Python 和 Kivy 开发移动端应用实战指南
Python 语言虽然功能强大且万能,但用它来开发原生 App 并非其最擅长的领域。因此,使用 Python 开发的 App 通常适用于编码练习、原型验证或自娱自乐。目前这方面的模块生态尚不够成熟,存在较多 Bug,建议开发者谨慎评估需求后再入坑。
本文介绍了使用 Python 和 Kivy 框架开发移动端应用的完整流程。内容包括 Kivy 环境的搭建(Mac/Linux)、Hello World 实例编写、使用 Buildozer 工具将代码打包为 Android APK 的步骤,以及常见的编译错误和依赖缺失问题的解决方案。此外,还补充了 Kivy 基础控件与布局的使用示例,帮助开发者理解 UI 构建逻辑。文章强调了 Python 在移动端开发的适用场景及局限性,适合希望快速验证跨平台应用原型的开发者参考。

Python 语言虽然功能强大且万能,但用它来开发原生 App 并非其最擅长的领域。因此,使用 Python 开发的 App 通常适用于编码练习、原型验证或自娱自乐。目前这方面的模块生态尚不够成熟,存在较多 Bug,建议开发者谨慎评估需求后再入坑。
利用 Python 开发跨平台 App 主要依赖 Kivy 框架。Kivy 是一个开源的、跨平台的 Python 开发框架,用于开发创新的用户界面应用程序。简而言之,这是一个类似 wxPython 的 Python 桌面程序开发框架,但其强大之处在于支持 Linux、macOS、Windows、Android 和 iOS 平台。
虽然 Kivy 是跨平台的,但要将 Python 代码打包成对应平台的可执行程序(如 Android 的 APK),还需要借助打包工具。Kivy 项目官方推荐的打包工具是 Buildozer,它自动化程度高且相对简单。其他项目如 Python-for-android 也能起到类似作用,本文主要介绍 Buildozer。
需要在 PC 上安装 Kivy 开发环境。以下演示 macOS 与 CentOS 7 下的安装过程。
安装依赖包 使用 Homebrew 安装必要的系统库:
brew install pkg-config sdl2 sdl2_image sdl2_ttf sdl2_mixer gstreamer
安装 Cython 以及 Kivy
pip install cython==0.25
pip install kivy
备用安装方式 如果通过 pip 安装报错,可以尝试从源码编译:
git clone https://github.com/kivy/kivy
python setup.py install
验证安装 运行 Python 并导入模块:
>>> import kivy
[INFO ] [Logger ] Record log in /Users/didi/.kivy/logs/kivy_18-05-08_4.txt
[INFO ] [Kivy ] v1.10.1.dev0, git-5f6c66e, 20180507
若无报错说明安装成功。
安装依赖
yum install make mercurial automake gcc gcc-c++ \
SDL_ttf-devel SDL_mixer-devel khrplatform-devel \
mesa-libGLES mesa-libGLES-devel gstreamer-plugins-good \
gstreamer gstreamer-python mtdev-devel python-devel \
python-pip java-devel
安装 Cython 以及 Kivy
pip install Cython==0.20
pip install kivy
参考文档 若遇到其他问题,可查阅 Kivy 官方 Linux 安装文档。
安装完成后即可开始开发。这里演示 Hello World 程序。
#! -*- coding:utf-8 -*-
from kivy.app import App
class HelloApp(App):
pass
if __name__ == '__main__':
HelloApp().run()
Label:
text: 'Hello, World! I am nMask'
说明:
main.py 是入口函数,定义了继承自 kivy.app.App 的类。hello.kv 文件用于定义界面风格,命名规则为类名小写且去除 "App" 后缀。python main.py
运行后将弹出一个包含文本标签的窗口。
为了让程序在安卓或苹果手机上运行,需要将其打包。Buildozer 可以打包 Kivy 程序,支持 Android 和 iOS。
pip install buildozer
在 Python 项目目录下执行以下步骤:
初始化配置
buildozer init
这将创建一个配置文件 buildozer.spec,可通过修改该文件更改 App 名称、权限等。
打包命令
buildozer android debug deploy run
此命令会生成跨平台的安装包。如果是 Android 目标,底层利用 python-for-android 项目。
注意: 首次运行会自动下载 Android SDK 等必要文件,过程可能需要较长时间及网络环境支持。
获取 APK
成功后会在项目目录下的 bin 文件夹中生成 .apk 文件,传输至安卓手机安装测试即可。
Usage:
buildozer [--profile <name>] [--verbose] [target] <command>...
buildozer --version
Available targets:
android Android target, based on python-for-android project
ios iOS target, based on kivy-ios project
android_old Android target, based on python-for-android project (old toolchain)
Global commands (without target):
distclean Clean the whole Buildozer environment.
help Show the Buildozer help.
init Create a initial buildozer.spec in the current directory
serve Serve the bin directory via SimpleHTTPServer
setdefault Set the default command to run when no arguments are given
version Show the Buildozer version
Target commands:
clean Clean the target environment
update Update the target dependencies
debug Build the application in debug mode
release Build the application in release mode
deploy Deploy the application on the device
run Run the application on the device
报错信息: You might have missed to install 32bits libs
原因: 64 位系统缺少 32 位依赖文件。
解决方案: 在 CentOS 上安装相关库:
yum -y install --skip-broken glibc.i686 arts.i686 audiofile.i686 bzip2-libs.i686 \
cairo.i686 cyrus-sasl-lib.i686 dbus-libs.i686 directfb.i686 esound-libs.i686 \
fltk.i686 freeglut.i686 gtk2.i686 hal-libs.i686 imlib.i686 lcms-libs.i686 \
lesstif.i686 libacl.i686 libao.i686 libattr.i686 libcap.i686 libdrm.i686 \
libexif.i686 libgnomecanvas.i686 libICE.i686 libieee1284.i686 libsigc++20.i686 \
libSM.i686 libtool-ltdl.i686 libusb.i686 libwmf.i686 libwmf-lite.i686 \
libX11.i686 libXau.i686 libXaw.i686 libXcomposite.i686 libXdamage.i686 \
libXdmcp.i686 libXext.i686 libXfixes.i686 libxkbfile.i686 libxml2.i686 \
libXmu.i686 libXp.i686 libXpm.i686 libXScrnSaver.i686 libxslt.i686 \
libXt.i686 libXtst.i686 libXv.i686 libXxf86vm.i686 lzo.i686 mesa-libGL.i686 \
mesa-libGLU.i686 nas-libs.i686 nss_ldap.i686 cdk.i686 openldap.i686 pam.i686 \
popt.i686 pulseaudio-libs.i686 sane-backends-libs-gphoto2.i686 \
sane-backends-libs.i686 SDL.i686 svgalib.i686 unixODBC.i686 zlib.i686 \
compat-expat1.i686 compat-libstdc++-33.i686 openal-soft.i686 alsa-oss-libs.i686 \
redhat-lsb.i686 alsa-plugins-pulseaudio.i686 alsa-plugins-oss.i686 \
alsa-lib.i686 nspluginwrapper.i686 qt.i686 qt-x11.i686 \
pulseaudio-libs-glib2.i686 python-matplotlib.i686
报错信息: Error compiling Cython file
原因: Cython 模块未安装或版本不兼容。
解决方案:
pip install cython==0.25
报错信息: IOError: [Errno 2] No such file or directory...
原因: Buildozer 在打包最后一步复制 APK 到 bin 目录时的 Bug。
解决方案: 修改 /usr/local/lib/python2.7/dist-packages/buildozer/targets/android.py 文件。
from distutils.version import LooseVersion
__sdk_dir = self.android_sdk_dir
build_tools_versions = os.listdir(join(__sdk_dir, 'build-tools'))
build_tools_versions = sorted(build_tools_versions, key=LooseVersion)
build_tools_version = build_tools_versions[-1]
gradle_files = ["build.gradle", "gradle", "gradlew"]
is_gradle_build = any((exists(join(dist_dir, x)) for x in gradle_files)) and build_tools_version >= '25.0'
如果本地环境依赖问题难以解决,Kivy 官方提供了预装 Buildozer 及依赖的虚拟机镜像。下载地址通常为官方仓库提供的 torrent 或 zip 包。对于无法解决依赖问题的用户,推荐使用此虚拟机进行打包测试,但开发环境仍推荐在自己的本机上进行。
为了构建更复杂的 App,了解 Kivy 的核心控件和布局管理器至关重要。
from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
class CalculatorApp(App):
def build(self):
layout = BoxLayout(orientation='vertical')
display = Label(text='0', font_size=40)
btn_layout = BoxLayout(orientation='horizontal')
btn = Button(text='Click Me')
btn.bind(on_press=self.on_click)
btn_layout.add_widget(btn)
layout.add_widget(display)
layout.add_widget(btn_layout)
return layout
def on_click(self, instance):
print('Button Clicked')
if __name__ == '__main__':
CalculatorApp().run()
利用 Python 结合 Kivy 和 Buildozer,开发者可以快速实现跨平台的移动应用原型。尽管在性能优化和原生体验上与 Java/Kotlin/Swift 仍有差距,但对于快速验证想法、内部工具开发或学习跨平台编程而言,这是一套高效的技术栈。建议在正式商用前充分测试兼容性,并关注社区的最新动态以获取更好的支持。
注:本文内容基于公开技术文档整理,旨在提供技术参考。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online