A comprehensive Python library for creating Android-like applications with GUI support, improved error handling, and full type hints.
Project description
PyAndroid - Python Library for Android Development
A comprehensive Python library for Android application development with real GUI support. PyAndroid provides a Pythonic interface for building Android applications using familiar Python patterns, with cross-platform deployment capabilities.
โจ Key Features
- ๐ฑ True Android Development: Build real Android apps with Python
- ๐ป GUI Support: Actual graphical interfaces powered by Kivy
- ๐ฏ Pythonic API: Familiar Python syntax and patterns
- ๐ Cross-Platform: Deploy to Desktop, Android, and iOS
- ๐งฉ Component-Based: Activities, Intents, Views, and Layouts
- ๐ฆ Battery Included: File management, networking, logging utilities
- ๐ง Extensible: Easy to extend with custom components
- โ Well-Tested: Comprehensive test coverage
- ๐ Documented: Full API documentation and examples
๐ฅ Installation
Quick Install
pip install pyandroid-dev
With GUI Support (Recommended)
# Install with Kivy for GUI rendering
pip install "pyandroid[gui]"
Development Installation
# Install with all development tools
pip install "pyandroid[dev,gui]"
# Or install from source
git clone https://github.com/subhobhai943/pyandroid-dev.git
cd pyandroid-dev
pip install -e ".[gui]"
๐ Quick Start
Your First PyAndroid App
from pyandroid import AndroidApp, Activity
from pyandroid.ui import LinearLayout, Button, TextView
class MainActivity(Activity):
def __init__(self):
super().__init__("MainActivity")
self.counter = 0
def on_start(self):
# Create main layout
layout = LinearLayout("main_layout", orientation="vertical")
# Add title
title = TextView("title", "PyAndroid Counter App")
title.set_text_size(24)
title.set_text_color("#2196F3")
layout.add_view(title)
# Add counter display
self.counter_text = TextView("counter", "Count: 0")
self.counter_text.set_text_size(32)
layout.add_view(self.counter_text)
# Add increment button
button = Button("btn_increment", "Increment")
button.set_background_color("#4CAF50")
button.set_on_click_listener(self.increment_counter)
layout.add_view(button)
# Set layout
self.add_view("main_layout", layout)
def increment_counter(self, view):
self.counter += 1
self.counter_text.set_text(f"Count: {self.counter}")
# Create and run app
app = AndroidApp("Counter App", "com.example.counter")
app.register_activity("main", MainActivity)
app.start_activity("main")
app.run()
Run this code and a real window opens with a working GUI! ๐
๐ Documentation
Core Components
AndroidApp - Main Application
from pyandroid import AndroidApp
# Create app with GUI support (default)
app = AndroidApp("MyApp", "com.example.myapp")
# Create app without GUI (console mode)
app = AndroidApp("MyApp", "com.example.myapp", use_gui=False)
# Register activities
app.register_activity("main", MainActivity)
app.register_activity("settings", SettingsActivity)
# Start activity
app.start_activity("main")
# Run the app
app.run()
Activity - Application Screens
from pyandroid import Activity
from pyandroid.ui import LinearLayout, TextView
class MyActivity(Activity):
def __init__(self):
super().__init__("MyActivity")
def on_start(self):
"""Called when activity starts"""
# Setup UI here
pass
def on_resume(self):
"""Called when activity resumes"""
pass
def on_pause(self):
"""Called when activity pauses"""
pass
UI Components
TextView - Display Text
from pyandroid.ui import TextView
title = TextView("title", "Welcome!")
title.set_text_color("#FF5722")
title.set_text_size(28)
title.set_background_color("#FFFFFF")
Button - Interactive Element
from pyandroid.ui import Button
def on_click(view):
print("Button clicked!")
button = Button("my_button", "Click Me")
button.set_background_color("#2196F3")
button.set_text_color("#FFFFFF")
button.set_on_click_listener(on_click)
EditText - User Input
from pyandroid.ui import EditText
input_field = EditText("user_input", hint="Enter your name")
input_field.set_text("John")
text = input_field.get_text()
Layouts - Organize Views
from pyandroid.ui import LinearLayout, TextView, Button
# Vertical layout
layout = LinearLayout("main", orientation="vertical")
# Add children
layout.add_view(TextView("tv1", "Title"))
layout.add_view(Button("btn1", "Action"))
# Horizontal layout
row = LinearLayout("row", orientation="horizontal")
row.add_view(Button("btn2", "Left"))
row.add_view(Button("btn3", "Right"))
layout.add_view(row)
Utilities
File Management
from pyandroid.utils import FileManager
fm = FileManager("MyApp")
# JSON files
data = {"user": "Alice", "score": 95}
fm.save_json("data.json", data)
loaded = fm.load_json("data.json")
# Text files
fm.write_file("notes.txt", "My notes")
content = fm.read_file("notes.txt")
# List files
files = fm.list_files()
Networking
from pyandroid.utils import NetworkManager
net = NetworkManager("MyApp")
# Check connection
if net.is_connected():
# GET request
response = net.get("https://api.example.com/data")
# POST with JSON
data = {"name": "Bob", "age": 25}
result = net.post_json("https://api.example.com/users", data)
Logging
from pyandroid.utils import Logger
logger = Logger("MyApp")
logger.debug("Debug information")
logger.info("App started")
logger.warning("Low battery")
logger.error("Connection failed")
๐ฑ Building APK for Android
Convert your Python app to an Android APK:
Using Buildozer (Recommended)
# Install Buildozer
pip install buildozer
# Initialize
buildozer init
# Edit buildozer.spec
# requirements = python3,kivy,pyandroid
# Build APK (first time: 20-60 minutes)
buildozer -v android debug
# Deploy to connected device
buildozer android debug deploy run
Using python-for-android
pip install python-for-android
p4a apk --private . \
--package=com.example.myapp \
--name "My App" \
--version 0.1 \
--bootstrap=sdl2 \
--requirements=python3,kivy,pyandroid \
--permission INTERNET
๐งช Examples
Calculator App
A full calculator with GUI: pyandroid-calculator-app
Todo List App
from pyandroid import AndroidApp, Activity
from pyandroid.ui import LinearLayout, Button, EditText, TextView
class TodoActivity(Activity):
def __init__(self):
super().__init__("TodoActivity")
self.todos = []
def on_start(self):
layout = LinearLayout("main", orientation="vertical")
# Input area
self.input_field = EditText("todo_input", hint="Enter task")
layout.add_view(self.input_field)
# Add button
add_btn = Button("add_btn", "Add Task")
add_btn.set_on_click_listener(self.add_todo)
layout.add_view(add_btn)
# Todo list display
self.todo_display = TextView("todos", "No tasks yet")
layout.add_view(self.todo_display)
self.add_view("main", layout)
def add_todo(self, view):
task = self.input_field.get_text()
if task:
self.todos.append(task)
self.input_field.set_text("")
self.update_display()
def update_display(self):
text = "\n".join(f"{i+1}. {todo}" for i, todo in enumerate(self.todos))
self.todo_display.set_text(text or "No tasks yet")
app = AndroidApp("Todo List", "com.example.todo")
app.register_activity("main", TodoActivity)
app.start_activity("main")
app.run()
๐งฐ Testing
PyAndroid includes a comprehensive test suite:
# Run all tests
pytest tests/
# Run with coverage
pytest --cov=pyandroid tests/
# Run specific test file
pytest tests/test_core.py
๐ License
This project is licensed under the PyAndroid Custom License v1.0.
Key Points:
- โ Free for personal and educational use
- โ Open source requirement for derivative works
- โ Attribution required
- โ Commercial use requires permission
See LICENSE file for complete terms.
For commercial licensing: contact the maintainer
๐ฃ๏ธ Roadmap
v1.3 (Planned)
- WebView component
- SQLite database integration
- Enhanced animation support
- More layout types
v1.4 (Future)
- Push notifications
- Camera and media access
- Sensor integration
- Background services
- Material Design components
v2.0 (Vision)
- Hot reload support
- Visual UI builder
- Plugin system
- Cloud backend integration
๐ค Contributing
We welcome contributions! See CONTRIBUTING.md for guidelines.
- Fork the repository
- Create feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open Pull Request
๐ Stats
- ๐จโ๐ป Actively Maintained: Regular updates and improvements
- ๐ Well Documented: Comprehensive guides and API docs
- โ Tested: High test coverage
- ๐ Stable API: Semantic versioning
- ๐ฅ Community: Growing community of developers
โ FAQ
Q: Can I build real Android apps with this?
A: Yes! PyAndroid uses Kivy as a backend which can compile to native Android APKs.
Q: Do I need to know Java?
A: No! Write everything in Python.
Q: Is it production-ready?
A: PyAndroid is in beta. It's suitable for learning, prototyping, and small projects.
Q: Can I publish to Google Play?
A: Yes! Apps built with PyAndroid can be published to app stores.
Q: What's the performance like?
A: Good for most use cases. Performance-critical sections can use Cython.
๐ Support
- ๐ Report Bugs
- ๐ก Request Features
- ๐ฌ Discussions
- ๐ Wiki
- โญ Star this repo
๐ Resources
- Official Documentation
- Tutorial Series
- Example Apps
- API Reference
- Kivy Documentation
- Buildozer Documentation
๐ Star History
If you find PyAndroid useful, please star the repository! โญ
๐ Built With PyAndroid
Showcase your app! Open an issue to add your project here.
๐ Changelog
v1.2.0 (2025-11-09)
- โจ Added comprehensive test suite
- ๐ฆ Prepared for PyPI deployment
- ๐ Added custom license
- ๐ Added GitHub Actions CI/CD
- ๐ Enhanced documentation
- ๐ Bug fixes and improvements
v1.1.0 (2025-11-09)
- โจ Added Kivy backend for GUI rendering
- ๐ฑ Real graphical interface support
- ๐ Cross-platform desktop and Android support
- ๐ Updated documentation
v1.0.0 (2024-10-24)
- ๐ Initial release
- ๐ฆ Core Android components (App, Activity, Intent)
- ๐จ Complete UI framework (Views, Layouts, Widgets)
- ๐ ๏ธ Utility classes (Logger, FileManager, NetworkManager)
Made with โค๏ธ by Subhobhai
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyandroid_dev-1.4.0.tar.gz.
File metadata
- Download URL: pyandroid_dev-1.4.0.tar.gz
- Upload date:
- Size: 23.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8c777c73b238336e491215c07741335c6dd6939dc025415904dedaac19e2f022
|
|
| MD5 |
849e947448550b1a7d7c4edf255dada1
|
|
| BLAKE2b-256 |
4a38caf436f7e3ba15364bfa2e0c65afec3981a85f5dd4e8ea4a8c864fad1c5d
|
Provenance
The following attestation bundles were made for pyandroid_dev-1.4.0.tar.gz:
Publisher:
publish-to-pypi.yml on subhobhai943/pyandroid-dev
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyandroid_dev-1.4.0.tar.gz -
Subject digest:
8c777c73b238336e491215c07741335c6dd6939dc025415904dedaac19e2f022 - Sigstore transparency entry: 697446678
- Sigstore integration time:
-
Permalink:
subhobhai943/pyandroid-dev@05a6089fd83349e03cdaa6c1457116a92d909e35 -
Branch / Tag:
refs/tags/v1.4.0 - Owner: https://github.com/subhobhai943
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@05a6089fd83349e03cdaa6c1457116a92d909e35 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyandroid_dev-1.4.0-py3-none-any.whl.
File metadata
- Download URL: pyandroid_dev-1.4.0-py3-none-any.whl
- Upload date:
- Size: 19.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8ffdb72b4af0134484657e93bdc1e3d0198e0481db06cccc44dbdabfaec42c88
|
|
| MD5 |
8de6c9ef157557d42547c4d337dae44d
|
|
| BLAKE2b-256 |
5fc1ac23484411b36d26999b8c3a5eaf4528fac52e8b2d37cb2b2763439a85dd
|
Provenance
The following attestation bundles were made for pyandroid_dev-1.4.0-py3-none-any.whl:
Publisher:
publish-to-pypi.yml on subhobhai943/pyandroid-dev
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyandroid_dev-1.4.0-py3-none-any.whl -
Subject digest:
8ffdb72b4af0134484657e93bdc1e3d0198e0481db06cccc44dbdabfaec42c88 - Sigstore transparency entry: 697446687
- Sigstore integration time:
-
Permalink:
subhobhai943/pyandroid-dev@05a6089fd83349e03cdaa6c1457116a92d909e35 -
Branch / Tag:
refs/tags/v1.4.0 - Owner: https://github.com/subhobhai943
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-to-pypi.yml@05a6089fd83349e03cdaa6c1457116a92d909e35 -
Trigger Event:
push
-
Statement type: