开发工具构建工具移动开发【免费下载链接】python-for-androidTurn your Python application into an Android APK项目地址https://gitcode.com/gh_mirrors/py/python-for-android点击查看免费下载python-for-android下文简称 p4a是 Kivy 生态中负责“把 Python 应用打包成 Android APK/AAB”的核心工具。本文以仓库根目录的 CONTRIBUTING.md 为骨架系统梳理 p4a 的开发模型、日历版本化策略、代码质量规范并深入剖析 p4a 在构建过程中如何使用 pip 与 Recipe 机制处理 Python 依赖——读完本文你既能掌握向 p4a 提交代码的正确姿势也能理解其打包链路中依赖解析与交叉编译的底层原理。一、开发模型master 与 develop 双分支策略与 Kivy 框架不同p4a 采用基于 Git flow 思想的开发模型但并未严格照搬master分支永远代表最新的稳定发布版本develop分支承载所有最新贡献发布是周期性动作将当前develop合并进master。因此所有针对 p4a 代码和文档的 Pull Request 都应提交到develop分支而不是master。这一约定直接关系到贡献者合入合出分支的选择是阅读 CONTRIBUTING.md 时最先要记住的规则。发布分支的实操细节在 RELEASING.md 中有更完整的定义每个版本从最新的develop切出release-YYYY.MM.DD分支合并进master后再合并回develop并在master上打vYYYY.MM.DD格式的 annotated tag。二、版本化为什么使用日历版本号CalVerp4a 的发布版本号形如YYYY.MM.DD例如当前仓库的版本就是2026.05.09见 pythonforandroid/init.py采用的是 日历版本化Calendar Versioning 策略。选择 CalVer 的核心理由在 CONTRIBUTING.md 中写得很明确实践中p4a 的变更经常由 Android 构建工具的更新或调整所驱动因此用户最好始终使用最新发布版本。换句话说Android SDK/NDK/Gradle 生态变化快p4a 需要频繁跟随上游工具链演进固定“语义化主版本号”反而没有意义。p4a 在尽力保持向后兼容的同时内部实现仍会不断变动所以用日期作为版本号让用户一眼就知道“这份构建适配了哪个时点的 Android 工具链”。从源码看版本号的唯一事实来源是 pythonforandroid/init.py 中的__version__setup.py会解析该变量并暴露为包版本。三、项目历史里程碑理解当前构建能力的前提CONTRIBUTING.md 的 History 章节记录了三个关键节点它们共同塑造了今天的 p4a2015 年工具链重写提供了更易用、更易扩展的新接口旧的 toolchain 被保留在old_toolchain分支存档。2018 年底 Python 配方统一新的 Python33.7.1配方采用了全新构建系统并反向应用于古老的 Python2 配方升级到 2.7.15统一了两者的构建流程。统一后的 Python 配方要求最低 target API level 为 21Android 5.0 Lollipop如果你需要构建低于 API 21 的目标只能使用旧版 p4a 0.7.1。这一约束在当前源码中依然生效例如 pythonforandroid/recipes/python3/init.py 中就有明确的NDK_API_LOWER_THAN_SUPPORTED_MESSAGE声明 python3 配方仅支持min_ndk_api 21。2020 年 3 月停止 Python 2 支持最后一个支持构建 Python 2 的版本是2019.10.6。2021 年 8 月支持 Android App Bundleaab顺带带来了多架构multi-archAPK 的支持。四、代码质量Python 与 Java 双重 Lint 体系p4a 的代码由 Python核心构建逻辑与 Javabootstrap 工程两部分组成分别使用两套 lint 工具。4.1 Python Lintingflake8 toxPython 代码使用 flake8 做静态检查本地运行方式tox -e pep8对应的配置在仓库根目录的 tox.ini 中[testenv:pep8] deps flake8 commands flake8 pythonforandroid/ tests/ ci/ setup.py即 flake8 会检查pythonforandroid/、tests/、ci/和setup.py四块代码。同时 tox.ini 的[flake8]段还声明了一批被忽略的规则如 E123/E124/E126 缩进对齐、E226 运算符空格、E501 行长、W503/W504 二元运算符换行等贡献者提交代码前应保证本地tox -e pep8通过。4.2 Java LintingSpotless Google Java FormatAOSP 风格bootstrap 目录下的 Java 源文件使用 Spotless 配合 Google Java FormatAOSP 风格进行 lintCI 会自动执行该检查。本地执行需要 Java 17# 检查违规 make java-lint # 自动修复违规 make java-lint-fix查看仓库根目录的 Makefile 可以看到这两个目标实际是通过 Gradle wrapper 执行的java-lint: cd pythonforandroid/bootstraps ./common/build/gradlew spotlessCheck java-lint-fix: cd pythonforandroid/bootstraps ./common/build/gradlew spotlessApplyGradle wrappergradlew会在首次运行时自动下载正确的 Gradle 版本无需手动安装 Gradle。没有 Java 17 时改用 Docker# 检查违规 make docker/java-lint # 自动修复违规 make docker/java-lint-fixDocker 方案会先构建项目自带的 Docker 镜像镜像内包含 Java 17再在容器内运行 lint。对应 Makefile 实现Makefile将当前目录挂载到/home/user/app并在pythonforandroid/bootstraps目录下执行gradlew spotlessCheck/spotlessApply。被 lint 的范围与规则所有pythonforandroid/bootstraps/*/build/src/main/java/下的.java文件排除第三方代码org/kamranzafar/jtar/格式化规则包括Google Java Format 的 AOSP 风格缩进、移除未使用的 import、修剪行尾空白、文件以换行符结尾。五、发布流程核心维护者的专属流程发布流程对普通贡献者不是必读内容其完整步骤记录在 RELEASING.md 中简要概括如下从最新的develop切出release-YYYY.MM.DD分支在 pythonforandroid/init.py 中更新版本号重新生成CHANGELOG.md从 release 分支向master开 PR并在 PR 描述中附带发布检查清单合并进master后再合并回develop在master上打vYYYY.MM.DD格式的 annotated tag推送 tag 后 PyPI 上传由 CI 自动完成构建 sdist/bdist_wheel、twine check、token 上传。发布检查清单中还要求本地跑完整tox其中包含在 GitHub Actions 上被跳过的长时测试、用 buildozer 构建并运行testapps/on_device_unit_tests、对armeabi-v7a与arm64-v8a两个架构分别构建验证等。六、核心机制p4a 如何使用 pip 与 Recipe 处理依赖这是 CONTRIBUTING.md 中篇幅最大、技术含量最高的章节它是写给Python 打包开发者packager看的而非普通终端用户——目的是让 pip 开发者与打包专家了解 p4a 的打包需求。下面结合源码逐层展开。6.1 基本概念Recipe 与 Python Package 两类依赖p4a 的工作方式是提供一个 Java wrapper对图形应用则提供基于 SDL2 的 wrapper可用于 Kivy 框架也可配合纯 PySDL2将 Python 应用构建并打包为 Android 可安装产物。对于项目的依赖p4a 支持两种类型类型说明维护者Recipe以 p4a 自定义格式编写的安装脚本。用于安装无法通过 pip 拉取的 C/C 或其他软件或可通过 pip 安装但在 Android 上默认会失败的软件主要由 p4a 源码树内的贡献者维护Python package任何无需调整即可在 Android 上工作的普通 pip Python 包上游 pip 生态p4a 会将任何依赖优先映射到内部 Recipe若存在否则回退到 pip从外部源常规获取。这一映射逻辑可以在 pythonforandroid/graph.py 中看到端倪构建依赖图时会对每个依赖名尝试Recipe.get_recipe(name, ctx)如果配方不存在抛出ValueError则“假设它可以通过 pip 安装且无额外依赖”。6.2 依赖收集--requirements 与 pep517 扫描以p4a apk命令触发的构建流程中Python 包相关部分大致如下指定项目目录用户指定一个项目文件夹它可以是仅含 Python 脚本和main.py的简单目录也可以带pyproject.toml以进行标准化安装。收集依赖依赖来源有两个通过--requirements参数直接给出包名列表或 pip 风格 URL可选地p4a 借助 pep517 库从项目目录存在pyproject.toml或setup.py时自动扫描依赖。仓库中 pythonforandroid/pythonpackage.py 正是负责这类包元数据操作的工具模块获取包名、依赖列表等。映射 Recipe收集到的依赖若存在对应 Recipe 则映射过去否则保留为外部普通包引用。构建 Recipe所有映射到 Recipe 的依赖通过 p4a 内部机制构建是否间接使用 pip 取决于配方是否封装了 Python 包。6.3 标准化安装 vs 简单拷贝第 5 步是整个流程的分叉点若用户指定了标准化安装方式会以交叉编译环境CC/CFLAGS等指向正确工具链运行项目的setup.py/构建系统并设置自定义 site-packages 位置。实际命令是项目目录中的pip install .附带额外选项用-cconstraints 文件锁定所有已由 Recipe 安装的依赖防止 pip 重复安装通过--no-build-isolation关闭构建隔离避免 pip 自行重装 Recipe 包。这些选项在 pythonforandroid/build.py 的run_pymodules_install实现中有对应体现安装模块时使用--upgrade --ignore-installed --no-deps --disable-pip-version-check --only-binary:all:等参数并对项目目录执行pip install . --no-deps --only-binary:all:。若未指定标准化构建方式p4a 直接安装所有未映射到 Recipe 的剩余依赖并把用户项目原样拷贝进去此阶段会忽略用户项目的setup.py/pyproject.toml。调用 Gradle 打包最后Google 的 Gradle 被调用来把一切打包成.apk。6.4 无需 Recipe 也能工作的前提条件一个 Python 包在 p4a 中无需 Recipe 即可正常工作需要满足以下条件CONTRIBUTING.md 原文要点它也能在 Linux ARM 上构建若使用原生代码不使用 NDK 中不可用的 API若使用原生代码不使用工具链不接受的怪异编译标志能够配合交叉编译工作。反之如果一个包在交叉编译环境下“水土不服”p4a 开发者往往选择创建 Recipe 打补丁而不是推动上游修复——因为 p4a 相对小众niche上游通常没有动力专门适配 Android。6.5 关于交叉编译的现实约束目前至少据文档所知没有一个简便途径让包感知自己正被交叉编译唯一的线索是检查被设置的CC编译器或检测正在针对 Android 交叉编译这一事实。如果这导致包构建失败当前只能通过 Recipe 绕开。纯 Python 包大多开箱即用含原生代码的包则经常失败尤其是复杂包例如 numpy。6.6 关键限制Recipe 包不能被 pip 重装凡是映射到 p4a Recipe 的包不能被 pip 重新安装尤其是不能在构建隔离build isolation中作为依赖被重装如果 Recipe 的补丁仅用于修复运行时问题偶尔可能碰巧能装。因此文档给出的最佳实践是始终关闭构建隔离--no-build-isolation。这正好解释了 6.3 节中 pip 安装参数组合的由来。6.7 未来方向降低对 Recipe 的依赖CONTRIBUTING.md 最后展望了打包机制的未来p4a 整体上更倾向少用 Recipe 机制——Recipe 本质上是“一堆 workaround 的集合”。从外部看它略显 hackyp4a 通常会 pin 住 Recipe 所封装包的版本以保证补丁可靠应用这给 Recipe 的日常维护带来了持续工作量且这种模式扩展性有限但在找到更好的方案之前它是一个相当实用的过渡方案。理想情况下包应该能感知自己正被交叉编译尤其是针对 Android目前还没有成熟的机制。如果 pip 能直接执行 Recipe而不是 p4a 包装 pip 来做甚至可能让构建隔离重新生效——但这可能过于复杂。更现实的路径是逐步减少对 Recipe 的依赖、让更多包开箱即用例如通过自动设置交叉编译环境来实现。p4a 在这方面已经做过改进如自动配置交叉编译环境并欢迎任何改进建议。七、给贡献者的落地建议综合全文向 p4a 提交贡献的正确姿势可以浓缩为以下几点目标分支选develop所有 PR代码与文档都打向developmaster只存放稳定发布。版本号看日期当前版本形如YYYY.MM.DD如2026.05.09来源是 pythonforandroid/init.py。本地自检Python 侧跑tox -e pep8Java 侧在有 Java 17 时跑make java-lint修复用make java-lint-fix没有 Java 17 时跑make docker/java-lint与make docker/java-lint-fix。测试覆盖完整的本地测试用tox[tox.ini](https://link.gitcode.com/i/4dfdde3ff430136e31088a230edea179)中py3环境还会跑 coverage 统计注意tests/test_pythonpackage.py运行时间过长日常可跳过。理解依赖双轨制新增一个依赖时先判断它是“可直接 pip 安装的普通包”还是“需要 Recipe 打补丁的包”两者的处理路径在 pythonforandroid/build.py 的run_pymodules_install与 pythonforandroid/recipe.py 的Recipe基类中截然不同。如果你希望深入贡献具体模块推荐从仓库中三类文件入手核心构建逻辑pythonforandroid/build.py、pythonforandroid/recipe.py、pythonforandroid/graph.py、100 个配方目录pythonforandroid/recipes/ 下每个子目录一个__init__.py以及测试用例tests/ 与 tests/recipes/。赞分享开发工具构建工具移动开发【免费下载链接】python-for-androidTurn your Python application into an Android APK项目地址https://gitcode.com/gh_mirrors/py/python-for-android点击查看免费下载相关推荐rippledxrpld贡献指南深度解析分支策略、PR 规范、代码契约与发布流程全掌握rippledxrpld贡献指南深度解析分支策略、PR 规范、代码契约与发布流程全掌握 本篇技术指南以 rippled 仓库根目录的 CONTRIBUTI区块链MonoGame 贡献指南全解分支策略、PR 流程、代码红线与许可规范MonoGame 贡献指南全解分支策略、PR 流程、代码红线与许可规范 MonoGame 是一个用于创建跨平台游戏的 .NET 框架自 2009 年起由数百游戏开发图形学Pix2Story依赖管理requirements.txt与pip包版本控制策略Pix2Story依赖管理requirements.txt与pip包版本控制策略 在开源项目开发中依赖管理是确保项目稳定性和可复现性的关键环节。Pix2St示例工程上一篇如何彻底清除显卡驱动残留Display Driver Uninstaller (DDU) 深度解析下一篇任务与查询的完整性校验Ontology Playground 的 questQueryValidator 质量保障指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
ConvNeXt-Tiny工业部署全链路指南:从架构原理到边缘落地 1. 为什么ConvNeXt-Tiny不是“又一个CNN复刻”——它本质是一场架构范式的静默迁移你可能已经见过太多标题里带“革命”“颠覆”“重磅”的模型介绍,点进去却发现不过是ResNet加了个注意力、ViT换了个patch size。但ConvNeXt-Tiny不一样——它不是在旧框架上修修补补… · 2026/9/25 14:37:49
用 ASP 实现 Access 数据库分页显示:TaoToken 配置与调试要点 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 14:37:49
html-anything 会议纪要技能模板解析:从 SKILL.md 元数据到单文件 HTML 的生成链路 AI 应用人工智能AI AgentAI 写作媒体生成 【免费下载链接】html-anything ✨ The agentic HTML editor — your local AI agent writes the HTML, you ship it. 🚀 75 Skills 9 Surfaces (magazine deck poster XHS / tweet prototype data report Hyperfram… · 2026/9/25 14:37:49
多协议以太网温湿度变送器在楼宇自控中的选型与部署要点 作为在楼宇自控行业摸爬滚打十几年的老工程师,这几年感触最深的变化,就是温湿度变送器这类最基础的传感设备,正在从“能测就行”快速转向“能接入、能互通、能联动”。越来越多的智慧楼宇项目在采购温湿度变送器时,已经不满足于传… · 2026/9/25 15:10:40
瀚高数据库抽取工具选型与实战:从pg_dump到逻辑复制 简介:面向Oracle数据库向瀚高(HGDB)迁移与同步场景的专用抽取工具,适合需要完成数据库升级、异构数据迁移或双库一致维护的DBA与实施人员。工具围绕ETL流程设计,支持从Oracle抽取数据、自动进行类型与结构转换后写入瀚… · 2026/9/25 15:10:34
SoC低功耗唤醒失败排查:PLL锁定后系统无响应的根因与解决 1. 唤醒失败的现场:PLL锁定灯亮了,系统却像死机一样如果你做过SoC低功耗相关的开发,大概率遇到过这种让人抓狂的场景:调试串口打印出PLL的LOCK位已经置1,时钟树看起来一切正常,但CPU就是卡在唤醒流程里出不… · 2026/9/25 15:10:34
键盘按住只能输入一次?从系统设置到硬件固件的完整排查指南 你按住键盘上的 A 键不放,屏幕上的光标却只肯蹦出一个 a,想输入一排 aaaa 必须靠手速一下一下去敲。上网一搜"解决键盘每个键只能按一次",能发现一堆人遇到同样的问题,而且结论千奇百怪:有人说键盘坏了&… · 2026/9/25 15:10:27
从 AI 图到可编辑场景:Agent Sprite Forge 导出 Godot TileMap 全流程指南 从 AI 图到可编辑场景:Agent Sprite Forge 导出 Godot TileMap 全流程指南 【免费下载链接】agent-sprite-forge Agent Skill for generating 2D sprite sheets and map, transparent PNG frames, and animated GIFs from prompts. 项目地址: https://gitcode.com… · 2026/9/25 15:10:27
STM32CubeMX 6.14全流程实战:从下载安装到代码生成与避坑指南 1. 为什么STM32CubeMX 6.14值得单独写一篇全流程搞STM32开发的人,绕不开STM32CubeMX这个工具。我最早用的是标准外设库,后来转到HAL库,再到现在基本所有新项目都从CubeMX起步。说实话,这个工具从早期的4.x版本到现在的6.14&#x… · 2026/9/25 15:10:27
创维E900V22D刷机全攻略:S905L3SB芯片兼容性解析与救砖实战 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:31
MQTT协议原理与Broker服务器搭建实战:从Mosquitto到EMQX /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/25 1:00:37