加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 站长资讯 > 评论 > 正文

类比于微信,如何对Apk进行极限压缩,谈下Android压缩8大步

发布时间:2019-10-14 21:06:06 所属栏目:评论 来源:SoftwareGames
导读:副标题#e# 简介 随着项目的不断迭代,代码量跟资源文件不断增多。那么就会出现打包后的 APK 文件越来越大,如果突然有一天你们老板或领导叫你优化 APK 大小,你还不知道怎么优化那就有点说不过去了,这篇文章咱们就来一起分析并优化 APK 体积大小吧。 分析

5. 开启混淆

类比于微信,如何对Apk进行极限压缩,谈下Android压缩8大步

优化了大概 1.7M 继续。

6.移除无用资源 shinkResource

开启 shinkResource = true

  1. buildTypes { 
  2. release { 
  3. minifyEnabled true 
  4. shrinkResources = true 
  5. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
  6. debug { 
  7. shrinkResources = true 
  8. minifyEnabled true 
  9. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 

类比于微信,如何对Apk进行极限压缩,谈下Android压缩8大步

这个有可能 link 删除了无用资源,所以没有在优化了

7.开启删除无用资源 (严格模式和普通模式) - 这个我这里就不可测试,你们下来可以测试下效果

普通模式也就是自定义模式

如果您有想要保留或舍弃的特定资源,请在您的项目中创建一个包含 标记的 XML 文件,并在 tools:keep 属性中指定每个要保留的资源,在 tools:discard 属性中指定每个要舍弃的资源。这两个属性都接受逗号分隔的资源名称列表。您可以使用星号字符作为通配符。

例如:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources xmlns:tools="http://schemas.android.com/tools" 
  3.  tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*" 
  4.  tools:discard="@layout/unused2" /> 

将该文件保存在项目资源中,例如,保存在 res/raw/keep.xml。构建不会将该文件打包到 APK 之中。

指定要舍弃的资源可能看似愚蠢,因为您本可将它们删除,但在使用构建变体时,这样做可能很有用。例如,如果您明知给定资源表面上会在代码中使用(并因此不会被压缩器移除),但实际不会用于给定构建变体,就可以将所有资源放入公用项目目录,然后为每个构建变体创建一个不同的 keep.xml 文件。构建工具也可能无法根据需要正确识别资源,这是因为编译器会添加内联资源 ID,而资源分析器可能不知道真正引用的资源和恰巧具有相同值的代码中的整数值之间的差别。

严格模式

正常情况下,资源压缩器可准确判定系统是否使用了资源。不过,如果您的代码调用 Resources.getIdentifier()(或您的任何库进行了这一调用 - AppCompat 库会执行该调用),这就表示您的代码将根据动态生成的字符串查询资源名称。当您执行这一调用时,默认情况下资源压缩器会采取防御性行为,将所有具有匹配名称格式的资源标记为可能已使用,无法移除。

例如,以下代码会使所有带 img_ 前缀的资源标记为已使用。

  1. String name = String.format("img_%1d", angle + 1); 
  2. res = getResources().getIdentifier(name, "drawable", getPackageName()); 

资源压缩器还会浏览代码以及各种 res/raw/ 资源中的所有字符串常量,寻找格式类似于 file:///android_res/drawable//ic_plus_anim_016.png 的资源网址。如果它找到与其类似的字符串,或找到其他看似可用来构建与其类似的网址的字符串,则不会将它们移除。

这些是默认情况下启用的安全压缩模式的示例。但您可以停用这一“有备无患”处理方式,并指定资源压缩器只保留其确定已使用的资源。要执行此操作,请在 keep.xml 文件中将 shrinkMode 设置为 strict,如下所示:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <resources xmlns:tools="http://schemas.android.com/tools" 
  3.  tools:shrinkMode="strict" /> 

如果您确已启用严格压缩模式,并且代码也引用了包含动态生成字符串的资源(如上所示),则必须利用 tools:keep 属性手动保留这些资源。

8. AndResGuard 微信资源压缩方案

什么是 AndResGuard

AndResGuard 是一个缩小 APK 大小的工具,它的原理类似 Java Proguard ,但是只针对资源。它会将原本冗长的资源路径变短,例如将 res/drawable/wechat 变为 r/d/a。

为什么使用 AndResGuard

在以往的开发中,我们通常只混淆了代码,资源文件却暴露在他人面前,res 文件夹下所有文件名的可读性过强。

使用后的效果

类比于微信,如何对Apk进行极限压缩,谈下Android压缩8大步

AndResGuard 的配置

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读