整理记录工作中用到的 App 性能优化

前言

本篇总结整理工作中用到过的app 性能优化方案

流量优化

  1. 网络图片更换webp
  2. 三方库检测上报仅wifi环境上传
  3. 资源下载提示是否使用流量下载
  4. 合并http请求来减少http请求次数,避免二次请求
  5. 制定合理的http请求数据格式和返回数据格式,做到请求数据中没有冗余字段,有必要时做数据压缩
  6. url使用短链接传送
  7. 扩大本地图片缓存
  8. 地图可以做本地缓存
  9. 进行大数据量下载时,尽量使用GZIP方式下载

电量优化

  1. 减少唤醒设备操作,减少 timer
  2. 减少io操作。如数据库操作、SP操作(存在每次页面切换)、文件操作等
  3. 大量的计算,考虑移到后台处理,如拼音解析,排序
  4. 充电状态处理耗电任务,如数据迁移,处理、备份数据等
  5. 减少各种 senser 使用,如摇一摇、旋转、录音、GPS的使用场景
  6. 减少动画和透明 view,某些低端机甚至可以关闭动画
  7. 精简广播,精简高运算量算法
  8. 合并 http 请求来减少 http 请求次数,避免二次请求
  9. 制定合理的Http请求数据格式和返回数据格式,做到请求数据中没有冗余字段
  10. 在需要网络连接的程序中,首先检查网络连接是否正常,如果没有网络连接,那么就不需要执行相应的程序
  11. 目在进行大数据量下载时,尽量使用 GZIP 方式下载
  12. 回收 java 对象,特别是较大的 java 对像,使用 reset 方法
  13. 对定位要求不是太高的话尽量不要使用 GPS 定位,可能使用 wifi 和移动网络 cell 定位即可
  14. 尽量不要使用浮点运算
  15. 获取屏幕尺寸等信息可以使用缓存技术,不需要进行多次请求
  16. 使用 AlarmManager 来定时启动服务替代使用 sleep 方式的定时任务(如心跳服务)
  17. 减少高频刷新
  18. 谨慎使用 WakeLock

apk 瘦身

资源文件优化

  1. 使用一套资源 (如:切图只取1080p的资源放到xxhdpi目录)
  2. 开启 shrinkResources 去除无用资源
android {
    buildTypes {
        release {
            shrinkResources true
            }
        }
    }
  1. 删除无用的语言资源
//无国际化支持计划,暂时只保留中文
android {
    defaultConfig {
        resConfigs "zh"
    }
}
  1. 使用tinypng有损压缩
1. android打包本身会对png进行无损压缩,效果非常好,强烈推荐。Tinypng的官方网站:<http://tinypng.com/>
2. 通过tiny插件自动压缩:下载插件 Biu
  1. 覆盖第三库里的大图 (有些第三库里引用了一些大图但是实际上并不会被我们用到,就可以考虑用1x1的透明图片覆盖)
  2. 表情包安装后下载
  3. 使用微信资源压缩打包工具

微信资源压缩打包工具通过短资源名称,采用7zip对APP进行极致压缩实现减小APP的目标,强烈推荐。

//建议开启7zip,注意白名单的配置,否则会导致有些资源找不到,官方已经发布AndResGuard到gradle中了:

apply plugin: 'AndResGuard'
buildscript {
    dependencies {
        classpath 'com.tencent.mm:AndResGuard-gradle-plugin:1.1.7'
    }
}
andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    // add <your_application_id>.R.drawable.icon into whitelist.
    // because the launcher will get thgge icon with his name
    def packageName = <your_application_id>
    whiteList = [
    //for your icon
    packageName + ".R.drawable.icon",
    //for fabric
    packageName + ".R.string.com.crashlytics.*",
    //for umeng update
    packageName + ".R.string.umeng*",
    packageName + ".R.string.UM*",
    packageName + ".R.string.tb_*",
    packageName + ".R.layout.umeng*",
    packageName + ".R.layout.tb_*",
    packageName + ".R.drawable.umeng*",
    packageName + ".R.drawable.tb_*",
    packageName + ".R.anim.umeng*",
    packageName + ".R.color.umeng*",
    packageName + ".R.color.tb_*",
    packageName + ".R.style.*UM*",
    packageName + ".R.style.umeng*",
    packageName + ".R.id.umeng*"
    ]
    compressFilePattern = [
    "*.png",
    "*.jpg",
    "*.jpeg",
    "*.gif",
    "resources.arsc"
    ]
    sevenzip {
    artifact = 'com.tencent.mm:SevenZip:1.1.7'
    //path = "/usr/local/bin/7za"
    }
}

//会生成一个andresguard/resguard的Task,自动读取release签名进行重新混淆打包。

代码依赖库优化

  1. 去除无用三方库
  2. 避免为了使用一小部分功能引入整个三方库,将使用到的功能类进行选择性拷贝
  3. 移除功能类似的重复库
  4. lint 检查,去除无用文件和无效代码

其他

  1. 开启 minifyEnabled 混淆压缩代码,各个业务SDK独立混淆自己的模块,并保留混淆后的Mapping文件
  2. webp,VectorDrawable 图片替换
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容