我叫陆知衡,是一名常年混迹在移动端和Python圈的“跨栈型”开发,日常身份有两个:给甲方交付可上架的APP,也给新手工程师做内训。很多同学跟我说:

所以这一篇,我想用一个贴地气的“Kivy开发手机app实例教程”,帮你走完一条很具体的路径:从一段Python代码,到你手机上能点得动、还能打包成APK的实战流程。不是那种讲完就散的概念文,而是能照着一步步抄作业的那种。
你可以把这篇文章当成一次“带练式”的技术分享:跟着我,把一个简单却完整的Demo,从开发、真机调试、再到打包上线,跑完一遍闭环。
很多人点进“kivy开发手机app实例教程”,心里是犹豫的:“Kivy这玩意会不会过气?学了有用吗?”
我先给你看几个关键现实:
Python存量巨大2025年,多个招聘平台技术报告显示,Python依然稳居后端和数据方向的主流语言之一,新入行的后端/数据岗位中,接近一半把Python列为“加分项或必备项”。你已经会Python,用Kivy做移动端,相当于在原有技能树上“旁支扩展”,而不是从零切Stack。
Kivy是“全Python栈”,认知负担低Kivy的UI和逻辑全是Python,对后端、爬虫、数据分析出身的人非常友好,不需要额外啃一整套前端生态。很多我带的初级工程师,用Kivy做出可用APP的速度,普遍比他们转Flutter快一倍以上。
适合“个人项目 / 校招作品”这种场景几个真实案例:
- 2025年上半年,重庆一所工科学院的学生,用Kivy做了一个“实验课签到+成绩查询APP”,直接拿这个做毕业设计+校招作品,进了一家中型互联网公司;
- 某位自由职业数据分析师,用Kivy做了一个小型“数据看板APP”,给老板当移动端BI入口,后面变相成了升职加薪的筹码。
换句话说,如果你是:
- Python背景,想有个能在手机上“看得见摸得着”的作品;
- 想做一些偏工具类、内部系统、小众应用;那么这个“Kivy开发手机app实例教程”,正好就是你的通关脚本。
很多人卡在Kivy的第一步:安装。环境一乱,心态就崩。我习惯把环境当成“一次性工程”。你照着做一次,后面就直接复用。
Step1:给Python装个“干净容器”
建议你:
- Python版本用 3.10 或 3.11,目前Kivy在这个版本段最稳定;
- 使用
venv或conda创建虚拟环境,避免污染系统Python。
示意命令(以venv为例):
python -m venv kivy_envsource kivy_env/bin/activate # Windows 用: kivy_envScriptsactivateStep2:装Kivy核心组件
只做Android开发,最简单那套组合是:
python -m pip install --upgrade pippip install "kivy[base]" kivy_examples装完后,可以在Python REPL里快速验证:
import kivyprint(kivy.__version__)如果不报错,说明Kivy本体OK。
Step3:为“打包APK”提前埋下伏笔
做教程时,很多人只讲运行不讲打包,结果你真想发给朋友装时,发现环境完全不够。要打包Android APK,Kivy生态里目前比较主流的是 Buildozer。
pip install buildozer这里有个坑我提前讲清楚:
- 在Linux环境(Ubuntu等)下打包最顺滑;
- Windows用户,通常需要装WSL2 或 在虚拟机里搞一个Ubuntu。
我线下课的做法是:
- 开发阶段你喜欢用什么系统都行;
- 打包阶段,准备一台“打包机”,里面是Ubuntu + Python + Buildozer,不做别的事。
环境问题只会集中在一个地方,而不是每次开新项目都踩坑。
开始上手写代码。我们做一个实用一点的小例子:“每日专注计时APP” —— 打开后可以设置一个专注时长,点击开始计时,曲线不求惊艳,但要功能闭环。
1.项目骨架:一个能在手机上跑起来的主界面
新建文件 main.py:
from kivy.app import Appfrom kivy.uix.boxlayout import BoxLayoutfrom kivy.uix.label import Labelfrom kivy.uix.button import Buttonfrom kivy.uix.textinput import TextInputfrom kivy.clock import Clockclass FocusLayout(BoxLayout): def __init__(self, kwargs): super().__init__(orientation="vertical", padding=20, spacing=10, kwargs) self.time_left = 0 self.info_label = Label(text="设置专注时间(分钟)", font_size=20) self.add_widget(self.info_label) self.input_box = TextInput(text="25", multiline=False, font_size=18) self.add_widget(self.input_box) self.start_btn = Button(text="开始专注", font_size=18, size_hint=(1, 0.3)) self.start_btn.bind(on_press=self.start_focus) self.add_widget(self.start_btn) self.timer_label = Label(text="剩余时间:--:--", font_size=24) self.add_widget(self.timer_label) self._event = None def start_focus(self, instance): try: minutes = int(self.input_box.text) self.time_left = minutes * 60 except ValueError: self.info_label.text = "[输入错误] 请输入整数分钟" return if self._event: self._event.cancel() self._event = Clock.schedule_interval(self.update_timer, 1) self.info_label.text = "已开始专注,手机先放一边 :)" def update_timer(self, dt): if self.time_left <= 0: self.timer_label.text = "时间到,收获一次小小专注!" if self._event: self._event.cancel() return self.time_left -= 1 minutes = self.time_left // 60 seconds = self.time_left % 60 self.timer_label.text = f"剩余时间:{minutes:02d}:{seconds:02d}"class FocusApp(App): def build(self): self.title = "专注计时器" return FocusLayout()if __name__ == "__main__": FocusApp().run()现在在桌面环境里直接跑:
python main.py你会看到一个简单但可交互的窗口,这就是你的第一个“可迁移到移动端”的Kivy APP。
这里我们已经串上了Kivy的几个核心概念:
App:整个应用的入口;Layout:布局容器,这里用BoxLayout;Widget:Label/Button/TextInput 这些控件;Clock:类似“游戏循环”的计时器,可以做定时任务。
2.用 .kv 文件把界面“抽离出来”,更像正经项目
刚才那段代码界面和逻辑混在一起,对新手来说还行,对准备长期维护来说就有点混乱。Kivy有一套自己的KV语言,你可以理解成专用的UI描述DSL。
我们把UI拆成 focus.kv:
<FocusLayout>: orientation: "vertical" padding: 20 spacing: 10 info_label: info_label input_box: input_box start_btn: start_btn timer_label: timer_label Label: id: info_label text: "设置专注时间(分钟)" font_size: 20 TextInput: id: input_box text: "25" multiline: False font_size: 18 Button: id: start_btn text: "开始专注" font_size: 18 size_hint: 1, 0.3 on_press: root.start_focus(self) Label: id: timer_label text: "剩余时间:--:--" font_size: 24对应修改 main.py:
from kivy.app import Appfrom kivy.lang import Builderfrom kivy.uix.boxlayout import BoxLayoutfrom kivy.clock import Clockfrom kivy.properties import ObjectPropertyKV = Builder.load_file("focus.kv")class FocusLayout(BoxLayout): info_label = ObjectProperty(None) input_box = ObjectProperty(None) start_btn = ObjectProperty(None) timer_label = ObjectProperty(None) def __init__(self, kwargs): super().__init__(kwargs) self.time_left = 0 self._event = None def start_focus(self, instance): try: minutes = int(self.input_box.text) self.time_left = minutes * 60 except ValueError: self.info_label.text = "[输入错误] 请输入整数分钟" return if self._event: self._event.cancel() self._event = Clock.schedule_interval(self.update_timer, 1) self.info_label.text = "已开始专注,手机先放一边 :)" def update_timer(self, dt): if self.time_left <= 0: self.timer_label.text = "时间到,收获一次小小专注!" if self._event: self._event.cancel() return self.time_left -= 1 minutes = self.time_left // 60 seconds = self.time_left % 60 self.timer_label.text = f"剩余时间:{minutes:02d}:{seconds:02d}"class FocusApp(App): def build(self): self.title = "专注计时器" return FocusLayout()if __name__ == "__main__": FocusApp().run()这一步,其实就是把项目从“脚本玩具”往“可维护项目”方向推了一小步,在团队内我们会把这种拆分称为“UI/逻辑解耦”。
写完Demo,真正让人有成就感的是:点亮自己的手机屏幕。
1.Android 打包的大致玩法
对Kivy来说,打包Android的经典流程是:
- 在Ubuntu环境安装打包依赖(SDK、NDK、Cython 等);
- 使用
buildozer init生成配置文件; - 调整
buildozer.spec(权限、包名、图标等); - 运行
buildozer -v android debug生成APK; - 拷贝到手机安装,或用USB直接部署。
核心命令长这样:
buildozer init # 生成 buildozer.specbuildozer -v android debug # 编译 debug APKbuildozer.spec 里,有几个你必须要改的关键配置:
[app]title = 专注计时器package.name = focus_timerpackage.domain = org.yourname # 可以自己定义,只要保证全局唯一source.dir = .source.include_exts = py,kv,png,jpg,ttfrequirements = python3,kivyfullscreen = 0orientation = portrait打包过程第一次跑会比较久,因为需要拉SDK/NDK等依赖,这一步非常考验网络环境。我们内部实战班通常会建议:
- 先在本地多跑几次,不断缓存依赖;
- 真的不行就搬到云服务器上打包。
2.真机部署体验一下“上手感”
打好APK后,建议你:
- 在两种不同档位的手机上试一下(比如一个中端机,一个老旧机);
- 观察启动速度、界面适配、字体大小。
2025年一些测试数据里,简单Kivy APP在中端安卓机的启动时间,多数控制在2~4秒之间,老旧机型可能拉到5秒左右。这种级别的工具型APP,用户基本是可以接受的。
如果你发现:
- 字体太小:在KV里统一调大
font_size; - 按钮不好点:给
size_hint_y加大一点,或者直接指定height; - 界面被异形屏遮挡:适当留白,避免把关键按钮放在屏幕边缘。
这些看似细碎的小调整,其实构成了一个APP“像样与否”的关键体验。
很多“Kivy开发手机app实例教程”停在能跑就完事,我会再多拉你一步,让这个Demo有一点“工程气质”。
1.加一层简单日志,方便排查线上问题
当你的APP装在别人手机上,你再也看不到控制台输出了,所以在生产环境里,我们会习惯在关键交互处写日志。
import logginglogging.basicConfig( filename="focus_app.log", level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s")# 使用示例logging.info("Focus session started, minutes=%s", minutes)Android上路径会不太一样,真实项目会把日志写到 App.user_data_dir 对应的目录:
from kivy.app import Appimport oslog_path = os.path.join(App.get_running_app().user_data_dir, "focus_app.log")这种“看不见但关键”的工程细节,是把作品往“可上线产品”推进的一步。
2.把“业务逻辑”抽出单独模块
计时逻辑可以抽到 focus_core.py:
class FocusTimer: def __init__(self, minutes: int): self.total = minutes * 60 self.left = self.total def tick(self): if self.left <= 0: return 0 self.left -= 1 return self.left @property def done(self): return self.left <= 0FocusLayout 只负责UI层,逻辑由 FocusTimer 驱动,这样如果你哪天想做一个命令行版 / Web版计时器,逻辑复用成本极低。
这就是我们工程圈常挂嘴边的:“业务和展示分层”。哪怕是一个小Demo,早点养成这个习惯,等你接手真正的商业项目时,整个人会轻松得多。
看文章的人,大概会分成几类,我分别说说能怎么用这套“Kivy开发手机app实例教程”走下去。
你是学生/ 转行者:先做作品,再谈技术栈
建议你用Kivy搞定这几类小项目:
- 校园工具:课程表、成绩查询、实验室预约;
- 个人习惯类:打卡、计时、简单记账。
每个项目控制在 2~4 周内收尾,做成:
- 有APK;
- 有Git仓库;
- 有一篇技术说明文档。
2025年不少校招面试官更看重“成品+思路”,而不是你嘴上说会多少框架。能拿出手机说:“这是我自己用Kivy做的APP,代码在这里,Build脚本在这里”,整体竞争力会立即拉开差距。
你是后端/ 数据工程师:Kivy就是你的“轻量客户端”
你完全可以把Kivy当作:
- 自己的内网工具客户端;
- 快速搭一个“后端能力的展示壳”。
比如:
- 数据分析结果,通过API写好,再用Kivy做一个移动端Dashboard;
- 定时任务状态监控、报警信息查看,做一个简单的Ops助手。
这个思路有个现实收益:公司很多“内部工具”预算有限,不可能给你专门拉一个前端团队,而你用Kivy+Python,可以做出一个“够用、可维护”的移动端壳子,直接绑定到你的后端服务上。
你是独立开发者:Kivy可以是MVP验证工具如果你想做一款小众工具APP,走的是“付费/内购/广告”路线,前期最关键的是:尽快把想法变成可体验的东西。
用Kivy,你可以迅速做出:
- 定制计算器(行业专用公式)
- 时间/任务管理类工具
- 小型知识卡片刷题工具
先用Kivy做MVP,拿给真实用户试,用数据说话:留存、打开频次、支付意愿。当你确定方向跑得通,再决定要不要重构到Flutter/原生。
这在独立开发圈就是典型的:先用生产力工具验证方向,再用工业化工具做规模化产品。
一路写下来,你会发现这个“Kivy开发手机app实例教程”,真正想带你跨过去的是这几道坎:
- 从“能写脚本”到“能写完整APP”的心理门槛;
- 从“在自己电脑上跑”到“真机APK部署”的技术断层;
- 从“Demo拼凑”到“有一点工程味”的项目结构。
如果你愿意照着这篇文章:
- 按步骤搭一次环境;
- 把专注计时APP完整写完;
- 在一台Android手机上亲手装上自己的APK;那么你在技能树上已经多了一条很实在的分支:会用Kivy做一个从代码到APK闭环的移动应用。
接下来你可以顺着这条线继续:
- 引入数据库(比如
sqlite3)做持久化; - 接入REST API,做一个“云同步”的小工具;
- 优化UI,学习更多Kivy组件和动画。
等你把第三个小APP做出来,再回头看“移动端开发”四个字,紧张感会小很多。那时候,你就不仅仅是在看“Kivy开发手机app实例教程”,而是在写属于自己的教程。