ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

python-for-android 调试指南:从 `--debug` 日志、logcat 设备调试到 APK 解包排查

python-for-android 调试指南:从 `--debug` 日志、logcat 设备调试到 APK 解包排查 开发工具构建工具移动开发【免费下载链接】python-for-androidTurn your Python application into an Android APK项目地址https://gitcode.com/gh_mirrors/py/python-for-android点击查看免费下载本篇文章围绕 python-for-androidp4a官方 Troubleshooting 文档展开系统讲解三个层次的排错手段构建期用--debug拿到完整编译日志运行期用adb logcat抓取 Python 崩溃回溯打包后直接解包 APK 检查private.tar与libpybundle.so的内部结构。读完本文你将掌握一套从构建失败到运行崩溃再到产物异常的完整排查方法并了解 p4a 在 Android 上如何组织 Python 运行时与应用数据。一、构建期排错给任意 p4a 命令加--debugpython-for-android 的所有命令行子命令如create、apk、dist等都共享一个通用参数解析器其中包含--debug开关。在 pythonforandroid/toolchain.py 中可以看到它的定义generic_parser.add_argument( --debug, destdebug, actionstore_true, defaultFalse, helpDisplay debug output and all build info)也就是说给任意 python-for-android 命令追加--debug即可看到完整调试输出包括编译与打包阶段调用的所有外部工具NDK 编译器、Gradle、ant、sh 等的实际输出。例如python-for-android apk --debug --requirements python3,kivy --private /path/to/your/app为什么--debug有用构建过程涉及交叉编译、配方recipe补丁、Gradle 打包等多个环节正常模式下 p4a 只打印摘要信息开启--debug后所有外部命令的 stdout/stderr 会原样透传便于定位具体是哪一步、哪个工具失败。从源码看p4a 的工具链封装了大量sh命令调用见 pythonforandroid/util.py 中logger.debug的使用这些调试日志只有在--debug下才会完整输出。报告问题时的最佳实践如果你通过邮件或 Discord 向社区报告构建问题通常需要附上完整日志。文档建议将日志贴到 pastebin如https://pastebin.ubuntu.com/或 GitHub Gist 上再附上链接。完整的--debug日志比我构建失败了一句话更能帮助维护者快速定位问题。二、运行期排错在 Android 设备上抓取 logcat当 p4a 打包出的 APK 在手机上一打开就闪退时往往没有任何错误提示。此时的关键手段是logcatpython-for-android 会把 Python 的 stdout 与 stderr 重定向到 Android 系统的 logcat 流中因此应用的print输出、Python 异常回溯都会出现在 logcat 里。1. 准备工作开启开发者模式并连接设备在 Android 设备上进入设置 → 关于手机连续点击版本号直到提示已开启开发者模式在开发者选项中打开USB 调试用 USB 线连接电脑手机上应出现USB 调试已连接的授权通知点击允许在电脑上运行adb logcat即可开始查看系统日志。如果adb不在你的 PATH 中可以使用 SDK 自带的版本路径通常为/path/to/Android/SDK/platform-tools/adb2. 通过 p4a 调用 adb / logcat 的捷径p4a 封装了 SDK 内 adb 的调用即使 adb 不在 PATH 里也可以直接使用实现见 pythonforandroid/toolchain.pypython-for-android logcat或等价地python-for-android adb logcat从源码看logcat子命令实际就是执行adb logcatself._adb([logcat] args.unknown_args)而adb子命令会把所有参数原样透传给 adb 本身。这意味着你可以用它做更多调试任务例如列出已连接的设备python-for-android adb devices透传参数的特性也让python-for-android adb logcat可以带上原生 logcat 的全部过滤参数。3. 如何从 logcat 中找到 Python 崩溃信息logcat 会输出大量系统日志但 p4a 的 Python 日志都带有python标签因此可以只过滤该标签adb logcat -s python或用 grep 过滤adb logcat | grep python应用崩溃时你会在这里看到正常的 Python traceback与桌面端完全一样以及应用运行期间所有print语句的输出——按排查普通 Python 程序的方式诊断即可。补充Android 官方对 adb 与 logcat 有更详细的文档https://developer.android.com/tools/adb与https://developer.android.com/tools/logcat如需深入了解日志过滤、缓冲区等高级用法可进一步查阅。三、打包产物排查解包 APK 看内部结构当需要调试 python-for-android 本身或想确认 APK 里到底装了什么时可以直接解包 APK。1. APK 本质上是 zip 文件APK 就是 zip 压缩包直接用unzip解压即可unzip YourApk.apk解压后顶层目录固定包含以下文件Android 标准结构$ ls AndroidManifest.xml classes.dex META-INF res assets lib YourApk.apk resources.arsc各文件/目录的含义名称说明AndroidManifest.xml编译后的应用清单二进制 XML 格式classes.dexDalvik/ART 字节码即 Java/Kotlin 编译产物META-INF/签名与清单元数据目录res/编译后的资源文件resources.arsc资源索引表assets/原始资产目录p4a 的用户数据打包在这里lib/各 ABI 架构的原生库目录2. 用户应用数据在assets/private.tarp4a 会把用户应用的全部数据代码、图片、字体等打包成一个 tarball放在 assets 目录中$ cd assets $ ls private.tar解包它$ tar xf private.tar解压后即可看到全部用户数据。以 touchtracer 示例应用为例目录结构如下$ ls README.txt android.txt icon.png main.pyc p4a_env_vars.txt particle.png private.tar touchtracer.kv注意main.pyc——p4a 在打包时会用编译好的 hostpython 对 Python 源码做字节码编译见 pythonforandroid/recipes/python3/init.py 中compileall -b -f的调用因此 APK 内通常是.pyc而非.py。p4a_env_vars.txt则记录了打包时的环境变量信息便于排查构建配置。3. Python 运行时按 ABI 单独打包为lib/libpybundle.so由于 Android App Bundle 要求 ABI 相关的内容按架构分发p4a 把 Python 安装其中大部分是 ABI 相关的单独打包。例如arm64-v8a架构的 Python 运行时位于lib/arm64-v8a/libpybundle.solibpybundle.so本质上是一个 tarball只是因为打包规范要求以.so命名才叫这个名字。解包它$ tar xf libpybundle.so $ cd _python_bundle $ ls modules site-packages stdlib.zip解压后得到_python_bundle目录其内容是 Python 运行时的三大组成部分目录/文件说明modules/编译好的原生扩展模块.so与纯 Python 模块site-packages/通过 recipe 安装的第三方库如 kivy、numpy 等stdlib.zipPython 标准库的压缩包从构建源码看该 tarball 是由引导程序bootstrap的assemble_distribution流程生成的先为每个架构生成_python_bundle__arch/_python_bundle目录见 pythonforandroid/bootstrap.py再通过 pythonforandroid/bootstraps/common/build/build.py 的make_tar打包成libpybundle.so而在应用启动时PythonActivity.java会调用PythonUtil.unpackPyBundle把它解压到应用目录见 pythonforandroid/bootstraps/sdl2/build/src/main/java/org/kivy/android/PythonActivity.java。所以 APK 内的数据分为两层用户数据层assets/private.tar与架构无关的代码、资源、kv 文件、图片等运行时层lib/arch/libpybundle.so与 ABI 相关的 Python 解释器运行时与已安装模块。排查问题时可以分别检查这两层是否完整、版本是否匹配。四、常见错误速查FAQ关于常见错误的详细解答请直接查阅仓库根目录的 FAQ.md其中记录了大量社区反馈过的经典问题。这里摘录几个高频案例作为快速参考AttributeError: Context object has no attribute hostpython这是某些版本存在的已知 bug。解决办法是显式声明 python 依赖例如python-for-android apk --requirements python3,kivy ...使用 Buildozer 时同样需要在buildozer.spec的 requirements 中显式加上python3。linkname too long通常是因为构建目录里混入了超长文件名的内容典型场景是 p4a 目录中残留了未被排除的.buildozer目录例如之前用 Buildozer 构建过。删除该目录即可解决——本来也不应该把它打进 APK。Requested API target XX is not available表示 SDK 缺少对应的 platform 组件需要用sdkmanager或旧版android工具安装platforms;android-XXSSLError(Cant connect to HTTPS URL because the SSL module is not available.)说明 hostpython3 在编译时没有 SSL 支持。需要先安装 SSL 开发文件再清理构建后重新编译hostpython3 配方Ubuntu 系apt install libssl-dev p4a clean builds # 或 buildozer android cleanmacOSbrew install openssl p4a clean builds # 或 buildozer android cleanModuleNotFoundError: No module named _ctypes缺少 libffi 头文件Ubuntu 系安装libffi-dev后清理构建再重试即可。注意构建时若需保留原生库的调试符号以配合 gdb 等工具可使用--with-debug-symbols参数定义见 pythonforandroid/toolchain.py否则 p4a 会在打包时对.so做 strip 处理见 pythonforandroid/bootstrap.py。五、排查思路小结把三类手段串成一条完整的排错路径构建失败→ 在命令后追加--debug获取完整外部工具输出配合 FAQ 中的常见错误条目快速定位运行崩溃闪退→ 连接设备后使用python-for-android logcat或adb logcat -s python抓取 Python traceback产物异常/需要了解 APK 内部→unzip解包 APK分别检查assets/private.tar用户数据与lib/arch/libpybundle.soPython 运行时的内容完整性。本文所述机制均可在仓库源码中找到对应实现调试参数在 pythonforandroid/toolchain.pylogcat/adb 子命令在 pythonforandroid/toolchain.pyAPK 打包结构由 pythonforandroid/bootstraps/common/build/build.py 与各 bootstrap 的PythonActivity.java共同决定常见错误清单则维护在 FAQ.md。掌握这套方法后无论是自己排查还是向社区报告问题都能做到有的放矢。赞分享开发工具构建工具移动开发【免费下载链接】python-for-androidTurn your Python application into an Android APK项目地址https://gitcode.com/gh_mirrors/py/python-for-android点击查看免费下载相关推荐Thunderbird for Android 调试日志收集指南从开启 Debug 日志到 ADB 抓取 logcatThunderbird for Android 调试日志收集指南从开启 Debug 日志到 ADB 抓取 logcat 调试日志debug logs是诊断移动开发企业应用Kivy 在 Android 上运行与调试全指南打包、logcat 日志与 Android API 调用Kivy 在 Android 上运行与调试全指南打包、logcat 日志与 Android API 调用 导读 Kivy 是使用 Python 编写、可运行于跨平台移动开发桌面应用UI组件ALMA-7B-R核心功能揭秘Contrastive Preference Optimization技术原理解析ALMA 7B R核心功能揭秘Contrastive Preference Optimization技术原理解析 ALMA 7B R作为一款高效的开源语言模型上一篇JSON for Modern C 隐式类型转换 operator ValueType 详解下一篇【亲测免费】 DeepCFD安装与使用文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表