Pygame Android build: missing SIMD blitter symbols cause APK crash at runtime
Maintainer thường phản hồi trong vòng 1 ngày
Chưa có ai nhận issue này.
Đánh giá
- Độ khó
- 2/5
- Thời gian dự kiến
- 1-3 giờ
- Mức phù hợp với người mới
- 62/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Lĩnh vực
- build-system, mobile
Hướng nghiên cứu
Bắt đầu từ pythonforandroid/recipes/pygame/init.py, nơi recipe tải buildconfig/Setup.Android.SDL2.in và thiết lập dòng cho module surface. So sánh dòng đó với mẫu Setup chuẩn của SDL2 để xác nhận thiếu các nguồn simd_blitters_sse2.c và simd_blitters_avx2.c. Hoàn thành khi module surface của Android bao gồm cả hai tệp và các lỗi symbol của surface.so không còn xuất hiện trong bản build.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
Pygame Android build: missing SIMD blitter symbols cause APK crash at runtime
Summary
When building a Pygame application for Android using Buildozer and python-for-android, the APK was generated successfully but crashed immediately after startup.
The problem was caused by missing SIMD source files in the Android-specific Pygame surface module configuration.
Adding both missing source files to the surface module resolved the problem. The APK was subsequently tested successfully on a physical Android device.
I would like to share this finding and ask whether the Android-specific configuration could be updated upstream.
Environment
- Linux (Debian 13)
- Buildozer
- python-for-android
- Pygame
- SDL2
- Android NDK
- Architectures:
arm64-v8aandarmeabi-v7a - Test device: Samsung Galaxy A20
- Android version: 11
Symptoms
The first runtime error was:
ImportError: dlopen failed: cannot locate symbol
"alphablit_alpha_sse2_argb_surf_alpha"
referenced by ".../pygame/surface.so"
This was followed by:
NotImplementedError: display module not available
After adding the SSE2 source file, the first error disappeared, but another missing symbol was reported:
dlopen failed: cannot locate symbol "pg_has_avx2"
referenced by ".../pygame/surface.so"
Root cause
The Android-specific Pygame build configuration did not include two source files that are present in the standard Pygame SDL2 configuration:
src_c/simd_blitters_sse2.csrc_c/simd_blitters_avx2.c
The relevant configuration is generated by the python-for-android Pygame recipe:
pythonforandroid/recipes/pygame/__init__.py
The recipe reads the Android template using:
setup_template = open(join("buildconfig", "Setup.Android.SDL2.in")).read()
The original Android surface module configuration was:
surface src_c/surface.c src_c/alphablit.c src_c/surface_fill.c $(SDL) $(DEBUG)
The standard configuration includes the SIMD source files:
surface src_c/simd_blitters_sse2.c src_c/simd_blitters_avx2.c src_c/surface.c src_c/alphablit.c src_c/surface_fill.c $(SDL) $(DEBUG)
Why both files are required
The first missing symbol:
alphablit_alpha_sse2_argb_surf_alpha
is implemented in simd_blitters_sse2.c.
Although the filename contains SSE2, this source also provides ARM NEON support through sse2neon.h.
The second missing symbol:
pg_has_avx2
is implemented in simd_blitters_avx2.c.
Although ARM devices do not support AVX2, the function itself is still referenced by alphablit.c. Its implementation returns 0 when AVX2 is unavailable.
Therefore, the AVX2 source file must also be compiled so that the referenced symbol is available.
Working solution
The following additional line was inserted into the python-for-android Pygame recipe, immediately after loading the Android setup template:
setup_template = setup_template.replace(
"surface src_c/surface.c",
"surface src_c/simd_blitters_sse2.c src_c/simd_blitters_avx2.c src_c/surface.c"
)
This changes the generated surface module configuration to include both missing source files.
Reproducible repair script
To make the modification reproducible after a Buildozer clean operation, the following script can be placed in the root directory of a Buildozer project.
Filename: repair_pygame_android.sh
#!/bin/bash
set -e
RECIPE=".buildozer/android/platform/python-for-android/pythonforandroid/recipes/pygame/__init__.py"
echo "=== Pygame Android Repair ==="
if [ ! -f "$RECIPE" ]; then
echo "ERROR: Pygame recipe not found!"
exit 1
fi
python - "$RECIPE" <<'PY'
import sys
from pathlib import Path
path = Path(sys.argv[1])
content = path.read_text()
old = 'setup_template = open(join("buildconfig", "Setup.Android.SDL2.in")).read()'
new = old + '\n setup_template = setup_template.replace("surface src_c/surface.c", "surface src_c/simd_blitters_sse2.c src_c/simd_blitters_avx2.c src_c/surface.c")'
if new in content:
print("Patch already present.")
elif old in content:
path.write_text(content.replace(old, new, 1))
print("Pygame recipe successfully patched.")
else:
print("ERROR: Expected code line not found. Nothing changed.")
sys.exit(1)
PY
echo "=== Repair completed ==="
Make the script executable:
chmod +x repair_pygame_android.sh
Build procedure
The following sequence was used successfully:
# 1. Clean the Android build
buildozer android clean
# 2. Restore the Pygame recipe modification
./repair_pygame_android.sh
# 3. Build the APK
buildozer -v android debug
Important: The repair script must be executed after buildozer android clean and before building the APK. A clean operation can remove the modified python-for-android checkout.
Result
The APK was built successfully for both Android architectures:
arm64-v8aarmeabi-v7a
Buildozer reported:
# Android packaging done!
# APK ... available in the bin directory
The resulting APK was installed and tested on a Samsung Galaxy A20 running Android 11.
The application started successfully and the original Pygame import errors were resolved.
Question for the maintainers
Would it be possible to include both SIMD source files in the Android-specific Pygame surface module configuration by default?
The standard Pygame SDL2 configuration already includes these files, while the Android-specific configuration appears to omit them.
Including the required sources directly in the Android recipe could prevent other developers from encountering the same runtime errors.
Thank you for maintaining python-for-android!
- Ngôn ngữ chính
- Python
- Star
- 8.9k
- Fork
- 2.1k
- Merge trung bình
- 2 ngày 16 giờ
- Pull request đã merge (30 ngày)
- 12
Chuẩn bị môi trường
- Có Dockerfile hoặc tệp Docker Compose
- Không có mẫu pull request
- Đọc hướng dẫn đóng góp
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của kivy/python-for-android
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
kivy/python-for-android#3335 · 1 bình luận · 3 reaction ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Documentation easy
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 75/100
kivy/python-for-android#3326 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Documentation easy Priority: Low
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 88/100
kivy/python-for-android#3299 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
find: /usr/bin/echo: No such file or directoryCó thể đã có người làm @AndreMiras đã nhận hôm nay. Đang mở
kivy/python-for-android#3404 · 1 bình luận · 2 reaction · 1 người được giao ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 20/100
kivy/python-for-android#3397 · 11 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của kivy/python-for-android
Issue tương tự
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
enhancement good first issue
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
elviskahoro/sdk-python-attio#144 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 84/100
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 72/100
Maintainer thường phản hồi trong vòng 1 ngày
-
RenyiELBO raises TypeError when model has no sample sitesCó thể đã có người làm @alibb007 đã nhận hôm nay. Đang mở
Độ khó 1/5 Dưới một giờ Mức phù hợp với người mới 85/100
Maintainer thường phản hồi trong vòng 1 ngày