Skip to content

Local Lottie Assets Not Rendering in Deployed Android APK #3083

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
auphof opened this issue Apr 23, 2024 · 2 comments · May be fixed by #4648
Open

Local Lottie Assets Not Rendering in Deployed Android APK #3083

auphof opened this issue Apr 23, 2024 · 2 comments · May be fixed by #4648
Labels
bug Something isn't working packaging Related to app packaging platform: android Specific to Android

Comments

@auphof
Copy link
Contributor

auphof commented Apr 23, 2024

Issue Description:
I am developing an Android application using Flet, where I'm trying to display a local Lottie asset (B.json) within a deployed APK.

# -------------------------------------------------------- 
# Assets folder tree view
# --------------------------------------------
# assets
# ├── B.json
# ├── icon.png
# └── images
#     ├── B.json
#     └── photo.png
  1. ❌ the local Lottie asset fails to display in a deployed APK,
  2. ❌ src for lottie asset is different on LINUX app vs APK app
  3. ✅ if src is a URL lottie asset renders correctly in both APK and LINUX app
  4. ✅ Image assets (png) render correctly in both APK and LINUX app

I've verified that the file B.json is indeed present in the APK app.zip. However the assets folder is not present in the temporary flutter build folder nor is the assets dir present in the pubspec.yaml

in modifying the flet build as follows I can make it work

diff --git a/sdk/python/packages/flet/src/flet/cli/commands/build.py b/sdk/python/packages/flet/src/flet/cli/commands/build.py
index 0006751..5f28698 100644
--- a/sdk/python/packages/flet/src/flet/cli/commands/build.py
+++ b/sdk/python/packages/flet/src/flet/cli/commands/build.py
@@ -432,6 +432,35 @@ class Command(BaseCommand):
         print("Customizing app icons and splash images...", end="")
         assets_path = python_app_path.joinpath("assets")
         if assets_path.exists():
+            if target_platform == "apk":
+                # Configure in APK for assets and update pubspec.yaml
+                # TODO: I expect this should apply to abb as well
+                flutter_apk_assets_dir = "assets"
+                flutter_apk_assets_path = self.flutter_dir / flutter_apk_assets_dir
+                flutter_apk_assets_path.mkdir(exist_ok=True)
+
+                def ignore_files(dir, files):
+                    # TODO: understand what should be excluded or included
+                    return [f for f in files if f.endswith(".png") or f == "temp"]
+
+                print(
+                    f"\nCopying additional APK assets:  {str(flutter_apk_assets_path)}"
+                )
+
+                # copy `assets` directory contents to the output directory ignoring some files
+                copy_tree(
+                    str(assets_path), str(flutter_apk_assets_path), ignore=ignore_files
+                )
+
+                print(
+                    f'PreBuild pubspec.yaml flutter assets: {pubspec["flutter"]["assets"]}'
+                )
+                if f"{flutter_apk_assets_dir}/" not in pubspec["flutter"]["assets"]:
+                    print(f"adding {flutter_apk_assets_dir}/ to pubspec.yaml")
+                    pubspec["flutter"]["assets"].append(f"{flutter_apk_assets_dir}/")
+                    print(
+                        f'Build pubspec.yaml flutter assets: {pubspec["flutter"]["assets"]}'
+                    )
+
             images_dir = "images"
             images_path = self.flutter_dir.joinpath(images_dir)
             images_path.mkdir(exist_ok=True)

Environment:

  • Flet version: 0.22.0
  • Android SDK version: android-33
  • NDK version: 25.2.9519653
  • Python-for-Android Distribution: 2024.01.21

Steps to Reproduce:

  1. Example Lottie Assets are downloaded and managed with the following script commands:
    # expect ./assets and ./assets/images directories to already exist
    wget https://github.com/raw/xvrh/lottie-flutter/master/example/assets/Mobilo/B.json" -O assets/B.json
    cp ./assets/B.json ./assets/images/B.json
  2. Build process includes setting up Android and NDK environments and using flet build apk with specified parameters.
  3. Deploy the APK to an Android device and test the renderering the local APK delivered Lottie file.

Expected Behavior:
The Lottie asset B.json should render as it does in the local linux development environment.
local Lottie asset src should be consistent across target deployments ie Linux

Actual Behavior:
The Lottie local asset does not render in the deployed APK,
while other assets such as local PNG's and Lottie URL asset appear correctly.

Code Example:
Here is the relevant portion of code where the Lottie assets are consumed for intended to display:
In the spirit of keeping this issue as brief as possible, the code is in a gist , The following gist creates a series of cards to find what permutations work and what if any errors are able to be captured see
https://gist.github.com/auphof/32f4f22328374d4e13ebc5a28206fb13

# The following gist creates a series of cards to find what permutations work and 
# what if any errors are able to be captured
# see https://gist.github.com/auphof/32f4f22328374d4e13ebc5a28206fb13

# Following work  with modified build for ✅APK but  not in ❌ WSL
lottie_card_b0 = create_lottie_card("B0", src="./assets/B.json")
lottie_card_b1 = create_lottie_card("B1", src="assets/B.json")

# Following Fail  still fail with modified ❌ APK but work in ✅ WSL
lottie_card_b2 = create_lottie_card("B2", src="B.json")
lottie_card_b5 = create_lottie_card("B5", src="/B.json")
lottie_card_b6 = create_lottie_card("B6", src="/images/B.json")

# Following  still fail with modified ❌ APK and  fail in ❌ WSL
lottie_card_b3 = create_lottie_card("B3", src="/assets/B.json")

Additional Context:

Attempts to Resolve:

  • Confirmed the presence of the asset within the APK.
  • Tested different paths for the Lottie asset.
  • Experimental Modified /sdk/python/packages/flet/src/flet/cli/commands/build.py

Any insights or alternative suggestions on how to resolve this issue would be greatly appreciated!

@auphof
Copy link
Contributor Author

auphof commented Apr 23, 2024

Have just noted this similar issue created at similar time flet-dev/flet-lottie#1

@blackCmd
Copy link

blackCmd commented Apr 23, 2024

Same problem with Lottie local file.

@ndonkoHenri ndonkoHenri added packaging Related to app packaging platform: android Specific to Android performance Related to Flet's performance. bug Something isn't working and removed performance Related to Flet's performance. labels Aug 21, 2024
@omamkaz omamkaz linked a pull request Jan 10, 2025 that will close this issue
4 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working packaging Related to app packaging platform: android Specific to Android
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants