Flutter - Como reduzir o tamanho do aplicativo no dispositivo

17

O tamanho do download do meu pacote de aplicativos no Google PlayStore é de cerca de 23 MB :

insira a descrição da imagem aqui

Mas por que, depois de instalado, o Tamanho do Aplicativo no Disco aumenta significativamente para 83 MB :

insira a descrição da imagem aqui

insira a descrição da imagem aqui

Alguma idéia de por que isso acontece, porque:

1) Arquivo de ativos do Flutter (imagens, som e fontes) em projetos com apenas 11 MB

2) Tamanho do código-fonte de vibração (.dart) no disco apenas 1,4 MB

3) Recurso / ícone nativo do Android (Res) apenas cerca de 800 KB

sobre o plugin do flutter que eu uso abaixo:

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

Alguma idéia Como reduzir o tamanho do aplicativo ?

Agradeço antecipadamente...

ATUALIZAR

Se eu definir minifyEnabled = truee shrinkResources = true( como sugerido por Ravinder Kumar ) no meu build.gradle, ele irá gerar um erro muito longo, aqui está o log:

== Construindo para Android ==

... (Cortei o log de erros por muito tempo, mas o log completo pode ser visto aqui: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Nota: a configuração mantém o ponto de entrada 'io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete (com.google.android.gms.tasks.Task); } ', mas não a classe do descritor' com.google.android.gms.tasks.Task '

Nota: a configuração mantém o ponto de entrada 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap deSkuDetail (com.android.billingclient.api.SkuDetails); } ', mas não a classe do descritor' com.android.billingclient.api.SkuDetails '

Nota: a configuração mantém o ponto de entrada 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ', mas não a classe do descritor' com.android.billingclient.api.Purchase '

Nota: a configuração mantém o ponto de entrada 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap dePurchasesResult (com.android.billingclient.api.Purchase $ PurchasesResult); } ', mas não a classe do descritor' com.android.billingclient.api.Purchase $ PurchasesResult '

Nota: houve 7 referências a classes desconhecidas.

     You should check your configuration for typos.

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

Nota: havia três referências a alunos desconhecidos.

     You should check your configuration for typos.

Nota: havia 242 classes de descritores não mantidas em membros da classe mantidos.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

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

Nota: havia 68 referências dinâmicas não resolvidas para classes ou interfaces.

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

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

Aviso: havia 25 referências não resolvidas para classes ou 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)

Aviso: havia duas referências não resolvidas para os membros da classe da biblioteca.

        You probably need to update the library versions.

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

Aviso: Exceção ao processar a tarefa java.io.IOException: primeiro corrija os avisos acima.

Tópico (Tarefas limitador_1): destruição Tarefa executando o Gradle 'bundleRelease' ... 690.7s (!)

**************************************************** **********************> ******************* A falha Gradle pode ter sido devido a AndroidX> incompatibilidades neste aplicativo Flutter. Consulte "https: //goo.gl / CP92wY" para obter mais informações sobre o problema e>> como corrigi-lo. **************************************************** **********************> ******************* O pacote de tarefas GradleRelease falhou com o código de saída 1

Falha na compilação: | Falha ao criar para Android

btw, abaixo é o meu 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
fonte
Talvez tenha algo a ver com instantâneos de dardo. github.com/dart-lang/sdk/wiki/Snapshots
aligator

Respostas:

6

Minha resposta é baseada no documento oficial ,


Além disso, você precisa ativar o proguard para reduzir o tamanho do apk e impedir a engenharia reversa do aplicativo. Em Flutter,

Para tornar seu aplicativo o menor possível, habilite a redução na compilação do release para remover o código e os recursos não utilizados.

Por padrão, o Flutter não ofusca ou reduz o host do Android. Se você pretende usar bibliotecas Java, Kotlin ou Android de terceiros, poderá reduzir o tamanho do APK ou proteger esse código da engenharia reversa.

Siga este link para ativar o programa em seu aplicativo,

Etapa 1: Etapa 1 - Configurar o programa Crie um /android/app/proguard-rules.proarquivo e adicione as regras listadas abaixo.

## 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.**

Etapa 2: ativar a ofuscação e / ou minificação

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 apenas no apk de produção.

Além disso, leia Por que o tamanho do meu aplicativo no dispositivo é diferente do tamanho da loja APK ou Play


Um aplicativo também depende de bibliotecas nativas e a maioria das bibliotecas nativas são bibliotecas de estrutura do Android que também estão disponíveis no dispositivo, para que não sejam agrupadas no apk / aab. Mas essas bibliotecas serão incluídas nos arquivos odex e, portanto, aumentam seu tamanho quando instaladas.

Pergunta: Qual é a possível prevenção?

Resposta: Minimize o uso de recursos das bibliotecas

Se uma biblioteca foi projetada para um servidor ou área de trabalho, ela pode incluir muitos objetos e métodos que seu aplicativo não precisa. Para incluir apenas as partes da biblioteca que seu aplicativo precisa, você pode editar os arquivos da biblioteca se a licença permitir modificar a biblioteca. Você também pode usar uma biblioteca alternativa compatível com dispositivos móveis para adicionar funcionalidades específicas ao seu aplicativo.

Nota: o encolhimento do código pode limpar parte do código desnecessário de uma biblioteca, mas pode não ser capaz de remover algumas dependências internas grandes.

Leia também as etapas mencionadas aqui

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

Ravinder Kumar
fonte
se eu definir minifyEnabled = truee shrinkResources = trueele irá gerar muitos erros
coderInrRain
Atualizei minha pergunta sobre sua resposta ...
coderInrRain
Você criou o arquivo /android/app/proguard-rules.pro, leia isso ?
Ravinder Kumar
Sim, por favor leia minha resposta atualizado, eu postar conteúdo de proguard-rules.pro, no fundo ...
coderInrRain
Você pode ler isso , e há um problema em aberto no repositório do GitHub do flutter referente ao seu problema. Parece que os plugins do google ou firebase parecem estar em conflito com o progaurd, caso contrário, deve funcionar bem.
Ravinder Kumar
0

Crie seu aplicativo usando o comando abaixo mencionado:

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

ou

flutter build appbundle --target-platform android-arm,android-arm64
Rudresh Narwal
fonte
Esse método afetará App Sizeapós a instalação ou App Download SizeSomente?
coderInrRain
Este método reduzirá o tamanho do aplicativo nos dois casos.
Rudresh Narwal
Depois de uma semana, posso confirmar por ver playstore Apps Vital que seu método stil não bem sucedida - tamanho aplicativo ainda é mesmo tamanho como começando ...
coderInrRain
0

Para gerar um pacote de aplicativos, execute:

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

Saiba mais em: https://developer.android.com/guide/app-bundle

Para dividir os APKs por ABI, execute:

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

Saiba mais em: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split

Arun R. Prajapati
fonte
Qual é o objetivo do uso de divisão por ABI?
coderInrRain
para separar o código 64 e 86 bits
Arun R. Prajâpati