一个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
