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 性能优化指南
相关推荐
Kapaseker2 小时前
Compose 进阶—巧用 GraphicsLayer
android·kotlin
黄林晴2 小时前
Android17 为什么重写 MessageQueue
android
冰_河12 小时前
QPS从300到3100:我靠一行代码让接口性能暴涨10倍,系统性能原地起飞!!
java·后端·性能优化
阿巴斯甜1 天前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker1 天前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95271 天前
Andorid Google 登录接入文档
android
黄林晴1 天前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab2 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿2 天前
Android MediaPlayer 笔记
android
Jony_2 天前
Android 启动优化方案
android