编译后SDK大小减小方案

2016-10-25  本文已影响0人  带土的旋律

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

清除无用代码和资源

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总共用了三个混淆规则。

android {
    ...
    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }s
}
android {
    defaultConfig {
        ...
        resConfigs "en"
    }
}

图片压缩

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

使用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

按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
    }
  }
}

其它

...

参考文献:

上一篇 下一篇

猜你喜欢

热点阅读