Android性能优化之应用瘦身(APK瘦身)

简介: Android性能优化之应用瘦身(APK瘦身)
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。
专注于分享各领域原创系列文章 ,擅长java后端、移动开发、人工智能等,希望大家多多支持。

在这里插入图片描述

一、导读

我们继续总结学习Android 知识,温故知新。

[lint检查代码]

二、概览

APK瘦身优化的优先级相对来说是比较低的,因为优化后也并不能明显的看到有什么好处,这一块主要影响转换率,应用越小,
可能用户下载的意愿就越高,另外在进行预装时,也有大小的要求。

一般来说我们可以通过下面几种方式来进行优化:

  • 资源文件:压缩;动态下载。
  • so文件:动态so;不同的架构支持(v7a、v8a)。
  • 源代码:用代码分析工具,去除不再使用的代码;插件化。
  • assets:动态下载;压缩。
  • proguard 混淆代码

2.1 apk组成

直接将apk 拖到android studio窗口,或者我们把apk解压后,能看到下面这些文件

文件 描述
classes(有多个).dex Java Class,被DEX编译后可供Dalvik/ART虚拟机所理解的文件格式
lib 存放so文件,可能有多种架构
assets 程序资源,使用AssetManager来调用
res 资源文件,如:drawable、layout
AndroidManifest AndroidManifest
resources.arsc 编译后的二进制资源文件
META-INF 包含了APK中所有文件的签名摘要等信息

三、优化方向

我们的优化方案,就对应这apk的组成

3.1 源代码

3.1.1 代码混淆

3.1.2 移除无用代码

  1. studio 自带的工具
    在这里插入图片描述
  2. 使用CPD/PMD工具
    PMD是一个源代码分析器。它发现常见的编程缺陷,如未使用的变量、空的catch块、不必要的对象创建,等等.
    PMD 网站
    PMD GUI网站:
  3. 使用切面编程的方式进行统计(AOP),确认无用代码。

3.1.3 三方库的处理

统一基础库
统一三方调用的库等等

原则是同样的功能,不要出现多套代码。

3.2 资源文件

  1. 删除冗余资源
  2. 资源混淆
  3. 资源压缩

    • jpg:采取压缩算法,不支持透明通道
    • png:无损压缩,支持透明度
    • webp:无损压缩图像格式,与JPG相比,可大幅减少文件体积

虽然png是无损压缩。但是也有一些网站可以对png图片进行有损压缩,比如tinypng网站

  1. 资源在线化,动态下载

对于一些比较大,又不是很及时要用的图片,可以考虑从服务端下载。

可以使用下面三种方式找出无用的资源

3.2.1 方式一 Inspect Code

  1. 通过Android Studio 菜单栏 → code → Inspect Code
  2. 在弹出的框框中选择 configure (在右下键)
  3. 在弹出的框框中输入 unused resources(在左上角),勾选对应的选项
  4. 点击开始

如下图
在这里插入图片描述

这里的选项实在是很多,我们只找出未使用的资源文件,最好先将其他的选择全取消,然后在勾选 unused resources
在这里插入图片描述

这时候就开始分析项目了,我们耐心等待一会
在这里插入图片描述

3.2.2 方式二

菜单栏 → Refactor → Remove Unused Resources
在这里插入图片描述

这样直接就开始删了,当然要检查下,不要误删。

3.2.3 方式三 腾讯的 Matrix

Matrix是微信终端自研和正在使用的一套APM(Application Performance Management)系统。
Matrix-ApkChecker 作为Matrix系统的一部分,是针对android安装包的分析检测工具,根据一系列设定好的规则检测apk是否存在特定的问题,
并输出较为详细的检测结果报告,用于分析排查问题以及版本追踪。Matrix-ApkChecker以一个jar包的形式提供使用,
通过命令行执行 java -jar ApkChecker.jar 即可运行。

也可以配置一下

java -jar matrix-apk-canary-2.1.0.jar --config CONFIG-FILE-PATH

matrix git 搜索APK Checker,这里有个下载链接,点击下载jar包。

Matrix apkchecker 文档

CONFIG.json文件,也可以之间用官网的,最终会生成两个文件,之间查看即可

{
  "--apk":"E:\\release.apk",
  "--mappingTxt":"E:\\mapping.txt",
  "--output":"E:\\",
  "--format":"mm.html,mm.json",
  "--formatConfig":
  [
    {
      "name":"-countMethod",
      "group":
      [
        {
          "name":"Android System",
          "package":"android"
        },
        {
          "name":"java system",
          "package":"java"
        },
        {
          "name":"com.tencent.test.$",
          "package":"com.tencent.test.$"
        }
      ]
    }
  ],
  "options": [
    {
      "name":"-manifest"
    },
    {
      "name":"-fileSize",
      "--min":"10",
      "--order":"desc",
      "--suffix":"png, jpg, jpeg, gif, arsc"
    },
    {
      "name":"-countMethod",
      "--group":"package"
    },
    {
      "name":"-checkResProguard"
    },
    {
      "name":"-findNonAlphaPng",
      "--min":"10"
    },
    {
      "name":"-checkMultiLibrary"
    },
    {
      "name":"-uncompressedFile",
      "--suffix":"png, jpg, jpeg, gif, arsc"
    },
    {
      "name":"-countR"
    },
    {
      "name":"-duplicatedFile"
    },
    {
      "name":"-unusedResources",
      "--rTxt":"E:\\R.txt",
      "--ignoreResources"
      :["R.raw.*",
        "R.style.*",
        "R.attr.*",
        "R.id.*",
        "R.string.ignore_*",
        "R.dimen.*",
        "R.string.*",
        "R.color.*"
      ]
    },
    {
      "name":"-unusedAssets",
      "--ignoreAssets":["*.so" ]
    }
  ]
}

通过这种方式,我们回得到一个html分析的结果表格,但是我们看到的都是混淆过到资源文件,这时 可以使用 aapt2 来输出apk资源表的内容(resources.arsc文件):

aapt2 dump resources xxx.apk > logx.txt

3.2.4 资源混淆

3.3 so瘦身

动态so;
指定架构支持(如v7a、v8a);

另外还可以只保留一个cpu架构,别的cpu架构自动适配,程序运行过程中,通过判断cpu架构选择合适的so

if(v7a) {
    xxx
} else {
    xxx
}

还有就是插件化,这个是一个专题,我们在另外的文章里面讲。

四、 推荐阅读

Java 专栏

[SQL 专栏]

[数据结构与算法]

[Android学习专栏]

ddd

相关文章
|
15天前
|
缓存 监控 Android开发
探索iOS与安卓开发中的性能优化策略
在移动应用开发的竞技场上,iOS和安卓这两大操作系统不断推动着技术的边界。性能优化,作为提升用户体验的关键因素,已成为开发者们关注的焦点。本文将深入探讨两大平台上的性能优化实践,揭示如何通过工具、技术和策略来提升应用的响应速度和流畅度,同时考虑到电池寿命和内存管理等关键指标。
|
7天前
|
存储 安全 Android开发
"解锁Android权限迷宫:一场惊心动魄的动态权限请求之旅,让你的应用从平凡跃升至用户心尖的宠儿!"
【8月更文挑战第13天】随着Android系统的更新,权限管理变得至关重要。尤其从Android 6.0起,引入了动态权限请求,增强了用户隐私保护并要求开发者实现更精细的权限控制。本文采用问答形式,深入探讨动态权限请求机制与最佳实践,并提供示例代码。首先解释了动态权限的概念及其重要性;接着详述实现步骤:定义、检查、请求权限及处理结果;最后总结了六大最佳实践,包括适时请求、解释原因、提供替代方案、妥善处理拒绝情况、适应权限变更及兼容旧版系统,帮助开发者打造安全易用的应用。
17 0
|
2天前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
|
4天前
|
存储 前端开发 Java
Android MVVM框架详解与应用
在Android开发中,随着应用复杂度的增加,如何有效地组织和管理代码成为了一个重要的问题。MVVM(Model-View-ViewModel)架构模式因其清晰的结构和高效的开发效率,逐渐成为Android开发者们青睐的架构模式之一。本文将详细介绍Android MVVM框架的基本概念、优势、实现流程以及一个实际案例。
16 0
|
8天前
|
调度 Android开发 开发者
【颠覆传统!】Kotlin协程魔法:解锁Android应用极速体验,带你领略多线程优化的无限魅力!
【8月更文挑战第12天】多线程对现代Android应用至关重要,能显著提升性能与体验。本文探讨Kotlin中的高效多线程实践。首先,理解主线程(UI线程)的角色,避免阻塞它。Kotlin协程作为轻量级线程,简化异步编程。示例展示了如何使用`kotlinx.coroutines`库创建协程,执行后台任务而不影响UI。此外,通过协程与Retrofit结合,实现了网络数据的异步加载,并安全地更新UI。协程不仅提高代码可读性,还能确保程序高效运行,不阻塞主线程,是构建高性能Android应用的关键。
28 4
|
7天前
|
编解码 数据可视化 定位技术
Android平台GB28181记录仪在铁路可视化巡检应用
GB28181记录仪在铁路可视化巡检中,集成实时音视频采集、位置上报、语音通信与无线传输技术,确保巡检高效准确。它能实时记录巡检细节,支持高清画质,并通过北斗/GPS实现精确位置追踪。记录仪兼容多种视频与音频格式,具备音量调节与编码参数配置功能,支持横竖屏及后台服务推流。此外,它还能添加动态水印,确保数据完整性,并允许指挥中心远程下载与回放历史视频,全面满足铁路巡检需求。
|
12天前
|
Android开发 开发者 Kotlin
Android 多进程情况下判断应用是否处于前台或者后台
本文介绍在多进程环境下判断Android应用前后台状态的方法。通过`ActivityManager`和服务信息`RunningAppProcessInfo`可有效检测应用状态,优化资源使用。提供Kotlin代码示例,帮助开发者轻松集成。
69 8
|
7天前
|
Android开发
将AAB(Android App Bundle)转换为APK
将AAB(Android App Bundle)转换为APK
16 1
|
7天前
|
Android开发 开发者
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
Android、Flutter为不同的CPU架构包打包APK(v7a、v8a、x86)
18 1
|
8天前
|
Android开发
解决android apk安装后出现2个相同的应用图标
解决android apk安装后出现2个相同的应用图标
48 2

热门文章

最新文章