diff options
author | Shyamnath Premnadh <Shyamnath.Premnadh@qt.io> | 2023-09-01 16:13:35 +0200 |
---|---|---|
committer | Shyamnath Premnadh <Shyamnath.Premnadh@qt.io> | 2023-09-08 19:17:25 +0200 |
commit | 7f4245a4cf3cdad151f0f6677fe92cbef3bb9be5 (patch) | |
tree | 963f432bdd2dd828f3ac532f311ab6b5f692fcad /sources/pyside-tools | |
parent | b6abfbedef444ab15f5340c5edfef7acfa06dc7f (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')
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() |