Flutter - Cómo reducir el tamaño de la aplicación en el dispositivo

17

El tamaño de descarga de mi paquete de aplicaciones en Google PlayStore es de alrededor de 23 MB :

ingrese la descripción de la imagen aquí

Pero ¿por qué después de la instalación, el tamaño de la aplicación en el disco aumenta significativamente a 83 MB :

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

Alguna idea de por qué sucede esto, porque:

1) Archivo de activos de Flutter (imágenes, sonido y fuentes) en proyectos de solo 11 MB

2) Tamaño del código fuente de flutter (.dart) en el disco solo 1.4 MB

3) Recurso / icono nativo de Android (Res) solo alrededor de 800 KB

con respecto al complemento de flutter que uso a continuación:

dependencies:
  flutter:
    sdk: flutter
  flutter_localizations:
    sdk: flutter
  angles: ^1.0.1
  app_settings: ^1.0.5
  archive: ^2.0.8
  cached_network_image: ^1.1.1
  carousel_slider: ^1.3.0
  cron: ^0.2.1
  crypto: ^2.0.6
  cupertino_icons: ^0.1.2
  date_format: ^1.0.5
  device_id: ^0.1.3
  dio: ^2.0.0
  easy_alert: ^0.0.2
  localstorage: ^2.0.0
  audioplayers: ^0.13.1
  path_provider: ^1.1.0
  esys_flutter_share: ^1.0.2
  flutter_compass: ^0.3.2
  flutter_html: ^0.9.6
  flutter_local_notifications: ^0.8.2
  flutter_offline: ^0.2.4+1
  flutter_swiper: ^1.1.6
  flutter_xlider: ^2.4.5
  font_awesome_flutter: ^8.2.0
  geolocator: ^5.0.1
  google_maps_flutter: ^0.2.0
  google_sign_in: ^4.0.1+1
  http: ^0.12.0+2
  libcalendar: ^0.2.0
  location : ^2.3.0
  numberpicker: ^1.0.0
  pigment: ^1.0.3
  rxdart: ^0.21.0
  shared_preferences: ^0.5.1+1
  shimmer: ^1.0.0
  unicode: ^0.1.0
  url_launcher: ^5.0.2
  validate: ^1.6.0
  vibrate: ^0.0.4
  after_layout: ^1.0.7+2
  draggable_scrollbar: ^0.0.4
  flutter_web_browser: ^0.11.0
  flutter_youtube: ^1.1.6
  google_api_availability: ^2.0.1
  indexed_list_view: ^0.0.5
  permission_handler: ^3.1.0
  queries: ^0.1.4
  rect_getter: ^0.0.1
  scroll_to_index: any
  sqflite: ^1.1.5
  tuple: ^1.0.2
  xml2json: ^3.0.3
  firebase_messaging: ^5.1.6
  firebase_analytics: ^3.0.2
  firebase_core: ^0.4.0+3
  firebase_auth: ^0.11.1+6
  firebase_admob: ^0.9.0+1
  firebase_in_app_messaging: ^0.0.1+3
  superellipse_shape: ^0.1.5
  device_info: ^0.4.0+2
  in_app_purchase: ^0.2.0+6
  sentry: any
  system_info: ^0.1.1
  highlighter_coachmark: ^0.0.3
  volume: ^0.1.0
  admob_flutter: ^0.3.2
  bubble_tab_indicator: "^0.1.4"
  material_design_icons_flutter: ^3.0.3289
  scoped_model: ^1.0.1
  flutter_slidable: ^0.4.9
  kiwi: ^0.1.0
  flutter_markdown: ^0.2.0
  flutter_downloader: ^1.2.1
  native_ads: ^0.2.0  
  onesignal_flutter: ^2.0.0

¿Alguna idea de cómo reducir la aplicación en tamaño ?

Gracias de antemano...

ACTUALIZAR

Si configuro minifyEnabled = truey shrinkResources = true( como lo sugiere Ravinder Kumar ) en mi build.gradle, generará un error muy largo, aquí está el registro:

== Construyendo para Android ==

... (Corté el registro de error por mucho tiempo, pero el registro completo se puede ver aquí: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Nota: la configuración mantiene el punto de entrada 'io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete (com.google.android.gms.tasks.Task); } ', pero no la clase de descriptor' com.google.android.gms.tasks.Task '

Nota: la configuración mantiene el punto de entrada 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromSkuDetail (com.android.billingclient.api.SkuDetails); } ', pero no la clase de descriptor' com.android.billingclient.api.SkuDetails '

Nota: la configuración mantiene el punto de entrada 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ', pero no la clase de descriptor' com.android.billingclient.api.Purchase '

Nota: la configuración mantiene el punto de entrada 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchasesResult (com.android.billingclient.api.Purchase $ PurchasesResult); } ', pero no la clase de descriptor' com.android.billingclient.api.Purchase $ PurchasesResult '

Nota: había 7 referencias a clases desconocidas.

     You should check your configuration for typos.

    (http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)

Nota: había 3 referencias a miembros desconocidos de la clase.

     You should check your configuration for typos.

Nota: había 242 clases de descriptores no conservados en los miembros de la clase mantenida.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

     (http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)

Nota: había 68 referencias dinámicas no resueltas a clases o interfaces.

     You should check if you need to specify additional program jars.

     (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)

Advertencia: había 25 referencias no resueltas a clases o interfaces.

        You may need to add missing library jars or update their versions.

        If your code works fine without the missing classes, you can suppress

        the warnings with '-dontwarn' options.

        (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)

Advertencia: había 2 referencias sin resolver a los miembros de la clase de la biblioteca.

        You probably need to update the library versions.

        (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)

Advertencia: excepción al procesar la tarea java.io.IOExcepción: primero corrija las advertencias anteriores.

Tema (Limitador de tareas_1): destrucción Ejecutando la tarea Gradle 'bundleRelease' ... 690.7s (!)

************************************************** **********************> ******************* La falla de Gradle puede deberse a AndroidX> incompatibilidades en esta aplicación Flutter. Consulte "https: //goo.gl / CP92wY" para obtener más información sobre el problema y> cómo solucionarlo. ************************************************** **********************> ******************* Paquete de tareas de Gradle La liberación falló con el código de salida 1

Compilación fallida: | Error al compilar para Android

por cierto, a continuación está mi proguard-rules.pro:

#Flutter Wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-keep class com.baseflow.** { *; }
#-keep class com.chartboost.** { *; }

-dontwarn com.google.common.base.**
-keep class com.google.common.base.** {*;}
-dontwarn com.google.errorprone.annotations.**
-keep class com.google.errorprone.annotations.** {*;}
-dontwarn com.google.j2objc.annotations.**
-keep class com.google.j2objc.annotations.** { *; }
-dontwarn java.lang.ClassValue
-keep class java.lang.ClassValue { *; }
-dontwarn org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
-keep class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement { *; }
coderInrRain
fuente
Tal vez tenga algo que ver con las instantáneas de dardos. github.com/dart-lang/sdk/wiki/Snapshots
aligator

Respuestas:

6

Mi respuesta se basa en el documento oficial ,


Además de estos, debe habilitar Proguard para reducir el tamaño de apk y evitar que la aplicación realice ingeniería inversa. En aleteo,

Para que su aplicación sea lo más pequeña posible, debe habilitar la reducción en su versión de lanzamiento para eliminar el código y los recursos no utilizados.

Por defecto, Flutter no ofusca ni minimiza el host de Android. Si tiene la intención de utilizar bibliotecas de Java, Kotlin o Android de terceros, es posible que desee reducir el tamaño de la APK o proteger ese código de la ingeniería inversa.

Siga este enlace para habilitar Progaurd en su aplicación,

Paso 1: Paso 1: configurar Proguard Cree un /android/app/proguard-rules.proarchivo y agregue las reglas que se enumeran a continuación.

## Flutter wrapper
-keep class io.flutter.app.** { *; }
-keep class io.flutter.plugin.**  { *; }
-keep class io.flutter.util.**  { *; }
-keep class io.flutter.view.**  { *; }
-keep class io.flutter.**  { *; }
-keep class io.flutter.plugins.**  { *; }
-dontwarn io.flutter.embedding.**

Paso 2: habilite la ofuscación y / o la minificación

android {

    ...

    buildTypes {

        release {

            signingConfig signingConfigs.release

            minifyEnabled true
            shrinkResources true// to shrink your image resource read more at https://developer.android.com/studio/build/shrink-code
            useProguard true// enables progaurd

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

        }
    }

Nota: use Proguard solo en la producción apk.

Además, lea ¿Por qué el tamaño de mi aplicación en el dispositivo difiere del tamaño de APK o Play store?


Una aplicación también depende de las bibliotecas nativas y la mayoría de las bibliotecas nativas son bibliotecas de marco de Android que también están disponibles en el dispositivo, por lo que no se incluirán en el apk / aab. Pero estas bibliotecas se incluirán en los archivos odex y, por lo tanto, amplían su tamaño cuando se instalan.

Pregunta: ¿Cuál es la posible prevención?

Respuesta: Minimice el uso de recursos de las bibliotecas.

Si una biblioteca se diseñó para un servidor o escritorio, puede incluir muchos objetos y métodos que su aplicación no necesita. Para incluir solo las partes de la biblioteca que su aplicación necesita, puede editar los archivos de la biblioteca si la licencia le permite modificarla. También puede usar una biblioteca alternativa para dispositivos móviles para agregar funcionalidades específicas a su aplicación.

Nota: la reducción de código puede limpiar parte del código innecesario de una biblioteca, pero es posible que no pueda eliminar algunas dependencias internas grandes.

Lea también los pasos mencionados aquí

https://developer.android.com/topic/performance/reduce-apk-size#reduce-code

Ravinder Kumar
fuente
si configuro minifyEnabled = truey shrinkResources = truegenerará muchos errores
coderInrRain
He actualizado mi pregunta con respecto a su respuesta ...
coderInrRain
¿Ha creado el archivo /android/app/proguard-rules.pro por favor lea esto ?
Ravinder Kumar
Sí, por favor, lea mi respuesta actualizada, i contenido puesto de proguard-rules.proen la parte inferior ...
coderInrRain
Es posible que desee leer esto , y hay un problema abierto en flutter GitHub repo con respecto a su problema. Parece que los complementos de google o firebase parecen estar en conflicto con progaurd, de lo contrario, debería funcionar bien.
Ravinder Kumar
0

Cree su aplicación utilizando el comando mencionado a continuación:

flutter build apk --release --split-per-abi    

o

flutter build appbundle --target-platform android-arm,android-arm64
Rudresh Narwal
fuente
¿Afectará este método App Sizedespués de la instalación o App Download Sizesolo?
coderInrRain
Este método reducirá el tamaño de la aplicación para ambos casos.
Rudresh Narwal
Después de una semana, puedo confirmar al ver playstore aplicaciones vital que su método stil no exitosa - tamaño aplicación está todavía mismo tamaño como begining ...
coderInrRain
0

Para generar un paquete de aplicaciones, ejecute:

 flutter build appbundle --target-platform android-arm,android-arm64

Obtenga más información en: https://developer.android.com/guide/app-bundle

Para dividir los APK por ABI, ejecute:

flutter build apk --target-platform android-arm,android-arm64 --split-per-abi

Obtenga más información en: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split

Arun R. Prajapati
fuente
¿Cuál es el propósito de usar split por ABI?
coderInrRain
para separar el código de 64 y 86 bits
Arun R. Prajapati