当前位置: 首页 > article >正文

Android 中APK 体积优化的几种方法

在 Android 开发中,APK 体积优化是一个重要的环节,尤其是在用户下载和安装体验方面。以下是一些常用的方法来压缩 APK 体积:

1. 启用代码和资源压缩

Android 提供了 ProGuard 和 R8 工具来压缩和优化代码和资源。

1.1 启用代码压缩(ProGuard/R8)

在 build.gradle 文件中启用代码压缩:

android {
    buildTypes {
        release {
            minifyEnabled true // 启用代码压缩
            shrinkResources true // 启用资源压缩
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}
  • minifyEnabled true:启用代码压缩和混淆。

  • shrinkResources true:移除未使用的资源文件。

  • proguardFiles:指定 ProGuard 规则文件。

1.2 自定义 ProGuard 规则

在 proguard-rules.pro 中添加自定义规则,确保必要的类和方法不被移除或混淆。

2. 移除未使用的资源

2.1 使用 shrinkResources

在 build.gradle 中启用 shrinkResources,自动移除未使用的资源:

android {
    buildTypes {
        release {
            shrinkResources true // 启用资源压缩
        }
    }
}

2.2 使用 lint 工具

运行 lint 检查未使用的资源:

./gradlew lint

在 lint 报告中查找未使用的资源并手动删除。

2.3 使用 resConfigs 限制资源语言

如果应用只支持特定语言,可以通过 resConfigs 移除其他语言的资源:

android {
    defaultConfig {
        resConfigs "en", "zh" // 只保留英文和中文资源
    }
}

3. 优化资源文件

3.1 压缩图片资源

使用工具(如 TinyPNG 或 ImageOptim)压缩图片。

使用 WebP 格式替代 PNG 或 JPEG,WebP 通常具有更小的体积:

右键点击图片 -> Convert to WebP

3.2 移除未使用的资源

  • 删除未使用的图片、布局、字符串等资源。

  • 使用 lint 工具检查未使用的资源。

3.3 使用矢量图(Vector Drawable)

矢量图可以替代多分辨率的位图,减少资源文件数量:

<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,2L2,22h20L12,2z"/>
</vector>

4. 优化代码

4.1 移除未使用的依赖库

检查 build.gradle 文件,移除未使用的依赖库:

dependencies {
    implementation 'com.example:library:1.0.0' // 确保只保留必要的库
}

4.2 使用代码拆分

  • ABI 拆分:为不同的 CPU 架构生成单独的 APK:
android {
    splits {
        abi {
            enable true
            reset()
            include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
            universalApk false
        }
    }
}
  • 按屏幕密度拆分:为不同的屏幕密度生成单独的 APK:
android {
    splits {
        density {
            enable true
            reset()
            include 'mdpi', 'hdpi', 'xhdpi', 'xxhdpi', 'xxxhdpi'
        }
    }
}

4.3 使用动态功能模块

将部分功能拆分为动态功能模块(Dynamic Feature Module),用户可以在需要时下载:

android {
    dynamicFeatures = [':feature_module']
}

5. 使用 Android App Bundle (AAB)

Google Play 推荐使用 AAB 格式上传应用,Google Play 会根据用户设备生成优化的 APK:

  • 在 build.gradle 中启用 AAB:
android {
    bundle {
        language {
            enableSplit = true
        }
        density {
            enableSplit = true
        }
        abi {
            enableSplit = true
        }
    }
}
  • 使用 Android Studio 生成 AAB 文件:

点击 Build -> Build Bundle(s) / APK(s) -> Build Bundle(s)。

6. 移除调试信息

在发布版本中移除调试信息,减少 APK 体积:

android {
    buildTypes {
        release {
            debuggable false
            jniDebuggable false
            renderscriptDebuggable false
        }
    }
}

7. 使用第三方工具

7.1 AndResGuard

AndResGuard 是一个资源混淆工具,可以进一步压缩资源文件:

  • 在 build.gradle 中添加插件:
plugins {
    id 'com.tencent.andresguard'
}
  • 配置 AndResGuard:
andResGuard {
    mappingFile = null
    use7zip = true
    useSign = true
    keepRoot = false
    whiteList = [
        // 保留白名单资源
    ]
    compressFilePattern = [
        "*.png",
        "*.jpg",
        "*.jpeg",
        "*.gif",
    ]
}

7.2 Zipalign

  • 使用 zipalign 工具优化 APK 文件:
zipalign -v 4 input.apk output.apk

8. 检查 APK 内容

使用 Android Studio 的 APK 分析工具检查 APK 内容,找出体积较大的文件:

  • 打开 APK 分析工具:

点击 Build -> Analyze APK。

  • 查看 APK 中占用空间较大的文件,并针对性优化。

http://www.kler.cn/a/534179.html

相关文章:

  • 【Rust自学】20.2. 最后的项目:多线程Web服务器
  • 今日AI和商界事件(2025-02-05)
  • w193基于Spring Boot的秒杀系统设计与实现
  • 开工了,搬砖了!
  • 关于deepseek的一些普遍误读
  • 简单本地部署deepseek(软件版)
  • 【科研】 -- 医学图像处理方向,常用期刊链接
  • Python:温度转化
  • pandas习题 070:将数据库中大数据分块读取计算
  • 2.4学习
  • TCP三次握手、四次挥手过程及原理
  • swift 专题三 swift 规范一
  • 5.6 Mybatis代码生成器Mybatis Generator (MBG)实战详解
  • 在 Debian/Ubuntu 系统上,永久固定网口的IP地址
  • 基于 SpringBoot3 的 SpringSecurity6 + OAuth2 自定义框架模板
  • DeepSeek R1技术报告关键解析(8/10):DeepSeek-R1 的“aha 时刻”,AI 自主学习的新突破
  • Linux zcat 命令使用详解
  • labview通过时间计数器来设定采集频率
  • vue2-v-if和v-for的优先级
  • Ubuntu添加硬盘踩坑日志:SMB无权限的问题
  • 【前端构建】Rollup: 下一代 JavaScript 模块打包器
  • 【Elasticsearch】文本分类聚合Categorize Text Aggregation
  • 路由器及工作原理与常用路由配置命令详解
  • Redis主从模式与哨兵模式详解及案例分析
  • 如何利用maven更优雅的打包
  • java 日常下拉框接口字典封装