Exclude assets from debug build on Flutter
Asked Answered
T

1

10

I have 8000+ files named (1.txt, 2.txt, 3.txt, etc) on my /assets/files folder. However I don't need all of them for my debug build. I only need the first 30 of them. Indeed, if I leave all those files on the assets folder the build time is huge.

I've learned there is a source set concept but it applies only to Java and Kotlin on Android Studio.

How can I exclude those exceeding files from debug build on Flutter?

Telegraph answered 27/2, 2020 at 19:5 Comment(2)
I'm interested to know as wellChaeta
any luck? I need a solution for this as wellMelaniamelanic
M
2

This 'problem' don't have any built-in solution yet (because of Dart and Flutter's design)

It was discussed on the following issue :
https://github.com/flutter/flutter/issues/79261

A bit hacky (but working) solution is to script the edition of your pubspec.yaml to update the assets to import before each build.
Since there is no 'pre-build' method yet with the Flutter Framework, you can use a Makefile to execute your script.

The following would work :

Step 1 - Update your pubspec.yaml to 'tag' the part of your assets you want to update.

flutter:
  assets:
    - assets/icons/icon.png
    - assets/translations/
    #DYN_ASSETS_START 
    - assets/images/
    #DYN_ASSETS_END

The tags here are obviously #DYN_ASSETS_START and #DYN_ASSETS_END

Step 2 - Create a Script to update your assets.
The following is just a working example, it can be strongly improved since I'm far away from being an expert in Bash.
The point of the script is to find the two tags which were set in your pubspec.yaml and update everything which is between those two tags.

#!/bin/bash

BUILD_MODE=$1
nl='
'

if [ "$BUILD_MODE" = "DEBUG" ]; then
    sed '/#DYN_ASSETS_START/,/#DYN_ASSETS_END/c\ 
    #DYN_ASSETS_START'"\\${nl}"'    - assets/images/image1.png'"\\${nl}"'    - assets/images/image2.png'"\\${nl}"'    - assets/images/image3.png'"\\${nl}"'    - assets/images/image4.png'"\\${nl}"'    - assets/images/image5.png'"\\${nl}"'    #DYN_ASSETS_END'"\\${nl}" pubspec.yaml > temp.yaml
    mv temp.yaml pubspec.yaml
elif [ "$BUILD_MODE" = "RELEASE" ]; then
    sed '/#DYN_ASSETS_START/,/#DYN_ASSETS_END/c\ 
    #DYN_ASSETS_START'"\\${nl}"'    - assets/images/'"\\${nl}"'    #DYN_ASSETS_END'"\\${nl}" pubspec.yaml > temp.yaml
    mv temp.yaml pubspec.yaml
fi

Disclaimer : this script is not sexy at all.
sed may not be the best tool to achieve this, the code is hard to maintain read and evolve, and I only tested it on MacOS (I doubt it'd work on another environment).
The goal of this script here is to give you an idea of a workaround fulfilling the author's request.

Step 4 - Create a Makefile.

build-android-debug:
    ./your_script.sh DEBUG
    flutter pub get
    flutter build apk

build-android-release:
    ./your_script.sh RELEASE
    flutter pub get
    flutter build apk --release

Step 5 - Trigger the Makefile Flow

make build-android-debug
Meakem answered 27/7, 2022 at 9:7 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.