[android] Flutter-기기의 앱 크기를 줄이는 방법

구글 PLAYSTORE에서 내 앱 번들 다운로드 크기는 약입니다 23메가바이트 :

여기에 이미지 설명을 입력하십시오

설치 후 왜 그러나, 디스크에 앱 크기가 크게 제기 83메가바이트 :

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

왜 이런 일이 발생하는지에 대한 아이디어 :

1) 약 11MB의 프로젝트에 대한 Flutter의 자산 파일 (이미지, 사운드 및 글꼴)

2) 디스크의 Flutter 소스 코드 (.dart) 크기는 1.4MB

3) 약 800KB의 Android 기본 리소스 / 아이콘 (Res)

flutter의 플러그인과 관련하여 아래에서 사용합니다.

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

어떤 아이디어 응용 프로그램 크기 를 줄이는 방법 ?

미리 감사드립니다 …

최신 정보

내가 설정 한 경우 minifyEnabled = trueshrinkResources = true( 레빈 더 쿠마르에 의해 제안 내에서) build.gradle그때는 매우 긴 오류가 발생합니다, 여기 로그입니다 :

== 안드로이드 구축 ==

(매우 길기 때문에 오류 로그를 잘라 냈지만 전체 로그는 여기에서 볼 수 있습니다 : https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

참고 : 구성은 진입 점을 ‘io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete (com.google.android.gms.tasks.Task); } ‘이지만 디스크립터 클래스’com.google.android.gms.tasks.Task ‘는 아님

참고 : 구성은 시작점 ‘io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromSkuDetail (com.android.billingclient.api.SkuDetails); } ‘이지만 디스크립터 클래스’com.android.billingclient.api.SkuDetails ‘는 아님

참고 : 구성은 시작점 ‘io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ‘이지만 디스크립터 클래스’com.android.billingclient.api.Purchase ‘는 아닙니다.

참고 : 구성은 시작점 ‘io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchasesResult (com.android.billingclient.api.Purchase $ PurchasesResult); } ‘이지만 설명자 클래스’com.android.billingclient.api.Purchase $ PurchasesResult ‘는 아닙니다.

참고 : 알 수없는 클래스에 대한 7 개의 참조가있었습니다.

     You should check your configuration for typos.

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

참고 : 알려지지 않은 반원에 대한 언급이 3 개있었습니다.

     You should check your configuration for typos.

참고 : 유지 클래스 멤버에는 242 개의 unkept 디스크립터 클래스가 있습니다.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

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

참고 : 클래스 또는 인터페이스에 대한 해결되지 않은 동적 참조는 68 개입니다.

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

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

경고 : 클래스 또는 인터페이스에 대한 25 개의 해결되지 않은 참조가있었습니다.

        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)

경고 : 라이브러리 클래스 멤버에 대한 해결되지 않은 참조가 2 개있었습니다.

        You probably need to update the library versions.

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

경고 : 태스크 java.io.IOException 처리 중 예외 : 위의 경고를 먼저 수정하십시오.

Thread (Tasks limiter_1) : 파괴 Gradle 작업 ‘bundleRelease’실행 중 … 690.7s (!)

****************************************************** **********************> ******************* Gradle 실패로 인해 이 Flutter 앱의 AndroidX> 비 호환성 문제에 대한 자세한 내용과 해결 방법은 “https : //goo.gl / CP92wY”를 참조하십시오. ****************************************************** **********************> ******************* Gradle 작업 번들 종료 코드 1로 해제하지 못했습니다.

빌드 실패 : | Android를 빌드하지 못했습니다

btw, 아래는 내 것입니다 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 { *; }



답변

내 답변은 공식 문서를 기반으로 합니다 .


이와 별도로 , 앱의 리버스 엔지니어링을 방지 할뿐만 아니라 APK의 크기를 줄이려면 proguard활성화 해야합니다 . Flutter에서

앱을 최대한 작게 만들려면 릴리스 빌드를 축소하여 사용하지 않는 코드와 리소스를 제거해야합니다.

기본적으로 Flutter는 Android 호스트를 난독 화하거나 축소하지 않습니다. 타사 Java, Kotlin 또는 Android 라이브러리를 사용하려는 경우 APK 크기를 줄이거 나 리버스 엔지니어링으로부터 해당 코드를 보호 할 수 있습니다.

앱에서 progaurd를 활성화하려면 이 링크 를 따르십시오 .

1 단계 : 1 단계-Proguard 구성/android/app/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.**  { *; }
-dontwarn io.flutter.embedding.**

2 단계 : 난독 화 및 / 또는 최소화

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'

        }
    }

참고 : 프로덕션 APK에서만 Proguard를 사용하십시오.

또한 기기의 앱 크기가 APK 또는 Play 스토어 크기와 다른 이유를 읽어
보세요.


응용 프로그램은 기본 라이브러리에도 의존하며 대부분의 기본 라이브러리는 장치에서 사용할 수있는 안드로이드 프레임 워크 라이브러리이므로 apk / aab에 번들로 제공되지 않습니다. 그러나 이러한 라이브러리는 odex 파일에 포함되므로 설치시 크기가 확장됩니다.

질문 : 가능한 예방책은 무엇입니까?

답변 : 라이브러리에서 리소스 사용 최소화

라이브러리가 서버 또는 데스크톱 용으로 설계된 경우 앱에 필요하지 않은 많은 개체와 메서드가 포함될 수 있습니다. 앱에 필요한 라이브러리 부분 만 포함 시키려면 라이센스를 통해 라이브러리를 수정할 수있는 경우 라이브러리 파일을 편집 할 수 있습니다. 모바일 친화적 인 대체 라이브러리를 사용하여 앱에 특정 기능을 추가 할 수도 있습니다.

참고 : 코드 축소는 라이브러리의 불필요한 코드 중 일부를 정리할 수 있지만 일부 큰 내부 종속성을 제거하지 못할 수 있습니다.

여기에 언급 된 단계를 읽으십시오

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


답변

아래 언급 된 명령을 사용하여 앱을 빌드하십시오.

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

또는

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


답변

앱 번들을 생성하려면 다음을 실행하십시오.

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

https://developer.android.com/guide/app-bundle 에서 자세히 알아보십시오.

ABI 당 APK를 분할하려면 다음을 실행하십시오.

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

https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split 에서 자세히 알아보십시오.


답변