澳门威利斯人_威利斯人娱乐「手机版」

来自 威利斯人娱乐 2020-03-12 03:39 的文章
当前位置: 澳门威利斯人 > 威利斯人娱乐 > 正文

APK瘦身探索,性能优化

图片 145ba10e9e3029116ad0be19134c50f2a_thumb.png

前言

APK瘦腿正是对APK大小实行减少攻略,减小APK安装包大小,越来越小的安装包更推动引发客户安装。前一段时间作者司某一App进行APK的瘦腿,最后也达到了减弱10M的目的,现做七个简易的下结论记录。

前日几周二向在研讨怎么着为APK减重,折腾了非常久,是时候写篇博客总计一下了,固然早就筹算了下周五要在客商端周会分享用的PPT:APK消脂探寻。

什么精简Android市镇安装包容积大小平昔是Android开拓者比较关怀的点,因为它对应着客户晋级等待时间和流量消耗,大家在互连网上可以搜索到不少素材,比如:

什么动手那么些主题素材?

亟待对叁个App举办瘦肚,首先最重要的便是对App大小有叁个大致的打听,最直观望到App的深浅正是通过Android Studio自带的Analyzer举行APK的剖判。使用情势:

1、将一个apk拖动到Android Studio的编辑器窗口 2、在Project窗口中,双击build/output/apks/目录下的apk 3、在菜单栏中选择选择Build > Analyze APK,然后选择要分析的apk

图片 2image

赢得如上航海用教室1所示的APK Size深入分析图之后,大家就足以本着那之中的目录举行针没有错优化。

如图最上方所示的APK Size正是我们使用打包之后的分寸,Download Size则是上传到GooglePlay之后,客户下载的尺寸。所以大家日常能够只针对前一项的APK Size进行对照。

价值

尽管说APK减腹对于Android对采纳可分配内存的界定影响超级小,可是照旧有部分影响的,就以图片为例,将有些小Logo替换为iconfont能使得减小内部存款和储蓄器的分红,幸免OOM的产出。

此外,不论是iOS开垦者如故Android开荒者都应当尝试最棒学会怎么为IPA或APK节食,不独有是为了支持客户省流量、减弱下载时间、收缩占用的寄放空间等等,更重视的是为了增进转化率(注意:本文的转变率均指下载转变率)

那转变率是何许吗?

举个栗子:你的运用大小是 18MB ,有九14个潜在顾客想要去下载尝试接纳,结果有二十个客户嫌弃安装包太大学一年级直拂袖而去,有二十个客户在等待下载的长河中收回下载,最后唯有六贰11个顾客真正下载安装,那么应用的转变率就是60/100 = 30% 。

那为啥要抓实转化率呢?

因为客户在郁结下载你的出品依旧你的竞品的时候,往往会选取特别体会最棒、功用最多、质量最棒、包最小的。

  • 什么将 APK 大小缩小 6M 的
  • Android 应用软件终非常减腹指南

深入分析难点,开掘优化点

从上海图书馆Analyzer可以窥见,二个APK重要含有如下目录:

  • lib:包括了部分有别于于Computer的编写翻译代码,主假若SO文件,日常里面含有非常多子目录,例如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, and mips。

  • res:满含了有的不会被编写翻译到resources.arsc的能源文件。如drawable文件、layout文件等。

  • assets:包罗了有的通过AssetManager能够寻觅到的能源。如MP5、字体、webp等财富文件。

  • META-INF:包括了CERT.SF和CERT.GL450SA具名文件,还应该有MANIFEST.MF文件。

除此而外,还蕴藏了如下的文书:

  • resources.arsc:包涵了有着能够被编写翻译的坐落于res/values/目录下的XML能源。打包工具在卷入进度中会把XML的内容编译成二进制的款式,亦恐怕把有关财富的援用路径编写翻译成二进制,然后整合到该公文之中。比如string文件、layout的门路、图片的门路等。

  • classes.dex:蕴含了具备的Java文件编写翻译后的class文件,class文件最后转造成该dex文件。日常文件都一点都不小,有的App有多少个dex文件,那是因为单个DEX文件限定措施数在65536,所以今世码量过大时,就须要通过multiDex举行分包,拆分成多个dex文件,消除这几个主题材料。

  • AndroidManifest.xml:整合了多个module的AndroidMainifest文件的权杖、注脚等布置到该公文。

领会了APK的组成都部队分,那么大家就足以本着这个文件/文件夹实行针对的优化,每一个App都分化,但是方法都以大约,本文汇报消肉计谋也是照准那几个目录和文书进行优化,那样能够来得尤为有条理性。

Android系统未来支撑7种CPU结构,每一项都事关着相应的ABI(二进制接口,Application Binary Interface),而各项ABI都定义了二进制文件怎么样运作在对应的系统平台上,从使用的指令集,内部存款和储蓄器对齐到可用的连串函数库等。所以一旦大家的App须求适配分化的CPU布局的话,如下图2所示,就须要放入分歧构造的文书夹下都放入差别的so文件,在包装时,那个so都会放在lib目录下。因此,借使咱们想减小lib目录的高低,无非犹如下一些布满的战略。

图片 3image

  • so裁剪、删除

对App引进的so文件实行确认哪些是无需的,哪些是能够进行裁剪压缩的,哪些是足以制止引进的。举例假诺引进的so必要下载上传成效而多引进了三个cUHighlanderL库引致so增大,这时候就可以让Java层代码定义接口,让so来调用,进而幸免引入cUPRADOL库;再如Fresco库,纵然无需webP图,只怕无需webP动图作用,然后收缩Fresco库的信任性,同样能够减小so的尺寸。

  • 只保留armeabi或者armeabi-v7a

Android系统今后支撑很各个CPU架构(如mips、arm、x86等),市情上主流机型都是arm构造,x86和mips类型极少。所以可以有选用地保留少数结构的so,进而缩短lib文件夹的分寸。可是作者提出你在开首前先对客商手提式有线电话机的cpu型号进行三遍总结,剖判自个儿App对应构造手提式有线电话机的占有率,那样你技巧大胆的拓宽操作,日常只保留armeabi大概armeabi-v7a就可以。操作也是比较容易,只必要在根目录的build.gradle下配置:

android { buildTypes { ndk { abiFilters "armeabi-v7a" } }}` 

一旦您的App须要扶持八种构造,那么就足以在abiFilters里头把多样构造加进去,当然你也得以只保留一种,然后分门路打包,如GooglePlay就扶助arm和x86等多少个门路打包。

res目录日常也是占APK Size大头的一个索引,如下图,这几个目录平日都以图形财富占空间非常多,尤其当App为了适配种种分辨率而寄放了多套图时,这时就能够引致res目录打下会一点都相当大。而这么些目录的优化措施也是比比较多,上面就大致列举一下:

图片 4image

  • 只保留一套图

因为Android设备在加载图片时会优先加载对应分辨率文件夹下的图片,如若对应分辨率文件下并没有所要的图纸,则找高分辨率对应文件夹下的图形。那是或不是大家把图纸放在最高分辨率的文本夹下就能够了吧?不是的!因为只要那样会引致低分辨率手提式有线电话机加载图片时会消耗越来越多的内部存款和储蓄器,而且是指数等级升高的,所以一旦盲目地坐落于两个索引是不适当的。目前不可同日来讲分辨率对应优先加载的文件夹中图纸如下,若是是照准本国客户的App可以只保留xxhdpi目录,而只假如东南亚商场的App则能够只保留xhdpi。

320*240 ldpi480*320 mdpi800*480 hdpi1280*720 xhdpi1920*1080 xxhdpi` 
  • 非主要图纸动态加载

本着部分非主要的图形,能够选取动态在线加载,严俊来讲,非首页的图片都足以动态加载,当然,为了提高顾客体验,大家会把图片放在地面。可是,一些利用处境超小照旧大小比较大的图片,大胆删掉,接收动态加载吧!

  • 保真压缩图片

可以利用部分图纸压缩网址或许工具压缩你的能源文件呢,举个例子TinyPng、ImageOptim、Zopfli、智图等。

  • 使用webp替换png

比如你的App只扶植Android4.0以上的话,能够把png格式的图片转为webp,相符画质下体量越来越小。

  • 行使lint删除无用能源

在四个人付出进度中,日常都会有漏删无用能源的标题,图片财富也不例外,举例须要删除一个模块的代码时,比较轻巧就能够漏删财富文件,所以可以准时选择lint检查实验出无用的能源文件,原理这里不作介绍,使用办法极其简单,可以间接在AS里面使用,如下图所示。注意:lint检查出来的财富都以无直接引用的,所以只要大家由此getIdentifier(卡塔尔国方法援引文件时,lint也会标志为无引用,所以删除时注意不要删除通过getIdentifier(卡塔尔国引用的能源。

Analyze -> Run Inspection by Name -> 输入:Unused resources -> 跳出弹框选择范围即可
  • 打开shrinkResources

shrinkResources是在编写翻译进程中用来检查测量检验并删除无用能源文件,也正是未有征引的财富,minifyEnabled 这些是用来拉开删除无用代码,举例未有援引到的代码,所以固然需求掌握财富是或不是被引述就要合作minifyEnabled使用,唯有两岸都为true时才会起到真正的删减无效代码和无援引能源的目标。张开药方式也是非常不难,在build.gralde文件之中张开就可以:

android { buildTypes{ minifyEnabled true shrinkResources true }}` 

assests目录存放的经常见到是一些通过AssetManager可以搜索到的能源,包罗mp4、录制、字体、webp的财富,各种App存放内容都非常大不相通,列举部分常用的优化方案。

  • 删去无用字体

普通话字体常常都超级大,因为字体文件包罗了华语好几千个汉字,然则大家实际在App中并不会全部都采纳,以至咱们只用到内部的多少个字,那时候我们就足以把字体文件举办删除,在Github上面有多个字体提取工具FontZip,使用办法也是非常轻便,有意思味能够去star一下。

图片 5image

  • 动态下载

一些MP4、录像、Webp等能源能够在应用届期再开展下载,无需放在地面。

  • 对财富实行减少

部分MP4、摄像、Webp等财富假如非得放在地面,能够压缩成zip文件或然利用7zip进行减少,在选拔届时再实行解压,减小空间的占领。

该目录下的MANIFEST.MF、CERT.SF、INDEX.LIST、CERT.奥迪Q3SA等文件注重是存放在一些APK文件加密后的音讯,用以校验APK的完整性和安全性,那几个目录未有太好的优化措施,何况文件平常也相当的小,不会当先1M。

其一文件包括全数能够被编写翻译的坐落于res/values/目录下的XML能源,如下图5所示是TmallAPK的resources.arsc文件,像图片的引用名字、layout文件的引用名字、string能源等都被编写翻译到了这些文件之中。

图片 6image

因而只要大家需求对resources.arsc文件进行优化,无非正是对路径名字举行模糊,删除无用的能源映射,前面二个能够利用AndResGuard,前者基本上能用lint等张开检验。

  • 去除无用的语言

大繁多施用都没有须求扶助几十种上百种语言,所以在我们援引一些第三方库时(如Google、Twitter的库),它们往往含有上百种多语言财富,而大超多多语言对于大家分甘同苦的使用是未曾用场的,大家只须求在build.gralde在这之中举办如下配置就可以实现无用语言财富的删减,那样在卷入的时候就能够消灭私有项目、android系统库和第三方库中国和南美洲中文的能源文件了,效果照旧相比显著的。

android { //... defaultConfig { // 只保留中文 resConfigs "zh" }}` 
  • 使用AndResGuard压缩

AndResGuard是七个支持您减少APK大小的工具,他的原理肖似Java Proguard,然则只针对财富。他会将原来冗长的能源路线变短,比方将res/drawable/wechat变为r/d/a。详细使用方法参照Github,超轻易实用地减小resources.arsc文件大小。如下图6和图7所示,图6是减少前的成效,图7是减掉完的成效,假若是能源超多的App,压缩效果也是一蹴而就。

图片 7image图片 8image

应用办法也是特别简单,在build.gradle文件中进行如下配置就能够:

andResGuard { mappingFile = null use7zip = true useSign = true keepRoot = false whiteList = [ //for your icon "R.drawable.icon", //for fabric "R.string.com.crashlytics.*", //for umeng update "R.string.umeng*", "R.string.UM*", "R.layout.umeng*", "R.drawable.umeng*", //umeng share for sina "R.drawable.sina*" ] compressFilePattern = [ "*.png", "*.jpg", "*.jpeg", "*.gif", "resources.arsc" ] sevenzip { artifact = 'com.tencent.mm:SevenZip:1.1.9' //path = "/usr/local/bin/7za" }}` 

Dalvik是Android平台运营时的蒙受,但是Dalvik设想不补助直接施行Java的字节码,所以会对编写翻译生成的 .class 文件实行翻译、重构、解释、压缩等拍卖,这些管理进度是由 dx 实行管理,管理到位后转移的产物会以 .dex 结尾,称为Dex文件。

像Taobao、Wechat那几个App,假若大家解析它们的APK能够开采,它们有四个Dex文件,如下图8所示,那是因为单个Dalvik Excutable字节码文件内的方法数不得以超越65539个,所以要求DEX分包配置来制止那么些范围,使利用能够营造并读取DEX文件。

图片 9image

  • Proguard代码混淆

Proguard是一款免费的Java类文件压缩器、优化器和混淆器,Android Studio已经集成了那个工具,只要透过简要的布置,就能够达成,如下代码所示,在build.gradle里面安装minifyEnabled为ture,同时在proguardFiles针对proguard的平整文件就可以。

android { buildTypes{ minifyEnabled true proguardFiles 'proguard.cfg' }}` 

工具

怎么样有系统的为APK节食,必需知道APK的目录构造,不过在讲述这几个前边,笔者那边先介绍几个工具,在后文少禽用到。

为啥自身还要写这篇小说呢?首先,笔者觉着下边那一个随笔里面包车型大巴笔触即便对的,但是只是简短罗列一些艺术,而并不曾施行之后的方法论;其次,大家项目组除了运用方面提到的这么些健康办法之外,还有一点和睦储存的经验,我感到很有价值拿出去跟大家享用。标题中自己极其加了贰个关键字--优雅,重要指的是我们有部分自动化方面包车型大巴实行,相当于一旦您起来应用,那么就能够永世受益,而无需各类版本都亟待人工投入。

总结

App瘦肚是三个经久的长河,建议足以张开每一种版本对APK大小举办监察和控制,列出扩充和减少的点,做到持续的总计和追踪,进而给合营社带给意义。有关学习质感

Android进阶

图片 10image

运动结构师

图片 11image图片 12image

急需那一个安卓学习材质和面试资料的大家供给的珍视 点赞 加群:185873940 免费获得!点击链接加入群聊【Android IOC结构划假造计】:

群内还应该有好多无偿的有关高阶安卓学习材质,包含高档UI、品质优化、布局师课程、 NDK、混合式开拓:ReactNative Weex等多个Android才能知识的构造录制材料,还会有专门的职业生涯规划及面试引导。

AndroidStudio2.2.3

AndroidStudio进级到版本2.2.3从今现在提供了Analyze APK的机能(可是作为AS粉想必已经升到AS2.3了吗,哈哈),大家得以信任该工具清楚的垂询APK的下载大小、解压之后的轻重、内部各样文件夹或文件占用的高低端音信,进而得到消息那壹个地方可以优化。下图为当前小编司测验版APK的里边新闻:

图片 13

APK Info.png

别的利用该工具仍是可以够反编译财富文件、还原layout中的财富id,剖析DEX、显示每一个文件夹或文件的方法数,剖判哪些第三方库方法数浩大但实在只用到了一有的等别的职能。

末段什么行使该工具?有以下二种办法:

  1. 直白将APK拖拽进去AndroidStudio就能够
  2. 点击菜单栏Build-Analyze APK...选项,再接收要求剖判的APK就能够

1.1 项目现状

自个儿当下维护的Android项目是从12年11月份上马的,到明天一度宣布到了8.x本子,上二个版本线上包大小在14.3M,从迭代日子和品种大小来看,已经很给力了,作者时时看到部分刚开辟一七年的APP大小就早就超越了20M.....

先是大家对APK大小的变化做了自动化总结,我们应用的自动化集成遇到是jenkins,笔者在jenkins下面配置了贰个Plot图表插件,每便上线打出APK时它会自动记录下来APK的分寸,然后生成曲线图:

图片 14image.png

从曲线上能够看出来,有多少个本子APK大小较上一个版本会变小,那是因为大家在付加物迭代进程中一定的周期会对APK进行三次节食,这么些周期大致会在5-6个大学本科子,那是二个很好的习于旧贯,也是我们APK八年迭代之后还这么轻量级的缘故,如果大家有不独有集成意况(譬如jenkinsState of Qatar,能够总结每一遍公布的包的深浅,那样就足以生成三个APK大小变化曲线,作为减腹的参阅依赖。

好,收回来,大家上个版本的线上包大小是14.3M,正好目前思想政治工作必要少之甚少,笔者觉着是时候来一波减重了,当中还参杂了三个手艺须要:接入Wechat的财富缩小框架AndResGuard。科学商讨时用这么些库轻松管理了一下线上APK,发掘能够减去容积大致在0.75M左右,所以定了一个大概的靶子:减少APK1.5M~2M左右

所谓APK减重,无非正是从多少个思路去减弱,1、收缩代码的抑扬顿挫,对应于APK中的dex文件;2、减弱财富的大大小小,对于APK中的其余部分。

NimbleDroid

NimbleDroid 是U.S.哥大的大学子创办实业团队研究开发出来的自动化深入分析Android app品质目的的体系,解析的措施有静态和动态两种方法:

其间静态深入分析能够深入分析出APK安装包中山大学文件名次榜,各样有名SDK的大大小小甚至占代码全部的百分比,各系列型文件的分寸以至占排名,种种著名SDK的章程数以致占全部dex中方法数的比例,针对缓慢的艺术,缓慢的第三方SDK和内部存款和储蓄器泄漏。

此中动态解析可以衡量生成的速度、互联网、内部存款和储蓄器和磁盘使用率。

小编用了一晃方面这些工具,感到依然不错的,上面大家来看几张有逼格的图(图中数据出自于笔者司测验版APK):

APK内部种种型对应文件占用的大大小小

图片 15

Size by Type.png

APK内部各种类库的情势数

图片 16

Method Count.png

APK运营进度中逐个艺术的举行时间

图片 17

Hung CPU Methods.png

2.1 代码压缩

有关什么压缩dex文件大小,近日本人通晓到的最首要有以下三种门路:

  • 删去无用的代码逻辑,删除无用的出品逻辑;--->针对源代码 .java
  • proguard混淆代码; --->针对.class文件

它减弱年体育积的原理是首先会去除掉我们源代码里面未有利用的类如故字段,然后剖析调用关系,把一些代码做内联,最后把大家代码中的类名 方法名和变量名替换来更短小的无意义名字。实则class -> dex格式也能够在必然水平上压缩代码的轻重

  • facebook的redex;----> 针对dex文件

redex大家项目里面未有接受,主因是和大家的热修复框架robus冲突(好像暴光公司了...卡塔尔,所以未有深刻去斟酌

至于代码压缩,大家在很已经做了地点的政工,所以那叁遍节食并不思考。

ClassShark

ClassShark 是一款查看Android实践文书(apk)的浏览工具,近些日子有多个android App(Apk)和桌面(jar)的版本。

利用那款工具,可以很有利的开辟APK、Class、Jar、res等公事和深入分析内部的开始和结果。

图片 18

ClassShark.png

只是当下以此工具并无需大家单独使用,因为AS内部的分析工具就是用的这几个。

经过以上中国人民解放军海军事工业程高校业具,大家能够实惠火速的分析APK,寻觅那多少个能够优化的部分,为了特别有系统的进展教学,下边作者会依据APK的目录布局来挨门逐户演讲。

2.2 能源收缩

率先,我们日常使用财富首要有两类,一类是足以生成能源ID,比方大家身处 drawable-xxhdpi中的图片;一类不生成财富ID,比如assets目录上边包车型客车事物。

以此是最简便易行的,Android Studio自带lint检查,大家输入unuse关键字就能够看出各个选项。

图片 19image.png

急需静心的是lint能够检查出来drawable-xxhdpi中的财富是还是不是被引述,不过无法寻觅来assets里面是还是不是有无用的能源(lint是遵照财富id去做索引的,假如一个有能源id的文件未有代码或许xml指向,那么lint以为正是一个无效财富卡塔尔国,所以大家供给手动去看清。你能够全局去搜寻三个文本的文书名,因为品种利用这么些资源必定要透过文件名的措施去开荒,所以只要全勤项目都搜不到,那么那些文件多半就是从未被应用的。

我们在assets中听而不闻会停放各类能源:一类是html、xml 也许json文件;对于这种文件,我们没有须要思谋其可读性,把装有的格式字符和注释都去掉呢,下图是四个大家HTML文件,能够看出被笔者弄成了一行,删掉了各样注释和格式字符:

图片 20image.png

一类是javascript文件,那我们得以让前者协助,给做一下模糊压缩;

图片 21image.png

因此对于assets文件的压缩据守一条标准,简言之、不要酌量可读性。

在意一下:有个别情状下,假诺大家须要在assets中放入几个大文件,那么大家能够把它压缩成三个zip,然后在代码运行时加压到sdcard,那样也得以大大收缩APK体量,可是当下在我们项目中一直不赶过。

首先说一下,假使您的类型minsdk < 14,那些小节对你从未意思,因为小于14的系统原生不扶助webp(能够引进第三库帮助卡塔尔国。

关于如何是webp格式,提议能够看一下Tencent团队的调查研商-WebP 搜求之路。今后游人如织公司都在运用webp做后端图片压缩,比方咱们经过picasso去加载一张图纸的时候,能够把那张图片转变成webp,能够减掉png、jpg等图片的大大小小。相符,对于安装包来讲,大家也得以把品种里面包车型大巴能源图形用webp进行压缩,能够达成减少年体育积的作用。那么怎么把一张png或然jpg压缩成webp呢?幸而,大家得以找到多少个工具叫cwebp,下载地址戳这里,它的主导接纳情势如下:

cwebp -q 80 -m 6 ./a.png -o ./a.webp
  • -q 80 代表压缩品质,0~100,平时提出75~80
  • -m 6 压缩方法次数,0~6,次数越大,压缩时间越长,可是压缩比更加好
  • a.png 和 ./a.webp 代表输入输出

越多的 cwebp使用姿势能够戳这里

有了那些工具,你即可把项目里面包车型大巴图纸转产生webp了?nonono,现在看起来还相当不够尊贵,首要有五个难题:

  • 自小编急需一个个去找到项目中的图片,然后跑一下指令,再把前边的图纸删除...累人不说,对于aar中的财富看起来我们就不能够了。
  • 虽说android api level 14支撑了webp,可是一直到android 4.2.1才修复带反射率的webp的展示难点,假诺你的minsdk未有超出等于18,带发光度的png是不可能开展webp压缩的。

此间有个蛋疼的难点,Android 4.2大版本有八个小本子:4.2 4.2.1 4.2.2 ,可是那多少个本子的api level都是17,所以即便大家项目近年来minsdk是17,也不能够一体减削。

基于此,笔者写了个插件,其实也异常粗略,正是在卷入进程中,在gradle mergeResource任务之后,processResource以前,对APK中保有的图样展开遍历,然后自动削减成webp,并剔除原本的图纸,那一个插件小编曾经上传到github了,接待使用迎接提issue。

自然,若是您只须要简单利用,那么你能够一间接入插件就好了。

 //project buildscript buildscript { repositories { jcenter() } dependencies { classpath 'com.chuyun923.android.plugin:webpcompress:3.0.0' } } //module script apply plugin: 'webpcompress' webpCompress { q = 80 //压缩比例 0~100,100是无损压缩,默认80 skipDebug = true //debug下是否开启webp压缩 默认不开启 cwebpPath = "/Users/pengliang/Downloads/libwebp-0.6.0-rc3-mac-10.12/bin/cwebp" //cwebp命令的路径 openLog = true //是否打开log filterAlpha = true //是否过滤有透明通道的图片 //配置压缩白名单 whiteList = [ "notify_panel_notification_icon_bg.png" ]}

急需专心的是,那些插件信任于cwebp命令,所以你在地点的下载地址下载好之后,要把门路赋值给cwebp帕特h。

万一您的minsdk >= 18 ,那么就可以关闭 filterAlpha=false了,这样全体的图样都会尝试进行webp压缩。最终,会变卦贰个projectbuildDir/outputs/webpcompressoutput.txt 文件,里面著录了插件举行减少的记录log。

AndResGuard这些插件其实可以做两件工作,一是和proguard相似,把我们命名的文本名可能能源名简化为"icon_change_city.png"->"s.png”,那样能够料定滑坡APK中的resources.arsc文件大小。二是能够动用7zip对APK包举行减少。由于我们项目方今在使用v2签字,AndResGuard的7zip压缩不相配v2具名,所以大家项目并不曾开启APK压缩。

财富实行模糊之后,大家再利用 Resources.getIdentifier(String name, String defType, String defPackage卡塔尔 可能 Resources.getResourceName(int resid卡塔尔(قطر‎ 的时候就能失灵,假使有这么的需要,记得配置白名单

标题发生的原由是视觉给的ttf字体文件日常都以在网络copy的,里面富含了好些个东西,以我们在运用的一个字体为例:

图片 22image.png

以此字体大小是98KB,大家得以见到那个字体里面有数字 大写字母和小写字母,但是其实这几个字体我们只是用来显示贰个评分而已...所以大家假若把内部的数字字体提抽出来,那么那么些字体文件(ttf or otf卡塔尔国就能够显明滑坡!

自己找到了fonttools,那一个工具里面有个指令:

pyftsubset ~/Desktop/Old.TTF --text="0123456789."

就领收取来了只含有数字的书体,如下图:

图片 23image.png

那些字体大小从 98KB->3KB

想必你要说了,前边不是一度说过了webp对图纸展开压缩了么?为啥还须要图片压缩?别忘了,少年,我们不菲png是无法打开webp化的,起码近来是如此。网络能找到的种种压缩方法,作者直接利用

2017-08-十十18日更新底下讨论有同学说冬菇街有相仿的插件,小编前边也记得作者看到过,写小说的时候找了一晃未有找到。所以那边补上来:TinyPIC_Gradle_Plugin

解了多少个线上的大厂的APK,大概皆已去掉了x86的支撑,所以大家还宛如何犹豫的吧?x86上边包车型客车so大小大约在500KB左右,大家只须求去掉在外发的包中的x86就可以,内部的话依然须要模拟器调节和测验的:

debug { ndk { abiFilters "armeabi", "x86" }publish { ndk { abiFilters "armeabi" }}

所谓测量试验代码抽离,主要分为两局地:

  • 没有必要宣布到线上的第三库,比如leakcanary,stetho等,只要求在debug阶段供给的代码,大家能够直接给compile设置buildType

图片 24image.png

  • 测量试验逻辑代码,今后为主具备测量试验包都会有二个测试入口:

图片 25image.png

本条测量检验入口里面包车型大巴代码量也很惊人,早先的做法恐怕是存二个标记,就算是线上包,就把那个进口关闭。那样就有个难点,这一个代码仅仅是未有入口而已,不过线上包里面是有代码和能源的,所以大家能够利用Gradle的buildType文件夹来把测量试验代码完全抽离出来:

图片 26image.png

那是小编拆出来能够放置unpublish flavor上面包车型客车代码和能源。

通过地点的优化现在,作者再也打包:线上包:14.3217945M优化完未来的包:11.4988794优化大小在:2.8229MAPK体量减少:百分之二十五

ps:有同学只怕会说,以后手提式有线电话机闪存更加大,客户已经不太会关心APK的几M的分寸了,看表面来讲实在如此,14.3M的APK和11.4M的APK对顾客来讲其实并不灵动,不过倘诺开采职员本身都不曾去不断关心,未有对品种优化有热心,很有相当的大几率大家项目以往已经30M了....

APK目录构造

图片 27

APK目录结构.png

上述表格侧面部分是APK内部暗中同意存在的文书夹或文件,表格左边对于种种文件夹或文件举行了简短的概述,详细的表明会在今后根据侧面的一一依次讲明。

assets目录

assets目录用于贮存需求打包到应用程序的静态文件,它满含以下多少个特点:

  1. 行使AssetManager类管理财富

  2. assets目录内部文件不会被系统一编写译

  3. assets目录帮衬任性深度的子目录

  4. 获得能源供给利用/assets以前(不富含它)的相对路线名,具体代码如下所示:

    String fileNames[] = context.getAssets().list(path);
    

那么,assets目录下都得以放什么文件呢?

说其实的,assets目录能够寄放各个文件,不过符合规律情况下,日常只贮存以下三种文件:字体文件、WEB页面、配置文件、某个图片。

上述两种文件除了配备文件之外,大家都得以开展稳妥的回降管理:

字体文件:可以使用字体能源文件编写制定神器Glyphs扩充压缩,其削减格局实在正是由此删除无需的字符进而减弱APK的分寸。

WEB页面:可以思量采纳7zip压缩工具对该文件实行减少,在行业内部使用的时候解压

某些图片:能够利用tinypng实行图片压缩, 近年来tinypng一度支撑png和jpg图片、.9图的收缩

lib目录

lib目录用于贮存通过C或C 编写编写翻译生成的so文件(native库/JNI开拓),此中央目录布局如下图所示:

图片 28

lib目录布局.png

因为这两天市集上主流的结构还只是arm构造,所以假使不是十分重要的话,能够思虑不支持x86和mips布局,但那并不意味着CPU是x86或mips构造的手提式有线电电话机就不能够平常安装使用APK了,因为身处arm目录下的so库是可以兼容到别的构造的;

别的arm布局中的eabi-v7a比较于eabi只是在图片渲染方面有了相当大的精雕细刻,所以只要so库对图纸渲染未有超级高的须要的话,完全能够把so库只存放在arm eabi目录中,那样可以大大减小APK的体积。

地点的印证或者比较暧昧,下边就拿Tmall、Wechat的APK来证实一下:

图片 29

APK_taobao.png

图片 30

APK_weixin.png

能够见见Taobao和Wechat也是这么管理,所以大家实际也足以如此操作。

res目录

res目录用于存放应用程序的财富文件,主要回顾结构文件、图片、XML配置文件等,它含有以下多少个特点:

  1. 运用Resources类管理财富
  2. res目录内部文件会被系统一编写译
  3. res目录不帮助大肆深度的子目录
  4. 赢得财富不要求通过相对路线寻觅,因为文件会被系统一编写译,所以须要经过财富ID(注:财富ID被存放在resources.arsc文件中)查找

在那之中央目录布局如下图所示:

图片 31

res目录布局.png

上海体育地方相比康健的罗列了res目录下经常包罗的子目录和文书,并表达了逐个子目录或文件的意义。

根据上图我们众人周知可以窥见,res目录正是大家APK瘦腿里面包车型大巴一大主要片段了,由于其含有的文化相当的大,上面笔者会分章节进行演说,尽量一一演讲清楚。

本文由澳门威利斯人发布于威利斯人娱乐,转载请注明出处:APK瘦身探索,性能优化

关键词: 安装包 优雅 APK 瘦身