当前位置: 首页 > 科技观察

如何在10分钟内将应用程序大小减少60%?

时间:2023-03-16 23:10:23 科技观察

一个APP包之所以大,主要有以下几个文件codelibso本地库资源文件(图片,音频,字体等)。1.打包buildTypes时删除不用的代码{debug{...shrinkResourcestrue//是否去除无效资源文件(如果你的Debug也需要瘦身)}release{...shrinkResourcestrue//是否去除无效资源文件}}2.减少不必要的打包defaultConfig{...//打包语言类型(语言翻译)resConfigs"en","de","fr","it"//打包文件夹resConfigs"nodpi","hdpi","xhdpi","xxhdpi","xxxhdpi"}或android{...splits{density{enabletrueexclude"ldpi","tvdpi","xxxhdpi"compatibleScreens'small','normal','large','xlarge'//reset()//include'x86','armeabi-v7a','mips'//universalApktrue}}第三,尽量不要使用过于复杂的lib,轻量级的lib是首选。如果您的应用程序不使用兼容库,您可以考虑删除支持包。4、资源文件我们可以使用Lint工具找到不用的资源(在AndroidStudio的“Analyze”菜单中选择“InspectCode...”)5、将已有的图片转换为webP我们可以使用智图或者isparta转换其他格式图片转为webP格式,isparta可以实现批量转换。6、图片相关在Android5.0及以上版本,可以使用tintcolor只提供一个按钮的图片,在程序中实现按钮的反色效果。前提是图片内容相同,只是正负按钮的颜色不同。Drawable.setColorFilter(0xffff0000,Mode.MULTIPLY)在Android5.0及以上版本,可以使用VectorDrawable和SVG图片替换原图VII.困惑1构建多版本在gradle中的buildTypes中添加不同的构建类型,使用applicationSuffix和versionNameSuffix可以生成多个版本并运行在同一个设备上创建src/[buildType]/res/设置不同的ic_launchers来区分不同的版本'),'proguard-rules.pro'}}minifyEnabledtrue是否通过ProGuard启用代码缩小(trueenables)请注意,代码缩小会减慢构建速度,因此您应该尽可能避免在调试构建中使用它。注意:AndroidStudio在使用InstantRun时禁用ProGuard。proguardFilesgetDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro'getDefaultProguardFile('proguard-android.txt')方法从AndroidSDKtools/proguard/文件夹获取默认的ProGuard设置。提示:要进一步压缩代码,请尝试使用位于同一位置的proguard-android-optimize.txt文件。它包括相同的ProGuard规则,但还包括在字节码级别(方法内和方法间)执行分析的额外优化,以进一步减小APK大小并帮助加快运行速度。proguard-rules.pro文件用于添加自定义ProGuard规则。默认情况下,此文件位于模块根目录中(在build.gradle文件旁边)。要添加更多特定于每个构建变体的ProGuard规则,请将额外的proguardFiles属性添加到相应的productFlavor块。例如,以下Gradle文件将flavor2-rules.pro添加到flavor2产品风味中。现在flavor2使用所有三个ProGuard规则,因为来自发布块的规则也被应用。在每次构建时,ProGuard都会输出以下文件dump.txt,描述APK中所有类文件的内部结构。mapping.txt:提供原始和混淆后的类、方法和字段名称之间的转换。seeds.txt:列出未混淆的类和成员。usage.txt:列出从APK中删除的代码。这些文件存储在/build/outputs/mapping/release/中。要修复错误并强制ProGuard保留特定代码,请将-keep行添加到ProGuard配置文件。例如:-keeppublicclassMyClass您还可以在要保留的代码中添加[@Keep](https://developer.android.com/reference/android/support/annotation/Keep.html)注解。在类上添加@Keep可使整个类保持原样。将它添加到方法或字段上会使方法/字段(及其名称)以及类名保持不变。请注意,此注释仅在使用注释支持库时可用。使用-keep选项时需要考虑许多事项;有关自定义配置文件的详细信息,请阅读ProGuard手册。疑难解答一章概述了您在混淆代码时可能遇到的其他常见问题。请注意,每次使用ProGuard创建发布版本时,mapping.txt文件都会被覆盖,因此每次发布新版本时都必须小心保存副本。通过为每个发布版本保留一份mapping.txt文件的副本,您可以在用户提交的混淆堆栈跟踪来自您的应用程序的旧版本时调试问题。每增加一个库,都需要及时发布,构建与Proguard同组开发的软件DexGuard,优化代码,分离dex文件,解决65k方法限制。关于proguard-android.txt文件:-dontusemixedcaseclassnames:表示混淆不要对类名使用大小写混淆。-dontskipnonpubliclibraryclasses:不跳过库中的非公共方法。-verbose:打印模糊的详细信息。-dontoptimize:不做优化,优化可能会带来一些潜在的风险,不能保证在所有版本的Dalvik上都能正常运行。-dontpreverify:不预先验证。-keepattributesAnnotation:保留注释参数。-keeppublicclasscom.google.vending.licensing.ILicensingService-keeppublicclasscom.android.vending.licensing.ILicensingService:表示不要混淆上面声明的两个类。proguard中有三组六个keep关键字,意思是keep保留类和类的成员,以防止它们被混淆或删除。keepnames保留类和类内的成员,防止它们混淆,但当成员未被引用时将被删除。keepclassmembers只保留类的成员,防止他们被混淆或删除。keepclassmembernames只保留类的成员,防止他们被混淆,但是当他们没有被引用时就将他们移除。keepclasseswithmembers保留类和类中的成员,防止被混淆或移除,前提是命名类中的成员必须存在,如果不存在,仍然会被混淆。keepclasseswithmembernames保留类和类中的成员,防止混淆,但是在没有引用成员的时候会去掉,前提是命名类中的成员必须存在,如果不存在,还是会混淆。keepclasseswithmember和keep关键字的区别:如果这个类没有native方法,那么这个类就会被混淆-keepclasseswithmemberclass*{native;}不管这个类有没有native方法,那么这个类就不会被混淆-keepclass*{native;}或者,您可以使用APK分析器来分解您的APK。AndroidStudio提供了一个有用的工具:APKAnalyzer。APKAnalyzer将反汇编您的应用程序,并让您知道您的.apk文件的哪一部分占用了大量空间。我们来看看防盗优化前的截图。从ApkAnalyzer的输出来看,应用程序的原始大小为3.1MB。从PlayStore压缩后,它大约有2.5MB。从截图中可以看出,主要有3个文件夹占据了应用程序的大部分空间。classes.dex-这是包含将在DVM或ART上运行的所有字节码文件的dex文件。res-此文件夹包含res文件夹下的所有文件。它主要包含所有图像、图标和源文件、菜单文件和布局。resources.arsc-此文件包含所有有价值的资源。该文件包含您的值目录中的所有数据。包括字符串、维度、样式、整数、id等。您有两个默认的混淆文件。proguard-android-optimize.txtproguard-android.txt正如文件名所说,“proguard-android-optimize.txt”是更激进的混淆选项。我们使用它作为默认的混淆配置。您可以在/app目录下的proguard-rules.pro中添加自定义混淆配置。release{//EnabletheproguardminifyEnabledtrueproguardFilesgetDefaultProguardFile('proguard-android-optimize.txt'),"proguard-rules.pro"//OtherparametersdebuggablefalsejniDebuggablefalserenderscriptDebuggablefalsesigningConfigplayStoreConfig//AddyourownsigningconfigpseudoLocalesEnabledfalsezipAlignEnabledtrue通过设置minifyEnabled为true,混淆将会移除所有未使用的方法、指令以减小型classes.dex文件。这是启用了minify的APK。8、AndroidStudio使用lint清除无用的资源文件。在使用AndroidStudio进行App开发时,我们经常会引用项目中的各种资源文件,包括图片、布局文件、常量引用定义等。随着项目版本开发的迭代,每个阶段的资源都会发生变化,会留下一些无用的资源。这个时候,我们手动去一个一个的查找,效率会很低。这时候我们就得学习一下AndroidStudio是如何使用lint来清除无用的资源文件的。在项目中打开AndroidStudio,点击顶部菜单栏的Analyze->RunInspectionbyName,如下图:点击RunInspectionbyName,弹出对话框。如下图所示,在对话框中输入未使用的资源:然后在下拉列表中点击未使用的资源。会弹出如下图所示的对话框