当前位置: 首页 > article >正文

新版Python 3.13官方支持Android 5.0及以上版本:详细解读及开发指南

Python以其简洁易读的语法和强大的库而闻名,但长期以来,官方并未正式支持Android平台。如今,这道缺憾终于被填补!本文将详细解读Python官方如何将Python带到Android设备上,并为开发者提供全面的开发指南。

一、缘起

移动平台在计算领域的重要性日益凸显,Android作为全球占比最高的移动操作系统,其用户基数庞大。然而,CPython长期缺乏对Android的官方支持,这限制了Python在移动开发领域的应用。虽然Chaquopy、BeeWare和Kivy等第三方项目为Android提供了Python运行环境,但官方支持才能更好地保证稳定性和生态的繁荣。

二、技术挑战与解决方案:兼容性及构建

Android基于Linux内核和ELF二进制格式,但使用Bionic而非glibc作为C库实现,这导致其与其他Linux发行版缺乏二进制兼容性。幸运的是,Android与Linux在源码层面具有良好的兼容性。自2014年以来,大多数为Linux编译的C代码都能在Android上编译。

PEP 738提出,Python 3.13将Android作为Tier 3支持平台,最小支持版本为Android 5.0 (API level 21),覆盖99%的活跃设备。这需要解决以下技术挑战:

  • 构建工具: 使用Android NDK (Native Development Kit)进行编译,选择长期支持版本(例如r26)以保证稳定性;使用Gradle构建完整的可部署应用。

  • 架构支持: 目前,仅支持64位架构(arm64-v8a和x86_64),未来可能会扩展到32位架构。

  • 应用生命周期: Android应用主要使用Java或Kotlin开发,Python代码将以动态库libpython3.x.so的形式嵌入应用,通过JNI调用。

三、开发实践:嵌入式Python与模块支持

PEP 738建议将Python作为动态库嵌入Android应用,开发者无需安装程序。这种方式类似于Windows的嵌入式包。具体步骤如下:

  1. 编译Python库: 使用Android NDK编译CPython源码,生成libpython3.x.so库文件。

  2. 嵌入到Android应用: 在Android应用中使用dlopen加载libpython3.x.so,并通过JNI调用Python代码。

  3. 扩展模块链接: 所有Python扩展模块都必须显式链接libpython3.x.so

  4. 标准库支持: 部分标准库模块因依赖不可用的C API而在Android平台上不支持,例如cursesreadlinetkintermultiprocessing等。

四、平台模块与标准输出:sys和platform

sys模块的输出将发生改变:sys.stdoutsys.stderr将重定向到Android的Logcat,sys.stdin将始终返回EOF。platform模块将新增platform.android_ver()方法,返回包含Android版本号、API级别、制造商、型号、设备名和是否是模拟器的namedtuple。platform.system()将返回"Android"。

五、构建与发布:Android wheels

Android wheels将使用android_<api-level>_<abi>格式的标签,例如android_21_arm64_v8a。pip等安装工具应能够识别这些标签,类似于macOS的标签处理方式。这需要完善工具链,例如crossenvcibuildwheel,以及PyPI对Android wheel标签的支持,才能方便开发者构建和发布Android版本的Python包。

总结

PEP 738标志着Python官方正式支持Android平台的开端,这将极大地促进Python在移动端的应用和发展。未来,随着更多库和框架对Android的支持,以及开发者社区的参与,Python在Android上的生态将更加繁荣,为开发者提供更多可能性。官方文档和工具链的完善,将是进一步推动Python on Android的关键。

参考文献:https://peps.python.org/pep-0738/


http://www.kler.cn/a/404320.html

相关文章:

  • STM32芯片EXIT外部中断的配置与原理以及模板代码(标准库)
  • Vue 如何简单更快的对 TypeScript 中接口的理解?应用场景?
  • vue中路由缓存
  • 不需要双手离开键盘 vscode
  • 五天SpringCloud计划——DAY1之mybatis-plus的使用
  • 40分钟学 Go 语言高并发:并发下载器开发实战教程
  • element ui table 每行不同状态
  • 攻防世界 Web新手练习区
  • scPair:隐式特征选择提高single-cell paired多模态分析
  • pdf文档动态插入文字水印,45度角,旋转倾斜,位于文档中央,多行水印可插入中文
  • zookeeper is not a recognized option--解决方案
  • 浅谈Python之Matplotlib库
  • 设计模式之 享元模式
  • 什么命令可以查看数据库中表的结构
  • 2024年11月21日Github流行趋势
  • 【操作系统】Linux之网络编程(TCP)(头歌作业)
  • PostGres命令【常用维护,增删改查】
  • 华为服务器(iBMC)硬件监控指标解读
  • STM32--JLINK使用、下载问题记录
  • 如何开始学习嵌入式?嵌入式未来怎么样?如何应对职业危机?
  • LinuxC高级
  • 零差云控 ZeroErr eRob 电机 CAN、CANopen、EtherCAT、ROS2 机器人开发详细教程
  • 网络安全之接入控制
  • 机器人运动控制与编程:从轮式机器人到步行机器人的全景探索
  • 更改ArduSub水平位置控制器为ADRC
  • 数字排列.