Flutter - Cách giảm kích thước ứng dụng trên thiết bị


17

Kích thước tải xuống gói ứng dụng của tôi trong Google PlayStore khoảng 23 MB :

nhập mô tả hình ảnh ở đây

Nhưng tại sao sau khi cài đặt, Kích thước ứng dụng trên Đĩa tăng đáng kể lên 83 MB :

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Bất kỳ ý tưởng tại sao điều này xảy ra, bởi vì:

1) Tệp tài sản của Flutter (hình ảnh, âm thanh & phông chữ) trên các dự án chỉ khoảng 11 MB

2) Kích thước của Mã nguồn rung (.dart) trên đĩa chỉ 1,4 MB

3) Biểu tượng / Tài nguyên bản địa của Android (Res) chỉ khoảng 800 KB

liên quan đến plugin của flutter tôi sử dụng dưới đây:

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

Bất kỳ ý tưởng Làm thế nào để giảm ứng dụng trên kích thước ?

Cảm ơn bạn trước ...

CẬP NHẬT

Nếu tôi đặt minifyEnabled = trueshrinkResources = true( như được đề xuất bởi Ravinder Kumar ) build.gradlethì tôi sẽ tạo ra một lỗi rất dài, đây là nhật ký:

== Xây dựng cho Android ==

... (Tôi đã cắt nhật ký lỗi vì rất dài, nhưng nhật ký đầy đủ có thể được xem tại đây: https://www.dropbox.com/s/jy92d1lmj9pgb6d/full_flutter_error_log.txt?dl=0 )

Lưu ý: cấu hình giữ điểm nhập 'io.flutter.plugins.googlesignin.GoogleSignInPlugin $ Delegate $ 3 {void onComplete (com.google.android.gms.t task.Task); } ', nhưng không phải là lớp mô tả' com.google.android.gms.t task.Task '

Lưu ý: cấu hình giữ điểm nhập 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap từSkuDetail (com.android.billingclient.api.SkuDetails); } ', nhưng không phải là lớp mô tả' com.android.billingclient.api.SkuDetails '

Lưu ý: cấu hình giữ điểm nhập 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap fromPurchase (com.android.billingclient.api.Purchase); } ', nhưng không phải là lớp mô tả' com.android.billingclient.api.Purchase '

Lưu ý: cấu hình sẽ giữ điểm nhập 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap từPurchaseResult (com.android.billingclient.api.Purchase $ PurchasingResult); } ', nhưng không phải là lớp mô tả' com.android.billingclient.api.Purchase $ PurchasingResult '

Lưu ý: có 7 tài liệu tham khảo cho các lớp chưa biết.

     You should check your configuration for typos.

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

Lưu ý: có 3 tài liệu tham khảo cho các thành viên lớp chưa biết.

     You should check your configuration for typos.

Lưu ý: có 242 lớp mô tả unkept trong các thành viên lớp được giữ.

     You should consider explicitly keeping the mentioned classes

     (using '-keep').

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

Lưu ý: có 68 tài liệu tham khảo động chưa được giải quyết cho các lớp hoặc giao diện.

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

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

Cảnh báo: có 25 tài liệu tham khảo chưa được giải quyết cho các lớp hoặc giao diện.

        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)

Cảnh báo: có 2 tài liệu tham khảo chưa được giải quyết cho các thành viên lớp thư viện.

        You probably need to update the library versions.

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

Cảnh báo: Ngoại lệ trong khi xử lý tác vụ java.io.IOException: Vui lòng sửa các cảnh báo trên trước.

Chủ đề (Nhiệm vụ giới hạn_1): hủy bỏ Chạy nhiệm vụ Gradle 'bundleRelease' ... 690.7s (!)

****** / TÌM KIẾM ****** / TÌM HIỂU R ***** RÀNG AndroidX> không tương thích trong ứng dụng Flutter này. Xem "https: //goo.gl / CP92wY" để biết thêm thông tin về sự cố và> cách khắc phục. ****** / TÌM KIẾM ****** / TÌM KIẾM Gói nhiệm vụ cấp bậcRelease không thành công với mã thoát 1

Xây dựng thất bại: | Không thể xây dựng cho Android

btw, dưới đây là của tôi 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 { *; }

Có lẽ nó có một cái gì đó để làm với ảnh chụp phi tiêu. github.com/dart-lang/sdk/wiki/Snapshots
aligator

Câu trả lời:


6

Câu trả lời của tôi dựa trên tài liệu chính thức ,


Ngoài ra, bạn cần kích hoạt proguard để giảm kích thước apk cũng như ngăn chặn ứng dụng đảo ngược kỹ thuật. Trong Flutter,

Để làm cho ứng dụng của bạn nhỏ nhất có thể, bạn nên kích hoạt thu nhỏ trong bản dựng phát hành của mình để xóa mã và tài nguyên không sử dụng.

Theo mặc định, Flutter không làm xáo trộn hoặc thu nhỏ máy chủ Android. Nếu bạn có ý định sử dụng các thư viện Java, Kotlin hoặc Android của bên thứ ba, bạn có thể muốn giảm kích thước của APK hoặc bảo vệ mã đó khỏi kỹ thuật đảo ngược.

Theo liên kết này để kích hoạt progaurd trong ứng dụng của bạn,

Bước 1: Bước 1 - Cấu hình Proguard Tạo một /android/app/proguard-rules.protệp và thêm các quy tắc được liệt kê bên dưới.

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

Bước 2: Kích hoạt obfuscation và / hoặc minifying

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'

        }
    }

Lưu ý: Chỉ sử dụng Proguard trong apk sản xuất.

Ngoài ra, hãy đọc Tại sao kích thước ứng dụng của tôi trên thiết bị khác với kích thước cửa hàng APK hoặc Play


Một ứng dụng cũng phụ thuộc vào libs gốc và hầu hết các thư viện gốc là thư viện khung Android cũng có sẵn trên thiết bị, vì vậy chúng sẽ không bị bó trong apk / aab. Nhưng những lib này sẽ được bao gồm trong các tệp odex và do đó mở rộng kích thước của nó khi được cài đặt.

Câu hỏi: phòng ngừa có thể là gì?

Trả lời: Giảm thiểu sử dụng tài nguyên từ các thư viện

Nếu một thư viện được thiết kế cho máy chủ hoặc máy tính để bàn, nó có thể bao gồm nhiều đối tượng và phương thức mà ứng dụng của bạn không cần. Để chỉ bao gồm các phần của thư viện mà ứng dụng của bạn cần, bạn có thể chỉnh sửa các tệp của thư viện nếu giấy phép cho phép bạn sửa đổi thư viện. Bạn cũng có thể sử dụng thư viện thay thế, thân thiện với thiết bị di động để thêm chức năng cụ thể vào ứng dụng của mình.

Lưu ý: thu hẹp mã có thể dọn sạch một số mã không cần thiết của thư viện, nhưng nó có thể không thể loại bỏ một số phụ thuộc nội bộ lớn.

Cũng đọc các bước được đề cập ở đây

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


nếu tôi đặt minifyEnabled = trueshrinkResources = truenó sẽ tạo ra nhiều lỗi
coderInrRain

Tôi đã cập nhật câu hỏi của mình về câu trả lời của bạn ...
coderInrRain

Bạn đã tạo tập tin /android/app/proguard-rules.pro vui lòng đọc cái này chưa?
Ravinder Kumar

vâng, xin vui lòng đọc câu trả lời được cập nhật của tôi, tôi đăng nội dung proguard-rules.proở phía dưới ...
coderInrRain

Bạn có thể muốn đọc điều này , và có một vấn đề mở trong việc rung động repo GitHub liên quan đến vấn đề của bạn. Có vẻ như các plugin google hoặc firebase dường như đang xung đột với progaurd, nếu không, nó sẽ hoạt động tốt.
Ravinder Kumar

0

Xây dựng ứng dụng của bạn bằng cách sử dụng lệnh được đề cập dưới đây:

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

hoặc là

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

Phương pháp này sẽ ảnh hưởng App Sizesau khi cài đặt hay App Download Sizechỉ?
coderInrRain

Phương pháp này sẽ giảm kích thước Ứng dụng cho cả hai trường hợp.
Rudresh Narwal

Sau một tuần, tôi có thể xác nhận bằng cách xem Playstore Apps Vital rằng phương thức của bạn không thành công - kích thước ứng dụng vẫn có cùng kích thước như bắt đầu ...
coderInrRain

0

Để tạo gói ứng dụng, hãy chạy:

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

Tìm hiểu thêm về: https://developer.android.com/guide/app-bundle

Để phân chia APK cho mỗi ABI, hãy chạy:

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

Tìm hiểu thêm về: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split


Mục đích của việc sử dụng chia cho mỗi ABI là gì?
coderInrRain

để tách mã 64 và 86 bit
Arun R. Prajapati
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.