python-for-android icon indicating copy to clipboard operation
python-for-android copied to clipboard

String argument from Buildozer not decoded.

Open RobertFlatt opened this issue 1 year ago • 5 comments

Checklist

  • [ x] the issue is indeed a bug and not a support request
  • [ x] issue doesn't already exist: https://github.com/kivy/python-for-android/issues
  • [x ] I have a short, runnable example that reproduces the issue
  • [ x] I reproduced the problem with the latest development version (p4a.branch = develop)
  • [ x] I used the grave accent (aka backticks) to format code or logs when appropriated

Versions

  • Python: 3.11
  • OS: WSL/Ubuntu
  • Kivy: 2.2.1
  • Cython: 0.29.33
  • OpenJDK: 17

Description

In buildozer.spec , setting:

android.extra_manifest_application_arguments = somefile.xml

Where somefile.xml contains:

android:usesCleartextTraffic="true"

results in an excaped string argument from Buildozer to p4a:

# Run ['/usr/bin/python3', '-m', 'pythonforandroid.toolchain', 'apk', '--bootstrap', 'sdl2', '--dist_name', 'oauth_gspread_example', '--name', 'OG', '--version', '0.1', '--package', 'org.reallyatest.oauth_gspread_example', '--minsdk', '21', '--ndk-api', '21', '--private', '/home/bobf/ex/oauth_gspread_example/.buildozer/android/app', '--permission', 'INTERNET', '--android-entrypoint', 'org.kivy.android.PythonActivity', '--android-apptheme', '@android:style/Theme.NoTitleBar', '--orientation', 'portrait', '--window', '--enable-androidx', '--copy-libs', '--add-source', '/home/bobf/ex/oauth_gspread_example/java', '--extra-manifest-application-arguments="android:usesCleartextTraffic=\\"true\\" "', '--arch', 'arm64-v8a', '--color=always', '--storage-dir=/home/bobf/ex/oauth_gspread_example/.buildozer/android/platform/build-arm64-v8a', '--ndk-api=21', '--ignore-setup-py', '--debug']

the key part to note is the value from somefile.xml has been quoted and escaped:

'--extra-manifest-application-arguments="android:usesCleartextTraffic=\\"true\\" "'

The value is written without interpretation to AndroidManifest.xml as an escaped string

 <application android:label="@string/app_name"
                 android:debuggable="true"
                 android:icon="@mipmap/icon"
                 android:allowBackup="true"
                 
                 "android:usesCleartextTraffic=\"true\" "
                 android:theme="@android:style/Theme.NoTitleBar"   

Gradle dies with:

AndroidManifest.xml; lineNumber: 53; columnNumber: 18; Element type "application" must be followed by either attribute specifications, ">" or "/>".

The last but one line in the AndroidManifest.xml snippet above should the same a the contents of somefile.xml

                 android:usesCleartextTraffic="true" 

Presumably, Buildozer has to quote and escape in order to pass the argument, so the issue is assumed to be a failure of the p4a parser to decode the argument.

Since we presumably know Buildozer's (quote and escape) encoding algorithm, it should be possible to successfully decode. A simpler approach might be a new p4a argument receiving the file name, and Buildozer supplying the file name.

I didn't test but this may also apply to the buildozer.spec android.extra_manifest_xml option.

RobertFlatt avatar Oct 26 '23 02:10 RobertFlatt

I want to bump this issue. It's a small, but it's annoying and easy to fix.

Snagovskiy-Denis avatar Mar 30 '24 14:03 Snagovskiy-Denis

I ran into this exact same issue trying to get this manifest permission put into my app as well... did you figure out any workaround for it?

snuq avatar Apr 21 '24 06:04 snuq

did you figure out any workaround for it?

I edited the AndroidManifest.tmpl.xml file in the local/project .buildozer directory and directly put my additional manifest arguments in it.

Snagovskiy-Denis avatar Apr 21 '24 07:04 Snagovskiy-Denis

did you figure out any workaround for it?

I edited the AndroidManifest.tmpl.xml file in the local/project .buildozer directory and directly put my additional manifest arguments in it.

i managed to figure out how to do this as well, not exactly easy to find this file tho! for anyone who might be coming her from a google search like i did, i found this manifest template at:

.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/<app name>/templates/AndroidManifest.tmpl.xml

snuq avatar Apr 21 '24 07:04 snuq

did you figure out any workaround for it?

I edited the AndroidManifest.tmpl.xml file in the local/project .buildozer directory and directly put my additional manifest arguments in it.

i managed to figure out how to do this as well, not exactly easy to find this file tho! for anyone who might be coming her from a google search like i did, i found this manifest template at:

.buildozer/android/platform/build-arm64-v8a_armeabi-v7a/dists/<app name>/templates/AndroidManifest.tmpl.xml

You could just run the find -name AndroidManifest.tmpl.xml command and edit the one that applies to your app. Nevertheless, I'm glad this helped you.

Snagovskiy-Denis avatar Apr 21 '24 07:04 Snagovskiy-Denis