惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Secure Thoughts
T
The Exploit Database - CXSecurity.com
C
CERT Recently Published Vulnerability Notes
P
Palo Alto Networks Blog
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
T
Tenable Blog
F
Full Disclosure
TaoSecurity Blog
TaoSecurity Blog
I
InfoQ
AI
AI
云风的 BLOG
云风的 BLOG
K
Kaspersky official blog
Microsoft Azure Blog
Microsoft Azure Blog
S
SegmentFault 最新的问题
Y
Y Combinator Blog
GbyAI
GbyAI
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
P
Privacy International News Feed
aimingoo的专栏
aimingoo的专栏
罗磊的独立博客
酷 壳 – CoolShell
酷 壳 – CoolShell
I
Intezer
L
Lohrmann on Cybersecurity
博客园_首页
量子位
Blog — PlanetScale
Blog — PlanetScale
The Last Watchdog
The Last Watchdog
Cisco Talos Blog
Cisco Talos Blog
博客园 - 叶小钗
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Help Net Security
Help Net Security
Security Archives - TechRepublic
Security Archives - TechRepublic
Apple Machine Learning Research
Apple Machine Learning Research
W
WeLiveSecurity
N
News and Events Feed by Topic
S
Schneier on Security
T
Tor Project blog
MongoDB | Blog
MongoDB | Blog
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
T
Threat Research - Cisco Blogs
H
Help Net Security
V
V2EX
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
S
Security @ Cisco Blogs
博客园 - Franky
有赞技术团队
有赞技术团队
Martin Fowler
Martin Fowler

博客园 - 张朋举

人到中年,主业稳定,如何靠副业稳妥增收? 看vip,crx插件【影视vip通行证】 tdengine influxdb 对比 免费 iotsharp相关表结构设计 2026 年,Vue 3 的 UI 组件库生态 MQTTX MQTT AI时代?彩票兑奖,这也太扯了! -豆包篇 AI时代?彩票兑奖,这也太扯了!-千问篇 iotsharp 和 iotgateway NUnit、xUnit、MSTest 怎么选 pgsql text varchar mock引擎,faker.js mock.js api工具apifox、apipost选择 技术分析:RemoteApp和Web 27寸显示器,最佳设置 IoTSharp深度解析:基于.NET生态的物联网平台架构与实践 千问 vs 豆包,视频下载浏览器插件,按下载量排名 avif 浏览器支持情况 Web 常用的图片格式选择 Apipost和Apifox哪个更适合团队使用? Apipost和Apifox的收费标准 Apipost 对比 Apifox
python打包apk
张朋举 · 2025-11-28 · via 博客园 - 张朋举

将 Python 代码打包成 Android 可执行程序(.apk 或 .aab),核心是通过「中间层框架」将 Python 运行时、代码与 Android 原生环境(Java/Kotlin)整合。由于 Android 系统原生不支持 Python 解释器,需借助第三方工具实现跨语言调用和打包。以下是 3 种主流方案(从易到难,覆盖不同场景),附详细步骤和注意事项:

  1. 环境准备:
    • 操作系统:Windows/macOS/Linux(推荐 Windows 或 Linux,兼容性更好);
    • 基础工具:Python 3.8+(建议 3.9/3.10,避免版本兼容问题)、JDK 11+(Android 开发必需)、Android SDK(含 Build Tools、API 级别 31+);
    • 可选工具:Android Studio(可视化配置 SDK / 模拟器,新手推荐)。
  2. 代码限制:
    • 避免使用依赖系统底层库的 Python 模块(如 pywin32psutil 部分功能);
    • 图形界面需用支持 Android 的框架(如 Kivy、PyQt for Android),不能用 Tkinter(仅桌面支持);
    • 第三方库优先选择纯 Python 实现(如 requestspandas),C 扩展库(如 numpy)需确保框架支持编译。
  • Kivy:跨平台 Python 图形界面框架(支持 Android/iOS/ 桌面),提供原生级别的 UI 组件(按钮、输入框等),适配移动设备触摸操作;
  • Buildozer:自动化打包工具,一键将 Kivy 项目打包成 Android .apk(或 iOS .ipa),自动处理 Python 运行时、依赖库编译、Android 配置等流程。
# Windows/macOS/Linux 通用(建议先创建虚拟环境)
pip install virtualenv
virtualenv kivy-env
# 激活虚拟环境(Windows)
kivy-env\Scripts\activate
# 激活虚拟环境(macOS/Linux)
source kivy-env/bin/activate

# 安装 Kivy 及依赖
pip install kivy[base]  # 基础组件(含 UI、触摸支持)
pip install pillow  # 图像处理(可选,Kivy 推荐)
  • Windows:需先安装 WSL(Windows 子系统 Linux,推荐 Ubuntu 20.04),在 WSL 中操作(Buildozer 对 Windows 原生支持较差);
  • macOS/Linux:直接安装:
    # macOS 需先安装依赖(用 brew)
    brew install pkg-config sdl2 sdl2_image sdl2_ttf sdl2_mixer python3-pip
    # Linux(Ubuntu/Debian)需先安装依赖
    sudo apt-get update
    sudo apt-get install -y build-essential ccache git libncurses5-dev libssl-dev libffi-dev python3-dev python3-pip libsdl2-dev libsdl2-image-dev libsdl2-ttf-dev libsdl2-mixer-dev libjpeg-dev zlib1g-dev
    
    # 安装 Buildozer
    pip install buildozer

创建项目文件夹(如 android-python-demo),新建 2 个文件:

from kivy.app import App
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.boxlayout import BoxLayout

# 定义应用界面和逻辑
class MyAndroidApp(App):
    def build(self):
        # 布局(垂直排列)
        layout = BoxLayout(orientation='vertical', padding=50, spacing=30)
        
        # 文本标签
        self.label = Label(text="Python 打包 Android 测试", font_size=30)
        layout.add_widget(self.label)
        
        # 按钮(点击事件)
        button = Button(text="点击我", font_size=25, size_hint=(1, 0.2))
        button.bind(on_press=self.on_button_click)  # 绑定点击事件
        layout.add_widget(button)
        
        return layout
    
    # 按钮点击回调
    def on_button_click(self, instance):
        self.label.text = "点击成功!🎉"

# 运行应用
if __name__ == "__main__":
    MyAndroidApp().run()

在项目文件夹中执行以下命令,生成默认配置文件:

打开生成的 buildozer.spec,修改关键配置(其他保持默认):

# 应用名称(必填)
title = MyPythonApp
# 包名(Android 要求唯一,格式:com.用户名.应用名)
package.name = mypythonapp
# 应用版本
version = 0.1
# 主程序入口(默认 main.py,无需改)
source.dir = .
source.include_exts = py,png,jpg,kv,atlas
# Python 版本(建议 3.9)
requirements = python3,kivy,pillow
# Android SDK 版本(建议 31+)
android.api = 33
# Android 构建工具版本
android.buildTools = 33.0.2
# 应用图标(可选,需准备 512x512 的 png 图片,放在项目根目录)
# android.icon = %(source.dir)s/icon.png

在项目文件夹中执行打包命令(首次打包会下载 Android SDK、NDK 等依赖,约 1-3GB,需耐心等待):

buildozer android debug deploy run
  • 命令说明:
    • debug:生成调试版 .apk(无签名,可用于测试);
    • deploy:自动部署到连接的 Android 设备(需开启 USB 调试);
    • run:部署后自动运行应用。

打包成功后,.apk 文件路径:

项目文件夹/bin/mypythonapp-0.1-debug.apk
  • 可直接拷贝到 Android 设备安装测试,或用 Android Studio 模拟器运行。
  • 优势:操作简单(一键打包)、成熟稳定、支持复杂 UI 和触摸交互;
  • 局限:仅支持 Kivy 框架开发的项目,打包后的 .apk 体积较大(含 Python 运行时,约 10-30MB)。

BeeWare 是一套跨平台框架,核心是 Briefcase 工具,可将 Python 代码打包成 Android 原生应用(.apk)、iOS 应用、Windows 程序等。与 Kivy 不同,BeeWare 试图调用平台原生 UI 组件(如 Android 的 TextView、Button),体验更接近原生应用。

# 创建虚拟环境(推荐)
virtualenv beeware-env
activate beeware-env  # 激活环境(Windows/macOS/Linux 命令同方案 1)

# 安装 BeeWare 核心工具
pip install briefcase

按提示输入项目信息(示例):

  • Formal Name: MyBeeWareApp(应用全称)
  • App Name: mybeewareapp(包名)
  • Description: A Python app for Android
  • Author: Your Name
  • Author Email: your@email.com
  • URL: https://your-url.com
  • License: MIT
  • GUI Framework: Toga(BeeWare 内置的跨平台 UI 框架)
from toga import App, Box, Button, Label
from toga.style import Pack
from toga.style.pack import COLUMN, CENTER

class MyBeeWareApp(App):
    def startup(self):
        # 布局(垂直居中)
        main_box = Box(style=Pack(direction=COLUMN, alignment=CENTER, padding=50, spacing=30))
        
        # 文本标签
        self.label = Label("BeeWare 打包测试", style=Pack(font_size=30))
        main_box.add(self.label)
        
        # 按钮(点击事件)
        button = Button("点击", on_press=self.on_click, style=Pack(font_size=25, width=200))
        main_box.add(button)
        
        # 设置主窗口
        self.main_window = self.main_window(title=self.formal_name)
        self.main_window.content = main_box
        self.main_window.show()
    
    def on_click(self, widget):
        self.label.text = "原生体验!😊"

def main():
    return MyBeeWareApp()
cd mybeewareapp  # 进入项目根目录(briefcase new 创建的文件夹)
briefcase build android  # 首次执行会下载 Android 依赖
briefcase package android --debug

打包成功后,.apk 路径:

mybeewareapp/android/build/outputs/apk/debug/mybeewareapp-0.1-debug.apk
  • 优势:UI 更接近原生 Android 应用、.apk 体积比 Kivy 小(约 8-20MB)、支持更多 Python 库;
  • 局限:生态比 Kivy 年轻,部分复杂 UI 组件支持不足,文档相对较少。

Chaquopy 是一个 Android Studio 插件,允许在 Android 原生项目(Java/Kotlin)中直接调用 Python 代码,支持:

  • Python 代码与 Java/Kotlin 相互调用(如 Python 处理数据,Java 展示 UI);
  • 打包 Python 运行时和依赖库到 .apk/.aab 中;
  • 支持大多数纯 Python 库(如 requestspandas)和部分 C 扩展库(如 numpy)。

需要 Android 原生 UI(如 RecyclerView、Fragment)+ Python 核心逻辑(如数据分析、AI 模型推理)的混合开发项目。

  1. 安装 Android Studio(确保已配置 SDK、NDK);
  2. 新建 Android 原生项目(Empty Views Activity);
  3. 在项目级 build.gradle 中添加 Chaquopy 仓库:
    buildscript {
        repositories {
            google()
            mavenCentral()
            // 添加 Chaquopy 仓库
            maven { url "https://chaquo.com/maven" }
        }
        dependencies {
            classpath "com.android.tools.build:gradle:7.4.2"
            // 添加 Chaquopy 插件
            classpath "com.chaquo.python:gradle:15.0.1"  // 版本需与 Gradle 兼容
        }
    }
  4. 在模块级 build.gradle 中应用插件并配置 Python:
    plugins {
        id 'com.android.application'
        id 'com.chaquo.python'  // 应用 Chaquopy 插件
    }
    
    android {
        namespace "com.example.pythonandroid"
        compileSdk 33
    
        defaultConfig {
            applicationId "com.example.pythonandroid"
            minSdk 21
            targetSdk 33
            versionCode 1
            versionName "1.0"
    
            // 配置 Python
            python {
                buildPython "C:/Python39/python.exe"  // 你的 Python 路径(Windows)
                // buildPython "/usr/bin/python3"  // macOS/Linux 路径
                pip {
                    install "requests"  // 安装 Python 依赖库
                    install "numpy"
                }
            }
        }
  5. 同步 Gradle(Sync Now),完成 Chaquopy 配置。

在 app/src/main 下新建 python 文件夹,创建 mypython.py

# 供 Java/Kotlin 调用的 Python 函数
def add(a, b):
    return a + b

def process_data(data):
    # 示例:处理字符串数据
    return f"Python 处理结果:{data.upper()}"

在 Android 原生 Activity 中调用 Python 函数:

import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
import com.chaquo.python.Python;
import com.chaquo.python.android.AndroidPlatform;

public class MainActivity extends AppCompatActivity {
    private TextView resultText;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 初始化 Python 环境
        if (!Python.isStarted()) {
            Python.start(new AndroidPlatform(this));
        }

        // 获取 Python 实例和模块
        Python python = Python.getInstance();
        com.chaquo.python.PyObject pyModule = python.getModule("mypython");

        // 调用 Python 函数
        int sum = pyModule.callAttr("add", 10, 20).toInt();  // 调用 add(10,20)
        String dataResult = pyModule.callAttr("process_data", "hello android").toString();  // 调用 process_data

        // 显示结果
        resultText = findViewById(R.id.result_text);
        resultText.setText("sum: " + sum + "\n" + dataResult);
    }
}

直接用 Android Studio 的「Build → Build Bundle (s)/APK (s) → Build APK (s)」,生成的 .apk 路径:

app/build/outputs/apk/debug/app-debug.apk
  • 优势:完美融合 Android 原生开发、支持 Python 与 Java 双向通信、适合复杂原生 UI + Python 逻辑的场景;
  • 局限:配置复杂(需懂 Android 原生开发)、学习成本高、依赖 Chaquopy 插件(部分高级功能需付费)。
  • 原因:部分 Python 库含 C 扩展(如 numpy),需 Chaquopy/Kivy 支持交叉编译;
  • 解决方案:
    • 优先使用纯 Python 库;
    • Kivy 中需在 buildozer.spec 中添加 requirements = python3,kivy,numpy(Buildozer 会自动编译);
    • Chaquopy 支持大多数 C 扩展库,直接在 pip install 中添加即可。
  • 优化方案:
    • 移除不必要的依赖库(如仅用 Kivy 基础组件,不装 kivy[full]);
    • 启用 Buildozer 的 android.strip 配置(在 buildozer.spec 中设置 android.strip = True,移除调试符号);
    • 用 briefcase 打包(体积比 Kivy 小)。
  • 排查步骤:
    • 检查 Python 代码是否有语法错误(在桌面运行 main.py 测试);
    • 查看 Android 日志(用 Android Studio 的 Logcat,过滤 Python 相关日志);
    • 确保 minSdk 版本符合要求(Kivy/BeeWare 建议 minSdk ≥ 21)。
  • 解决方案:
    • Kivy:在 buildozer.spec 中添加权限,如 android.permissions = INTERNET,CAMERA
    • Chaquopy/Android Studio:在 AndroidManifest.xml 中添加权限,如 <uses-permission android:name="android.permission.INTERNET" />

如果是新手,优先选择 Kivy + Buildozer,快速实现 Python 代码打包 Android;如果需要原生 UI 体验,尝试 BeeWare;如果需与 Android 原生功能深度交互,选择 Chaquopy