From a85ae7094b219cd1d79db09e2fa4cbe4333cf39f Mon Sep 17 00:00:00 2001 From: Alexey Edelev Date: Tue, 15 Jul 2025 11:56:16 +0200 Subject: [PATCH] Fix permission handling for internal modules Update the code that generates -android-dependencies.xml. Use the correct qt_internal_add_android_permission instead of setting permissions property manually. Amends f430c5ae81238b47939fca610f5d22ab030a4852 Change-Id: Icc46a54f6915bc344afe5507b3244225d750cb7c Reviewed-by: Alexandru Croitor --- cmake/QtAndroidHelpers.cmake | 25 ++---------- src/corelib/CMakeLists.txt | 7 +++- src/corelib/Qt6AndroidPermissionHelpers.cmake | 40 +++++++++++++++++++ .../networkinformation/android/CMakeLists.txt | 7 +--- .../tst_android_deployment_settings.cpp | 3 +- 5 files changed, 52 insertions(+), 30 deletions(-) diff --git a/cmake/QtAndroidHelpers.cmake b/cmake/QtAndroidHelpers.cmake index cb7d4716f12..b473c2c331b 100644 --- a/cmake/QtAndroidHelpers.cmake +++ b/cmake/QtAndroidHelpers.cmake @@ -191,21 +191,8 @@ function(qt_internal_android_dependencies_content target file_content_out) endif() # Android Permissions - if(arg_PERMISSIONS) - foreach(permission IN LISTS arg_PERMISSIONS) - # Check if the permission has also extra attributes in addition to the permission name - list(LENGTH permission permission_len) - if(permission_len EQUAL 1) - string(APPEND file_contents "\n") - elseif(permission_len EQUAL 2) - list(GET permission 0 name) - list(GET permission 1 extras) - string(APPEND file_contents "\n") - else() - message(FATAL_ERROR "Invalid permission format: ${permission} ${permission_len}") - endif() - endforeach() - endif() + _qt_internal_android_convert_permissions(permissions_string ${target} "DEPENDENCIESXML") + string(APPEND file_contents "${permissions_string}") # Android Features if(arg_FEATURES) @@ -482,14 +469,8 @@ function(qt_internal_android_add_interface_permissions target) return() endif() - set(postprocessed_permissions "") - foreach(permission IN LISTS permissions) - # TODO: skip processing extras for now, add them back once internal API - # will cover adding extras using internal function. - list(APPEND postprocessed_permissions "name\;${permission}") - endforeach() qt_internal_set_module_transitive_properties(${target} TYPE LINK PROPERTIES - INTERFACE_QT_ANDROID_PERMISSIONS "${postprocessed_permissions}") + INTERFACE_QT_ANDROID_PERMISSIONS "${permissions}") endfunction() # The function stores Android features that are required by the module target. diff --git a/src/corelib/CMakeLists.txt b/src/corelib/CMakeLists.txt index 249b9b8c1ee..cd3c03666d0 100644 --- a/src/corelib/CMakeLists.txt +++ b/src/corelib/CMakeLists.txt @@ -491,8 +491,11 @@ if(ANDROID) set_property(TARGET Core APPEND PROPERTY QT_ANDROID_LIB_DEPENDENCIES ${INSTALL_PLUGINSDIR}/platforms/libplugins_platforms_qtforandroid.so ) - set_property(TARGET Core APPEND PROPERTY QT_ANDROID_PERMISSIONS - android.permission.INTERNET android.permission.WRITE_EXTERNAL_STORAGE + qt_internal_add_android_permission(Core + NAME android.permission.WRITE_EXTERNAL_STORAGE + ) + qt_internal_add_android_permission(Core + NAME android.permission.INTERNET ) endif() diff --git a/src/corelib/Qt6AndroidPermissionHelpers.cmake b/src/corelib/Qt6AndroidPermissionHelpers.cmake index 7f851e14667..4e17a5ca83a 100644 --- a/src/corelib/Qt6AndroidPermissionHelpers.cmake +++ b/src/corelib/Qt6AndroidPermissionHelpers.cmake @@ -25,7 +25,47 @@ # # `XML` # Generate XML content compatible with AndroidManifest.xml. +# +# `DEPENDENCIESXML` +# Generate XML content compatible with -android-dependencies.xml. +# This format doesn't produce generator expression, so it should be used in +# the scope finalizer. function(_qt_internal_android_convert_permissions out_var target type) + if(type STREQUAL "DEPENDENCIESXML") + set(output "") + get_target_property(permissions ${target} QT_ANDROID_PERMISSIONS) + if(NOT permissions) + return() + endif() + foreach(permission IN LISTS permissions) + list(JOIN permission "=\"" permission) + list(LENGTH permission permission_length) + if(permission_length LESS 1) + message(FATAL_ERROR "Invalid QT_ANDROID_PERMISSIONS format for target" + " ${target}: ${arg_PERMISSIONS}") + endif() + + list(GET permission 0 permission_name) + string(APPEND output "\n") + endforeach() + set(${out_var} "${output}" PARENT_SCOPE) + return() + endif() + set(permissions_property "$") set(permissions_genex "$<$:") if(type STREQUAL "JSON") diff --git a/src/plugins/networkinformation/android/CMakeLists.txt b/src/plugins/networkinformation/android/CMakeLists.txt index 07d9201bbbd..c08f1c71d2c 100644 --- a/src/plugins/networkinformation/android/CMakeLists.txt +++ b/src/plugins/networkinformation/android/CMakeLists.txt @@ -38,9 +38,6 @@ set_property( jar/Qt${QtBase_VERSION_MAJOR}AndroidNetworkInformationBackend.jar ) -set_property( - TARGET - QAndroidNetworkInformationPlugin - APPEND PROPERTY QT_ANDROID_PERMISSIONS - android.permission.ACCESS_NETWORK_STATE +qt_internal_add_android_permission(QAndroidNetworkInformationPlugin + NAME android.permission.ACCESS_NETWORK_STATE ) diff --git a/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp b/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp index 571570e370f..9297958ba31 100644 --- a/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp +++ b/tests/auto/other/android/deployment_settings/tst_android_deployment_settings.cpp @@ -87,7 +87,8 @@ void tst_android_deployment_settings::DeploymentSettings_data() << "permissions" << "[{\"maxSdkVersion\":\"34\",\"minSdkVersion\":\"32\",\"name\":\"PERMISSION_WITH_" "ATTRIBUTES\"},{\"name\":\"PERMISSION_WITHOUT_ATTRIBUTES\"},{\"name\":\"android." - "permission.INTERNET\"},{\"name\":\"android.permission.WRITE_EXTERNAL_STORAGE\"}]"; + "permission.WRITE_EXTERNAL_STORAGE\"},{\"name\":\"android." + "permission.INTERNET\"}]"; } void tst_android_deployment_settings::DeploymentSettings()