Android 包体积优化实践——入门级攻略

包体积直接影响应用的下载转化率、用户留存和性能体验。以下从 资源清理、压缩优化、三方库管理、动态库裁剪、大图处理 等维度,结合工具链和代码示例,系统化讲解优化方案。

一、清理无用资源

1、使用 Lint 检测无用资源

  • 运行 Lint 检测

    Android Studio → Analyze → Run Inspection by Name → 输入 Unused resources

    Lint 会列出未使用的图片、布局、字符串等资源。

  • 自动清理配置

    build.gradle 中开启资源压缩和配置保留规则:

    java 复制代码
    groovy
    android {
        buildTypes {
            release {
                shrinkResources true   // 启用资源压缩
                minifyEnabled true     // 启用代码混淆
                resConfigs "zh", "xxhdpi" // 保留指定语言和分辨率资源
                proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            }
        }
    }

2、手动清理冗余资源

  • 删除无用资源

    如历史遗留的图片、布局、strings.xml 中未引用的字符串。

  • 合并重复资源

    统一相同功能的图标和背景,避免多套重复资源。

二、资源压缩与优化

1、图片资源优化

  • 转换格式为 WebP/AVIF

    • Android Studio 一键转换:右击图片 → Convert to WebP(支持透明度、无损/有损压缩)。

    • TinyPNG/TinyJPG:通过 TinyPNG官网 或 API 批量压缩 PNG/JPG。

      groovy 复制代码
      // 示例:Gradle 插件集成 TinyPNG API
      plugins {
          id 'com.tinify.gradle' version '1.6.0'
      }
      tinify {
          apiKey = "YOUR_API_KEY"
          srcDir = "src/main/res"
      }
  • 使用矢量图(Vector Drawable)

    简单图标用矢量图替代 PNG,减少体积且适配所有分辨率。

    xml 复制代码
    <!-- 示例:矢量图标 -->
    <vector xmlns:android="http://schemas.android.com/apk/res/android"
        android:width="24dp"
        android:height="24dp"
        android:viewportWidth="24"
        android:viewportHeight="24">
        <path android:fillColor="#FF0000" android:pathData="M12,2L3,5v6c0,5.5 3.8,10.7 9,12 5.2-1.3 9-6.5 9-12V5L12,2z"/>
    </vector>

2、代码与资源混淆

  • 启用 R8/ProGuard

    删除未使用的代码和资源,缩短类名和方法名。

    proguard 复制代码
    # proguard-rules.pro
    -keep class com.example.model.** { *; }  # 保留数据模型类
  • 资源混淆(AndResGuard)

    腾讯开源的资源混淆工具,将资源文件名改为短路径。

    groovy 复制代码
    // build.gradle
    apply plugin: 'AndResGuard'
    andResGuard {
        mappingFile = null
        use7zip = true
        keepRoot = false
        whiteList = ["R.drawable.icon"]  # 保留指定资源
    }

三、动态库(.so)优化

1、移除冗余的 CPU 架构

  • 配置 ABI 过滤

    只保留主流架构(如 armeabi-v7aarm64-v8a)。

    groovy 复制代码
    android {
        defaultConfig {
            ndk {
                abiFilters 'armeabi-v7a', 'arm64-v8a'
            }
        }
    }
  • 动态下发 .so 文件

    通过插件化或云端按需下载动态库(需服务端支持)。

    kotlin 复制代码
    // 示例:检查 .so 文件是否存在,不存在则下载
    if (!File(libDir, "libnative.so").exists()) {
        downloadFileFromCDN("https://cdn.example.com/libnative.so", targetPath)
    }

2、使用动态功能模块(Dynamic Feature)

  • 配置 App Bundle

    将非核心功能模块(如 AR、音视频)设置为按需下载。

    groovy 复制代码
    // build.gradle
    android {
        dynamicFeatures = [':dynamic_video']
    }

3、Android App Bundle(AAB)

  • 按设备分发:上传 AAB 至 Google Play,自动生成适配设备的 APK。

    groovy 复制代码
    android {
        bundle {
            abi {
                enableSplit = true  // 拆分不同 ABI
            }
            density {
                enableSplit = true  // 拆分不同屏幕密度资源
            }
        }
    }

四、第三方 SDK 优化

1、依赖分析

  • 查看依赖树:识别重复或冗余库。

    bash 复制代码
    ./gradlew app:dependencies --configuration releaseRuntimeClasspath

2、选择性引入模块

  • 模块化 SDK:如 Firebase 按需引入。

    groovy 复制代码
    implementation 'com.google.firebase:firebase-analytics:21.3.0'
    implementation 'com.google.firebase:firebase-crashlytics:18.4.3'

3、替换轻量级库

  • 网络库:OkHttp 替代 Volley。
  • 图片库:Glide 或 Coil 替代 Picasso。

4、配置 ProGuard 规则

  • 确保三方 SDK 的混淆规则正确,避免保留无用代码。

    proguard 复制代码
    # 示例:保留微信 SDK 类
    -keep class com.tencent.mm.opensdk.** { *; }

五、进阶优化

1、代码混淆与优化

  • R8 规则:移除无用代码并优化字节码。

    proguard 复制代码
    # proguard-rules.pro
    -keep class com.example.model.** { *; }  # 保留数据模型类

2、资源文件复用

  • 复用系统资源:使用 Android 内置图标或颜色。

    xml 复制代码
    <androidx.appcompat.widget.AppCompatImageView
        android:tint="?attr/colorPrimary" />

3、Hilt 或 Dagger 优化

  • 编译时注入:减少运行时反射带来的体积开销。

六、工具链推荐

工具 用途 使用场景
Android Lint 检测无用资源、代码问题 本地开发阶段
APK Analyzer 分析 APK 组成,查看各文件体积占比 优化前后对比
TinyPNG 压缩 PNG/JPG 图片(API 支持批量处理) 图片资源优化
AndResGuard 资源混淆,缩短资源路径 发布前混淆
Bundletool 生成和测试 App Bundle 动态分发优化
Google Play App Bundle 应用分发格式,按需下发资源 上架 Google Play

七、总结与注意事项

优化方向 关键技术 预估收益
无用资源清理 Lint + Resource Shrinking 减少 5%~15%
图片与资源压缩 WebP + AndResGuard 减少 10%~30%
.so 文件优化 ABI 过滤 + Android App Bundle 减少 20%~50%
第三方 SDK 瘦身 依赖分析 + 模块化引入 减少 5%~20%

1、持续监控

  • 每次发版前通过 CI 生成 APK 体积报告,设定体积阈值预警。

2、兼容性测试

  • 资源混淆和 ABI 过滤后,需覆盖测试不同机型,避免功能异常。

3、平衡性能与体积

  • 避免过度压缩图片导致渲染耗时增加,影响用户体验。

4、动态下发策略

  • 非核心功能(如主题皮肤、语言包)优先使用热更新或按需下载。

5、版本兼容

  • WebP 需最低 API 14(4.0+),矢量图需 API 21+(可通过 AppCompat 兼容低版本)。

通过系统化的优化策略,可显著降低包体积,提升用户下载意愿与应用性能。优化过程中需结合业务需求,权衡性能、体积与开发成本。

更多分享

  1. Android 应用【内存优化】指南
  2. Android 应用【内存泄漏】优化指南
  3. Android ContentProvider 详解及结合 Jetpack Startup 的优化实践
  4. Android 冷启动优化实践:含主线程优化、资源预加载与懒加载、跨进程预热等
  5. Android RecyclerView 性能优化指南
相关推荐
佩奇的技术笔记3 分钟前
高性能Java并发编程:线程池与异步编程最佳实践
java·性能优化
小墙程序员1 小时前
一文了解 Android 中的 UID、GID、PID
android
&有梦想的咸鱼&3 小时前
Android Compose 框架文本选择与编辑模块源码深度剖析(三)
android
二流小码农3 小时前
鸿蒙开发:远场通信服务rcp会话问题
android·ios·harmonyos
SuperHeroWu74 小时前
【HarmonyOS Next】鸿蒙中App、HAP、HAR、HSP概念详解
华为·app·harmonyos·鸿蒙·har·hsp·hap
stevenzqzq5 小时前
kotlin @JvmStatic的使用
android·开发语言·kotlin
氦客5 小时前
Kotlin知识体系(二) : Kotlin的七个关键特性
android·开发语言·kotlin·安卓·特性·data class·密封类
前端大卫6 小时前
【Chrome 官方示例】🔥手把手教你解锁 Performace 选项卡
前端·javascript·性能优化
阿豪元代码6 小时前
Perfetto 快速上手指南1 —— Trace 的抓取
android
&有梦想的咸鱼&6 小时前
Android Fresco 框架扩展模块源码深度剖析(四)
android