aboutsummaryrefslogtreecommitdiffstats
path: root/sources/pyside-tools
diff options
context:
space:
mode:
authorShyamnath Premnadh <Shyamnath.Premnadh@qt.io>2023-09-01 16:13:35 +0200
committerShyamnath Premnadh <Shyamnath.Premnadh@qt.io>2023-09-08 19:17:25 +0200
commit7f4245a4cf3cdad151f0f6677fe92cbef3bb9be5 (patch)
tree963f432bdd2dd828f3ac532f311ab6b5f692fcad /sources/pyside-tools
parentb6abfbedef444ab15f5340c5edfef7acfa06dc7f (diff)
Android Deployment: Load required PySide6 modules on startup
- This is required for having callbacks from C++/CPython back to Python. One example of this is when shiboken class="native" methods are called . There are also other cases where we call back to a Python callable through a callback from the wrapper code generated by Shiboken. - The identified Qt modules are loaded by the python-for-android recipe for PySide6. Task-number: PYSIDE-1612 Change-Id: I5881ac2351fc0afb87367b4149f0f668ac1a8d37 Reviewed-by: Friedemann Kleint <Friedemann.Kleint@qt.io>
Diffstat (limited to 'sources/pyside-tools')
-rw-r--r--sources/pyside-tools/android_deploy.py24
-rw-r--r--sources/pyside-tools/deploy_lib/android/android_helper.py6
-rw-r--r--sources/pyside-tools/deploy_lib/android/recipes/PySide6/__init__.tmpl.py11
-rw-r--r--sources/pyside-tools/deploy_lib/android/recipes/shiboken6/__init__.tmpl.py6
4 files changed, 32 insertions, 15 deletions
diff --git a/sources/pyside-tools/android_deploy.py b/sources/pyside-tools/android_deploy.py
index 97ac523b4..f10834c12 100644
--- a/sources/pyside-tools/android_deploy.py
+++ b/sources/pyside-tools/android_deploy.py
@@ -117,6 +117,15 @@ def main(name: str = None, pyside_wheel: Path = None, shiboken_wheel: Path = Non
config.title = name
try:
+ # check which modules are needed
+ if not config.modules:
+ config.modules = find_pyside_modules(project_dir=config.project_dir,
+ extra_ignore_dirs=extra_ignore_dirs,
+ project_data=config.project_data)
+ logging.info("The following PySide modules were found from the python files of "
+ f"the project {config.modules}")
+ config.modules.extend(extra_modules)
+
# create recipes
# https://python-for-android.readthedocs.io/en/latest/recipes/
# These recipes are manually added through buildozer.spec file to be used by
@@ -126,7 +135,8 @@ def main(name: str = None, pyside_wheel: Path = None, shiboken_wheel: Path = Non
version = Wheel(config.wheel_pyside).version
create_recipe(version=version, component=f"PySide{MAJOR_VERSION}",
wheel_path=config.wheel_pyside,
- generated_files_path=generated_files_path)
+ generated_files_path=generated_files_path,
+ qt_modules=config.modules)
create_recipe(version=version, component=f"shiboken{MAJOR_VERSION}",
wheel_path=config.wheel_shiboken,
generated_files_path=generated_files_path)
@@ -140,18 +150,6 @@ def main(name: str = None, pyside_wheel: Path = None, shiboken_wheel: Path = Non
generated_files_path=generated_files_path)
config.jars_dir = (generated_files_path / "jar" / "PySide6" / "jar").resolve()
- # check which modules are needed
- # TODO: Optimize this based on the modules needed
- # check if other modules not supported by Android used and raise error
- if not config.modules:
- config.modules = find_pyside_modules(project_dir=config.project_dir,
- extra_ignore_dirs=extra_ignore_dirs,
- project_data=config.project_data)
- logging.info("The following PySide modules were found from the python files of "
- f"the project {config.modules}")
-
- config.modules.extend(extra_modules)
-
# find architecture from wheel name
if not config.arch:
arch = get_wheel_android_arch(wheel=config.wheel_pyside)
diff --git a/sources/pyside-tools/deploy_lib/android/android_helper.py b/sources/pyside-tools/deploy_lib/android/android_helper.py
index 514ac8b5d..3e74a7e79 100644
--- a/sources/pyside-tools/deploy_lib/android/android_helper.py
+++ b/sources/pyside-tools/deploy_lib/android/android_helper.py
@@ -5,7 +5,7 @@ import logging
import zipfile
from zipfile import ZipFile
from dataclasses import dataclass
-from typing import Set
+from typing import Set, List
from pathlib import Path
from jinja2 import Environment, FileSystemLoader
@@ -24,7 +24,8 @@ class AndroidData:
sdk_path: Path
-def create_recipe(version: str, component: str, wheel_path: str, generated_files_path: Path):
+def create_recipe(version: str, component: str, wheel_path: str, generated_files_path: Path,
+ qt_modules: List[str] = None):
'''
Create python_for_android recipe for PySide6 and shiboken6
'''
@@ -34,6 +35,7 @@ def create_recipe(version: str, component: str, wheel_path: str, generated_files
content = template.render(
version=version,
wheel_path=wheel_path,
+ qt_modules=qt_modules
)
recipe_path = generated_files_path / "recipes" / f"{component}"
diff --git a/sources/pyside-tools/deploy_lib/android/recipes/PySide6/__init__.tmpl.py b/sources/pyside-tools/deploy_lib/android/recipes/PySide6/__init__.tmpl.py
index 289f2d62b..76d79710e 100644
--- a/sources/pyside-tools/deploy_lib/android/recipes/PySide6/__init__.tmpl.py
+++ b/sources/pyside-tools/deploy_lib/android/recipes/PySide6/__init__.tmpl.py
@@ -26,6 +26,17 @@ class PySideRecipe(PythonRecipe):
lib_dir = Path(f"{self.ctx.get_python_install_dir(arch.arch)}/PySide6/Qt/lib")
info("Copying Qt libraries to be loaded on startup")
shutil.copytree(lib_dir, self.ctx.get_libs_dir(arch.arch), dirs_exist_ok=True)
+ shutil.copyfile(lib_dir.parent.parent / "libpyside6.abi3.so",
+ Path(self.ctx.get_libs_dir(arch.arch)) / "libpyside6.abi3.so")
+
+ {%- for module in qt_modules %}
+ shutil.copyfile(lib_dir.parent.parent / f"Qt{{ module }}.abi3.so",
+ Path(self.ctx.get_libs_dir(arch.arch)) / f"Qt{{ module }}.abi3.so")
+ {% if module == "Qml" -%}
+ shutil.copyfile(lib_dir.parent.parent / "libpyside6qml.abi3.so",
+ Path(self.ctx.get_libs_dir(arch.arch)) / "libpyside6qml.abi3.so")
+ {% endif %}
+ {%- endfor -%}
info("Copying libc++_shared.so from SDK to be loaded on startup")
libcpp_path = f"{self.ctx.ndk.sysroot_lib_dir}/{arch.command_prefix}/libc++_shared.so"
diff --git a/sources/pyside-tools/deploy_lib/android/recipes/shiboken6/__init__.tmpl.py b/sources/pyside-tools/deploy_lib/android/recipes/shiboken6/__init__.tmpl.py
index afe094cbd..c1cc14967 100644
--- a/sources/pyside-tools/deploy_lib/android/recipes/shiboken6/__init__.tmpl.py
+++ b/sources/pyside-tools/deploy_lib/android/recipes/shiboken6/__init__.tmpl.py
@@ -4,6 +4,8 @@
from pythonforandroid.recipe import PythonRecipe
from pythonforandroid.logger import info
import zipfile
+import shutil
+from pathlib import Path
class ShibokenRecipe(PythonRecipe):
@@ -20,5 +22,9 @@ class ShibokenRecipe(PythonRecipe):
info('Unzip wheels and copy into {}'.format(self.ctx.get_python_install_dir(arch.arch)))
zip_ref.extractall(self.ctx.get_python_install_dir(arch.arch))
+ lib_dir = Path(f"{self.ctx.get_python_install_dir(arch.arch)}/shiboken6")
+ shutil.copyfile(lib_dir / "libshiboken6.abi3.so",
+ Path(self.ctx.get_libs_dir(arch.arch)) / "libshiboken6.abi3.so")
+
recipe = ShibokenRecipe()