Android 颤振-如何减少设备上的应用程序大小
我的应用程序包在谷歌PlayStore中的下载大小约为23MB: 但为什么安装后,磁盘上的应用程序大小会显著增加到83 MB 知道为什么会这样吗,因为: 1) Flatter的资产文件(图像、声音和字体)仅在11MB左右的项目上 2) 仅磁盘上颤振源代码(.dart)的大小1.4 MB 3) Android本机资源/图标(Res)仅约为800 KB 关于颤振的插件,我使用如下:Android 颤振-如何减少设备上的应用程序大小,android,gradle,flutter,dart,apk,Android,Gradle,Flutter,Dart,Apk,我的应用程序包在谷歌PlayStore中的下载大小约为23MB: 但为什么安装后,磁盘上的应用程序大小会显著增加到83 MB 知道为什么会这样吗,因为: 1) Flatter的资产文件(图像、声音和字体)仅在11MB左右的项目上 2) 仅磁盘上颤振源代码(.dart)的大小1.4 MB 3) Android本机资源/图标(Res)仅约为800 KB 关于颤振的插件,我使用如下: dependencies: flutter: sdk: flutter flutter_loca
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
你知道如何缩小应用程序的大小吗
提前谢谢你
更新
如果我在我的build.gradle
中设置minifyEnabled=true
和shrinkResources=true
(由Ravinder Kumar建议),那么它将生成一个很长的错误,日志如下:
==为Android构建==
(由于非常长,我剪切了错误日志,但在这里可以看到完整的日志:)
注意:配置保留了入口点'io.flatter.plugins.googlesignin.GoogleSignInPlugin$Delegate$3{void onComplete(com.google.android.gms.tasks.Task);}',但没有保留描述符类'com.google.android.gms.tasks.Task'
注意:配置保留入口点“io.flatter.plugins.inapppurchase.Translator{java.util.HashMap fromSkuDetail(com.android.billingclient.api.SkuDetails);}”,但不保留描述符类“com.android.billingclient.api.SkuDetails”
注意:该配置保留入口点“io.flatter.plugins.inapppurchase.Translator{java.util.HashMap fromPurchase(com.android.billingclient.api.Purchase);}”,但不保留描述符类“com.android.billingclient.api.Purchase”
注意:该配置保留入口点“io.flatter.plugins.inapppurchase.Translator{java.util.HashMap fromPurchasesResult(com.android.billingclient.api.PurchasesResult);}”,但不保留描述符类“com.android.billingclient.api.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.
You should consider explicitly keeping the mentioned classes
(using '-keep').
(http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)
You probably need to update the library versions.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
注意:在保留的类成员中有242个unkept描述符类
You should check your configuration for typos.
You should consider explicitly keeping the mentioned classes
(using '-keep').
(http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)
You probably need to update the library versions.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
注意:有68个未解析的类或接口动态引用
You should check if you need to specify additional program jars.
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)
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)
警告:有25个未解析的类或接口引用
You should check if you need to specify additional program jars.
(http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)
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 should check your configuration for typos.
You should consider explicitly keeping the mentioned classes
(using '-keep').
(http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)
You probably need to update the library versions.
(http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)
警告:处理任务java.io时出现异常。IOException:请先更正上述警告
线程(任务限制器1):销毁
正在运行Gradle任务“bundleRelease”。。。690.7s(!)
************************************************************************>*******************
Gradle故障可能是因为此颤振应用程序中的AndroidX>不兼容。
请参阅“https://goo.gl/CP92wY”,了解有关该问题的更多信息以及>如何解决该问题。
************************************************************************>*******************
Gradle任务bundleRelease失败,退出代码为1
生成失败:|
无法为Android生成
顺便说一句,下面是我的proguard规则。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 { *; }
我的答案是基于
除此之外,您还需要启用proguard以减小apk的大小,并防止应用程序反向工程。在颤振中 默认情况下,flatter不会混淆或缩小Android主机。如果您打算使用第三方Java、Kotlin或Android库,您可能希望减小APK的大小或保护该代码不受反向工程的影响 按照以下步骤在应用程序中启用progaud 步骤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
另外,阅读
应用程序也依赖于本机库,并且大多数本机库都是设备上可用的android框架库,因此它们不会捆绑在apk/aab中。但这些LIB将包含在odex文件中,因此在安装时会扩展其大小 问题:可能的预防措施是什么 回答: 如果库是为服务器或桌面设计的,那么它可以包含许多应用程序不需要的对象和方法。若要仅包含应用程序所需的库部分,您可以编辑库文件(如果许可证允许您修改库)。您还可以使用另一种移动友好库向应用程序添加特定功能 注意:代码收缩可以清除库中一些不必要的代码,但它可能无法删除一些大型内部依赖项 也请阅读这里提到的步骤
要生成应用程序包,请运行:
flutter build appbundle --target-platform android-arm,android-arm64
了解有关以下内容的详细信息:
要按ABI拆分APK,请运行:
flutter build apk --target-platform android-arm,android-arm64 --split-per-abi
了解更多信息:使用以下命令
flutter build apk --split-per-abi
如果我设置
minifyEnabled=true
和shrinkResources=true
它会产生很多错误。你创建了文件/android/app/proguard-rules.pro吗?请阅读?是的,请阅读我的更新答案,我在底部发布了proguard rules.pro
的内容……你可能想阅读,并且有一个关于你的问题。google或firebase插件似乎与Progaud冲突,否则,它应该可以正常工作。@Racinder,请参阅github问题,现在有什么办法可以减少应用程序大小?我认为他们不会很快找到解决办法……也许这与