性能优化之Apk瘦身

瘦身的理由:
1、安装包变大,导致很多用户不愿意安装更新
2、安装包变大,导致新用户不愿意下载
3、安装包变大,流量使用增多,增加其他边际成本

图片优化:

使用矢量图片

矢量图片只需要放置一份
2、图片如果比较大,绘制的时候会很长,制作复杂度高

使用WebP

体积更小,4.2.1+支持透明度

使用png

有透明度,渐变,阴影的情况下选择png

png转WebP

Android Studio 选中图片-> 右键 ->convert to webp 即可

png转WebP的压缩比是很大的

WebP转换方式

采用转换工具
PNG压缩

采用压缩工具对png进行压缩

1、可以采用ImageOptim或者Pngyu对png进行压缩
2、AAPT会使用内置的压缩算法来优化res/drawable目录下的PNG图片,但也可能会导致本来已经优化过的图片体积变大,这里禁用aapt优化PNG图片

aaptOptions{
	cruncherEnabled = false
}

png和jpg图片可以采用这个网站来压缩

其他图片优化

纯色图片代码实现
减少图片资源放置份数

放置xhdip,xxhdpi -如果只放一份会有什么问题

能用代码实现的图片尽量采用代码实现

圆形图片、环形图片,渐变等都可以采用代码实现

开启资源压缩

开启代码混淆与去除无用资源
android{
	...
	buildTypes {
        release {
            shrinkResources true
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

进一步资源混淆

微信开源了AndResGuard工具,对资源进一步混淆

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.2'
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.2.0'
    }
}
andResGuard {
    // mappingFile = file("./resource_mapping.txt")
    mappingFile = null
    // 当你使用v2签名的时候,7zip压缩是无法生效的。
    use7zip = true
    useSign = true
    // 打开这个开关,会keep住所有资源的原始路径,只混淆资源的名字
    keepRoot = false
   //保留不被混淆的资源文件
    whiteList = [
        // for your icon
        "R.drawable.icon",
        // for fabric
        "R.string.com.crashlytics.*",
        // for google-services
        "R.string.google_app_id",
        "R.string.gcm_defaultSenderId",
        "R.string.default_web_client_id",
        "R.string.ga_trackingId",
        "R.string.firebase_database_url",
        "R.string.google_api_key",
        "R.string.google_crash_reporting_api_key"
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
        "resources.arsc"
    ]
    sevenzip {
         artifact = 'com.tencent.mm:SevenZip:1.2.7'
         //path = "/usr/local/bin/7za"
    }

    /**
    * 可选: 如果不设置则会默认覆盖assemble输出的apk
    **/
    finalApkBackupPath = "${project.rootDir}/final.apk"

    /**
    * 可选: 指定v1签名时生成jar文件的摘要算法
    * 默认值为“SHA1”
    **/
    digestalg = "SHA256"
}

冗余代码

产生的原因:

1、复制、粘贴
2、对项目不了解

冗余代码的定义:
  • 完全一致的代码或者只修改了空格和评论
  • 结构和句法上一致的代码,例如只修改了变量名
  • 插入和删除了部分代码
  • 功能和逻辑上一致的代码,语义上的拷贝
检测工具

1、使用工具,例如PMD
2、PMD下载地址:https://pmd.github.io/

如何检测

下载后输入:

./run.sh cpdgui

pmd -d /usr/src -R rulesets/java/quickstart.xml -f text
https://pmd.github.io/pmd-6.17.0/pmd_rules_java.html

Lint大法

未使用资源

1、检测未使用的资源并删除
2、Android Studio ->Analyze ->Run inspection by Name -> unused resource

无用代码优化

Analyze->Run Inspection by Name->unused declaration ->Moudule app ->OK

其他lint优化

压缩存储文件

1、导入7zip,压缩存储预置资源
2、使用时,解压到本地,比如assert中的资源

语言资源优化

在build配置中配置resConfigs指定需要的语言类型

defaultConfig{
	resConfigs "zh","en"
}
```
#### Splits根据不同的ABI以及不同的屏幕密度分别打包
https://developer.android.com/studio/build/configure-apk-splits.html

#### 重复的String,color的优化

1 、过滤重复的String
2、定义唯一的color名


#### 减少Enum使用

每减少一个ENUM文件可以减少1K左右的大小

**采用常量定义**

#### 优化引用的库
> 去除不再使用的库
优化过时的库
仅仅提取使用的代码
选用更小的外部库




#### 音频资源压缩

采用音频压缩工具,压缩音频,降低采样率,通道数等在不明显影响效果的前提下压缩音频

#### So动态下发
So可以采用动态下方的方式加载。(需要考虑下载失败了怎么办?)
仅仅只需要加载对应abi下的so


指定abi
Gradle中指定abiFilter
ndk{
		abiFilters "armeabi-v7a","x86"
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值