转自:我是吸血鬼

https://www.jianshu.com/p/5921e9561f5f

跟着事务杂乱度的逐步增加,代码、资源也在不断的增加,此刻你的APP巨细也在增加。从用户层面来说,面临动辄几十美白101个小窍门兆的APP来说在非WIFI状况下仍是会犹疑要不要下载,不下载你就或许因而失去了一个用户。从公司层面来讲,流量便是钱,削减APP的巨细就显得尤为重要。从开发者层面上来讲,你把握了这个手工也会略显逼格满满。

废话不多说了,开端正题。

1、APK结构的那些事

知己知彼,方能百战不殆。了解运用程序APK的结构关于咱们来说很有协助。APK文件由一个ZIP存档组成,其间包括组成运用程序的一切文件。这些文件包括Java类文件,资源语音帮手,你必需求懂的 APK 瘦身知识,安知晓文件和包括编译资源的文件。

APK包括以下目录:

一般来讲APK结构中比较大的部分一般是classes.dex、lib、res、assets这些文件或许目录。所以接下来将会针对这四种状况进行解说。

素秋园

别的,咱们经过APK Analyser 能够剖析 APK

2、减小 classes.dex

classes.dex 包括了一切 Java 代码。当你编译你的运用时,gradle 会将你的一切模块里的 .class 文件转化成 .dex 文件并将这些文件组成一个 classes.dex 文件。

单个的 classes.dex 文件能够包容大约 64K 方法。假如你达到了这个约束,你有必要要在你的工程中启用 multidexing。这将会创立另一个 classes1.dex 文件去存储剩余的方法。所以 classes.dex 文件鸭棚子数目由你的方法数而定。

削减语音帮手,你必需求懂的 APK 瘦身知识,安知晓第三库的运用

跟着事务的频频改变以及杂乱度的增加,咱们往往会运用第三方Libaray,有时分咱们或许只是用到了很少一部分的功用,这个时分就需求慎重考虑彻底引证。从我的开发经历上来讲,甘愿参照自己去完成,也不愿意多引进一个第三方库。

防止枚举

一个枚举能够为您的运用程序的classes.dex文件增加大约博翱公棚1.0到1.4 KB的巨细 。这些增加能够快速累积到杂乱体系或同享库。假如或许,请考虑运用@IntDef注释,这种类型转化保存了枚举的一切类型安全优势。

运用ProGuard

下面这段来自 build.gradle 文件的代码用于为发布构建启用代码紧缩:

android{

buildTypes{

release{

minifyEnabledtrue

pro对岸倾城guardFiles getDefaultProguardFile( 'proguard-android.txt'),

'proguard-rules.pro'

}

}

.盖迪奥特曼..

}

除了 minifyEnabled 特点外,还有用于界说 ProGuard 规矩的 proguardFiles 特点:

getDefaultProguardFile('proguard-android.txt') 方法可从 Android SDK tools/proguard/ 文件夹获取默许的 ProGuard 设置。

提示:要想做进一步的代码紧缩,请测验运用坐落同一方位的 proguard-android-optimize.txt 文件。它包括相同的 ProGuard 规矩,但还包括其他在字节码一级(方语音帮手,你必需求懂的 APK 瘦身知识,安知晓法内和方法间)履行剖析的优化,以进一步减小 APK 巨细和协助进步其运转速度。

proguard-rules.pro 文件用于增加自界说 ProGuard 规矩。默许状况下,该文件坐落模块根目录(build.gradle 文件旁)。

3、优化assets和res中的资源文件

题外话

res/raw和assets的相同点:

两者目录下的文件在打包后会原封不动的保存在apk包中,不会被编译成二进制。

res/raw和assets的不同点:

1、res/raw中的文件会被映射到R.java文件中,拜访的时分直接运用资源ID即R.id.filename;assets文件夹下的文件不会被映射到R.java中,拜访的时分需求AssetManager类。

2、res/raw不能够有目录结构,而assets则能够有目录结构,也便是assets目录下能够再树立文件夹。

针对不同的状况,关于资源文件有不同的优化战略。一般来讲,关于res/drawable-**ddpi中的png资源能够进行紧缩。

3.1 图片资源优化战略

格局紧缩

运用TinyPng或许Guetzli进行紧缩。Guetzli的运用能够拜见我之前写的博文https://www.jianshu.com/p/565e944bb594

运用WebP文件格局

定位Android 3.2(API等级13)或更高档豪盾别时 ,您也能够运用WebP文件格局来制造图画,而不是运用PNG或JPEG文件。WebP格局供给有损紧缩(如JPEG)以及通明度(如PNG),但能够供给比JPEG或PNG更好的紧缩。

An语音帮手,你必需求懂的 APK 瘦身知识,安知晓droid 4.0 (API level 14) 支撑有损紧缩的WebP格局,Android 4.3 (API level 18) 开端支撑无损通明WebP图画。

看下图:

紧缩功率极高,仅为PNG格局的12%。惊喜不惊喜。。。

运用矢量图形

您能够运用矢量图形来创立与分辨率无关的图标和其他可弹性媒体。运用这些图形能够大大削减您的APK脚印。矢量图画在Android中表明为VectorDrawable目标。经过一个VectorDrawable目标,一个100字节的文件能够生成一个与屏幕尺度共同的明晰图画。

但是,体系烘托每个 VectorDrawable目标需求很长时刻,而较大的图画需求更长的时刻才干显现在屏幕上。因而,只要在显现小图画时才考虑运用这些矢量图形。

其它战略

有时分咱们或许对一张图片进行重复运用,比方一张图片只是是全体色彩的改换能够使黄晓彤用setColorFilter或许tint。尽量削减运用帧动画,那但是一堆图片呀。

3.2 紧缩资源

要启用资源紧缩,请在 build.gradle 文件中将 shrinkResources 特点设置为 true。

android {

...

buildTypes {

re语音帮手,你必需求懂的 APK 瘦身知识,安知晓lease {

shrinkResources true

minifyEnabled true

proguardFiles getDefaultProguardFile( 'proguard-android.txt'),

'proguard-rules.pro'

}

}

}

资源语音帮手,你必需求懂的 APK 瘦身知识,安知晓紧缩器现在不会移除 values/ 文件夹中界说的资源(例如字符串、尺度、款式和色彩)。这是由于 Android 资源打包东西 (AAPT) 不允许 Gradle 插件为资源指定预界说版别。

一起,咱们也能够指定哪些资源能够保存下来。

例如,将下边的代码保存在 res/raw/keep.xml。构建不会将该文件打包到 APK 之中。

tools:keep="@layout/l_潘桂亚used*_c,@layout/南宋军神l_used_a,@layout/l_us聚乐淘ed_b*"

tools:discard="@layout/unused2"/>

resour铁血之最强兵神何天龙ces有以下特点:

safe和strict的优化战略:

safe能够简略了解为安全形式,它会尽最大努力查看代码中或许会运用到的资源进行保存,防止运转时过错。

假如你的代码调用 Resour吴秩多ces.getIdentifier(),这就表明你的代码将依据动态生成的字符串查询资源称号。当你履行这一调用时,默许状况下资源紧缩器会采纳防护性行为,将一切具有匹配称号格局的资源标记为或许已运用,无法移除。

Stringname = String.format( "img_%1d", angle + 1);

res = getResources().getIdentifier(name, "drawable", getPackageName());

img_ 前缀的资源标记为已运用。

在strict形式下,img_前缀的资源会做未运用的处理,因而你需求运用tools:keep手动进行已运用标识。

移除未运用的备用资源

咱们知道google给咱们的apk供给了国际化支撑,如习惯不同的屏幕分辨率的drawable资源,还有习惯不同言语的字符美咲结衣串资源等等,但是在许多状况下咱们只需求一些指定分辨率和言语淮稻5号的资源就能够了,这个时分咱们能够运用resConfigs方法来装备。

defaultConfig {

// 关于国际化支撑只打包中文资源,

resConfigs "zh-rCN"农民杀牛

} 4、lib中资源优化

这儿咱们主要讲一下lib中动态链接库的优化战略,也便是SO文件。假如你有NDK的开发经历或许会星咖特购更简单了解一些。

为了支撑不同指令集的状况,运用或许会包括armeabi、armeabi-v7a、x86的SO文件等。

现在干流的机型都是支撑armeabi-v7a的,而且armeabi-v7a兼容armeabi。所以在一般的开发中咱们只需求运用armeabi-v7a 进行ABI支撑。

有些SO库能够选用网络下载,把担负放到用户安装完运用之后。关于哪些SO文件能够放到网络中加载,还需求看详细事务状况。

题外话,假如运转时找不到SO的话,会导致运用溃散。

java.lang.UnsatisfiedLinkError: Couldn't loadstlport_shared

fromloader dalvik.system.PathClassLoader: findLibrary returned null

atjava.lang.Runtime.loadLibrary(Runtime.java: 陈庭实365)

atjava.lang.System.loadLibrary(System.java: 535)

atcom.your.app.NativeClass.(Native.java: 16)

... 63more

Caused by: java.lang.UnsatisfiedLinkError: Librarystlport_shared notfound

atjava.lang.Runtime.loadLibrary(Runtime.java: 461)

atjava.lang.System语音帮手,你必需求懂的 APK 瘦身知识,安知晓.loadLibrary(System.java: 557)

atcom.your.app.NativeClass.(Native.java: 16)

... 5more

咱们也是有方法应对的,能够拜见这个开源项目ReLinker

别的关于SO的优化我会独自拿出来讲一讲。

公司 开发 Android
声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。
铃木隼和六眼魔神谁快