Flutter - วิธีลดขนาดแอพในอุปกรณ์


17

ขนาดดาวน์โหลดของแอปของฉันใน Google PlayStore มีขนาดประมาณ23 MB :

ป้อนคำอธิบายรูปภาพที่นี่

แต่ทำไมหลังจากติดตั้งแล้วขนาดของแอปในดิสก์จะเพิ่มขึ้นอย่างมากถึง83 MB :

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

ความคิดใด ๆ ว่าทำไมสิ่งนี้ถึงเกิดขึ้นเพราะ:

1) ไฟล์สินทรัพย์ของ Flutter (รูปภาพเสียงและแบบอักษร) ในโครงการขนาดประมาณ11 MB

2) ขนาดของ Flutter Source Code (.dart) บนดิสก์เพียง1.4 MB

3) ทรัพยากร / ไอคอน Android ดั้งเดิม (Res) ประมาณ800 KBเท่านั้น

เกี่ยวกับปลั๊กอินของ 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

ความคิดใด ๆ วิธีการลดApp บนขนาด ?

ขอบคุณล่วงหน้า...

UPDATE

ถ้าฉันตั้งค่าminifyEnabled = trueและshrinkResources = true( ตามที่ Ravinder Kumar ) แนะนำไว้ฉันbuild.gradleจะสร้างข้อผิดพลาดที่ยาวมากนี่คือบันทึก:

== อาคารสำหรับ Android ==

... (ฉันตัดบันทึกข้อผิดพลาดเนื่องจากมีความยาวมาก แต่บันทึกแบบเต็มสามารถดูได้ที่นี่: 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 จากSkuDetail (com.android.billingclient.api.SkuDetails); } 'แต่ไม่ใช่คลาสตัวอธิบาย' com.android.billingclient.api.SkuDetails '

หมายเหตุ: การกำหนดค่าจะเก็บจุดเข้าใช้งาน 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap จากPurchase (com.android.billingclient.api.Purchase); } 'แต่ไม่ใช่คลาสตัวอธิบาย' com.android.billingclient.api.Purchase '

หมายเหตุ: การกำหนดค่าจะเก็บจุดเข้าใช้งาน 'io.flutter.plugins.inapppurchase.Translator {java.util.HashMap จากPurchasesResult (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 คลาส descriptor 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: โปรดแก้ไขคำเตือนข้างต้นก่อน

หัวข้อ (งาน Limiter_1): การทำลายการเรียกใช้งาน Gradle 'bundleRelease' ... 690.7s (!)

************************************************** **********************> ********************* ความล้มเหลวของการไล่ระดับสีอาจเป็นเพราะ AndroidX> ความเข้ากันไม่ได้ในแอพ Flutter นี้ ดู "https: //goo.gl / CP92wY" สำหรับข้อมูลเพิ่มเติมเกี่ยวกับปัญหาและ> วิธีแก้ไข ************************************************** **********************> ********************* บันเดิลภารกิจ gradleRelease ล้มเหลวด้วยรหัสออก 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 { *; }

บางทีมันอาจจะเกี่ยวข้องกับลูกดอกสแนปชอต github.com/dart-lang/sdk/wiki/Snapshots
aligator

คำตอบ:


6

คำตอบของฉันอยู่บนพื้นฐานของเอกสารอย่างเป็นทางการ ,


นอกเหนือจากนี้คุณต้องเปิดใช้งาน proguard เพื่อลดขนาดของ apk รวมถึงป้องกันการย้อนกลับของแอพ ใน 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: เปิดใช้งาน obfuscation และ / หรือ minification

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'

        }
    }

หมายเหตุ:ใช้ Proguard ในการผลิต apk เท่านั้น

โปรดอ่านด้วย เหตุใดขนาดแอปของฉันบนอุปกรณ์จึงแตกต่างจากขนาดของ APK หรือ Play store


แอปขึ้นอยู่กับ libs ดั้งเดิมและไลบรารี่ส่วนใหญ่เป็นไลบรารีเฟรมเวิร์กของ Android ที่มีอยู่ในอุปกรณ์ด้วยเช่นกัน แต่ libs เหล่านี้จะรวมอยู่ในไฟล์ odex และด้วยเหตุนี้จึงขยายขนาดเมื่อติดตั้ง

คำถาม:การป้องกันที่เป็นไปได้คืออะไร?

คำตอบ: ลดการใช้ทรัพยากรจากไลบรารีให้น้อยที่สุด

หากห้องสมุดได้รับการออกแบบมาสำหรับเซิร์ฟเวอร์หรือเดสก์ท็อปก็สามารถรวมวัตถุและวิธีการต่าง ๆ ที่แอปของคุณไม่จำเป็นต้องใช้ หากต้องการรวมเฉพาะบางส่วนของไลบรารีที่แอพของคุณต้องการคุณสามารถแก้ไขไฟล์ของไลบรารีได้หากใบอนุญาตอนุญาตให้คุณแก้ไขไลบรารี คุณยังสามารถใช้ห้องสมุดทางเลือกที่เป็นมิตรกับมือถือเพื่อเพิ่มฟังก์ชันการทำงานเฉพาะให้กับแอพของคุณ

หมายเหตุ: การย่อขนาดโค้ดสามารถล้างโค้ดที่ไม่จำเป็นของไลบรารี่บางส่วนได้ แต่อาจไม่สามารถลบการพึ่งพาภายในขนาดใหญ่บางส่วนได้

อ่านขั้นตอนที่กล่าวถึงที่นี่ด้วย

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


ถ้าฉันตั้งminifyEnabled = trueและshrinkResources = trueมันจะสร้างข้อผิดพลาดมากมาย
coderInrRain

ฉันได้อัปเดตคำถามของฉันเกี่ยวกับคำตอบของคุณ ...
coderInrRain

คุณได้สร้างไฟล์ /android/app/proguard-rules.pro โปรดอ่านสิ่งนี้หรือไม่?
Ravinder Kumar

ใช่โปรดอ่านคำตอบที่อัปเดตของฉันฉันโพสต์เนื้อหาของproguard-rules.proที่ด้านล่าง ...
coderInrRain

คุณอาจต้องการอ่านสิ่งนี้และมีปัญหาแบบเปิดใน repo ที่กระพือ GitHubเกี่ยวกับปัญหาของคุณ ดูเหมือนว่าปลั๊กอินของ google หรือ firebase ดูเหมือนว่าจะขัดแย้งกับ progaurd มิฉะนั้นควรทำงานได้ดี
Ravinder Kumar

0

สร้างแอปของคุณโดยใช้คำสั่งด้านล่าง:

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

หรือ

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

วิธีนี้จะมีผลApp Sizeหลังจากติดตั้งหรือApp Download Sizeเท่านั้น
coderInrRain

วิธีนี้จะลดขนาดแอพสำหรับทั้งสองกรณี
Rudresh Narwal

หลังจากนั้นหนึ่งสัปดาห์ผมสามารถยืนยันได้โดยเห็น PlayStore Apps สำคัญที่วิธีการของคุณสไตล์ไม่ประสบความสำเร็จ - ขนาดแอปยังคงเป็นขนาดเดียวกันเหมือนจุดเริ่มต้น ...
coderInrRain

0

ในการสร้างชุดแอปให้รัน:

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

เรียนรู้เพิ่มเติมเกี่ยวกับ: https://developer.android.com/guide/app-bundle

หากต้องการแยก APKs ต่อ ABI ให้เรียกใช้:

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

เรียนรู้เพิ่มเติมเกี่ยวกับ: https://developer.android.com/studio/build/configure-apk-splits#configure-abi-split


จุดประสงค์ของการใช้ split ต่อ ABI คืออะไร
coderInrRain

เพื่อแยกรหัส 64 และ 86 บิต
Arun R. Prajapati
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.