编译后SDK大小减小方案

本文主要从编译,图片压缩,平台等方面对App集成sdk后所带来的增量的减小优化方案进行分析。

清除无用代码和资源

  • Code Shrinking, 代码混淆,清除无用的代码
    混淆可以删除一些没用的类,字段,方法和一些属性,包括我们引入的一些其它库,同时混淆器也优化了字节码,移除了一些用不到的字节码指令,并且用了更短的名称混淆了留下来的一些类的名称,字段名称和方法名称。
    要想混淆你的代码,首先在你app的build.gradle文件中加入如下代码
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile(‘proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

其中proguard-android.txt为系统SDK默认的混淆规则,在proguard-rules.pro文件中编辑你的混淆规则。
官方文档的提供了一点:

To add more ProGuard rules that are specific to each build variant, add another proguardFiles property in the corresponding productFlavor block.

具体到编译变量 这个目前没有试,官方给了个例子:

android {
    ...
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                   'proguard-rules.pro'
        }
    }
    productFlavors {
        flavor1 {
        }
        flavor2 {
            proguardFile 'flavor2-rules.pro'
        }
    }
}

这样flavor2总共用了三个混淆规则。

  • Resource Shringking 清除无用资源
    无用的代码清除完之后,就会有很多无用的资源文件残留,在build.gradle文件中设置shrinkResources为true.
android {
    ...
    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }s
}
  • 清除为使用的可替代资源
    上面的Gradle resource shrinker只是删除掉代码中为引用的资源文件,但意味着不会删除不同配置设备的可替代资源,例如项目中依赖的v7、v4中包含的20种国家的语言,有很多都用不到,可以通过设置resconfigs删除这些可替代的资源文件:
android {
    defaultConfig {
        ...
        resConfigs "en"
    }
}

图片压缩

apk中最占资源之一的就是这些资源图片了,而且一张稍微大点的图片,不但占空间,在差的手机上经常会出现OOM,

  • WebP谷歌提供的一种图片数据格式,无损压缩后的 WebP 比 PNG 文件少了 45% 的文件大小,原生支持Android4.0以上的,其他版本需要官方的依赖库。
  • 矢量图SVG:一个字体TextView代替一张资源文件
    目前只试过矢量图

使用Splits针对不同的设备编译不同的apk

  • 针对不同的屏幕进行拆分

针对不同密度的屏幕,同一个应用程序拆分为hdpi版本和mdpi版本

android {
  ...
  splits { 
  //Configures screen density split settings 
    density {       
    //Enables density APK splits        
      enable true        
      /*Specifies a list of screen densities Gradle should not create APK splits for**/      
      exclude "ldpi", "tvdpi", "xxxhdpi"        
      /** Specifies a list of compatible screen size settings for the manifest**/
      compatibleScreens 'small', 'normal', 'large', 'xlarge'
    }
  }

构建完成后可以在out/apk/目录下看到多个版本的APK

  • 针对不同的CPU进行拆分

按ABI拆分,根据不同的CPU类型,只用相应的.so库,之前测试的时候是只用的一个v7a的兼容的so库。

android {
  ...
  splits {

    // Configures screen ABI split settings
    abi {

      // Enable ABI APK splits
      enable true

      // By default all ABIs are included, so use reset() and include to specify that we only
      // want APKs for x86, armeabi-v7a, and mips

      // Resets the list of ABIs that Gradle should create APKs for to none
      reset()

      // Specifies a list of ABIs that Gradle should create APKs for
      include "x86", "armeabi-v7a", "mips"

      // Specify that we do not want to also generate a universal APK that includes all ABIs
      universalApk false
    }
  }
}

其它

...

参考文献:

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容