如何减少 Android 中的 APK 大小?

本文探讨了如何通过使用AndroidAppBundle、删除未使用资源、压缩图像、利用Proguard和R8等方法来优化Android应用的大小,以提高加载速度,减少内存占用并降低用户下载负担。通过理解并实施这些技术,开发者可以创建更高效、更精简的APK。

没有用户愿意下载大型 APK,因为它可能会占用他的大部分网络/Wifi 带宽,最重要的是,移动设备内的空间。

APK 的大小会影响应用的加载速度、使用的内存量以及消耗的电量。

优化应用程序的大小很重要,因为手机始终是内存和空间受限的设备。那么,在 Android-Development 中我们可以通过哪些方式来提高我们的 apk 大小呢?让我们继续在本文中学习。

了解 Android App Bundle

Android App Bundle是一种发布格式,包含您应用的所有编译代码和资源,并将 APK 生成和签名推迟到 Google Play。


Google Play 使用您的 app bundle 为每个设备配置生成和提供优化的 APK,因此只下载特定设备所需的代码和资源来运行您的应用程序。您不再需要构建、签署和管理多个 APK 来优化对不同设备的支持,并且用户可以获得更小、更优化的下载。

App Bundle 是发布格式


Android App Bundles - 文件定位和服务

  • 这些 Android 应用程序包对文件定位有何帮助?很简单,假设我们的应用程序中有 hdpi、xhdpi、xxhdpi 资源。根据正在下载应用程序的设备,如果它是 hdpi 设备(例如),则只会在设备上安装来自 hdpi 的资源。
  • 如果应用程序针对多种语言(英语、西班牙语、法语等),则只会将特定的字符串资源下载到设备上。
  • 这有助于节省设备内存的空间。

构建 Android App Bundle

  • 构建 Android 应用程序包非常简单。只需从 Android Studio 菜单中选择 Build 选项,然后选择 Build Bundles

    Android 尺寸分析器

为了了解哪些文件实际上在应用程序中占用了更多空间,请使用 Android Studio 中的 Android Size Analyzer 插件。用于安装插件

  1. 选择File > Settings(或在 Mac 上,Android Studio > Preferences。)
  2. 选择左侧面板中的插件部分。
  3. 单击市场选项卡。
  4. 搜索“Android Size Analyzer”插件。
  5. 单击分析器插件的安装按钮。


安装插件后重新启动 IDE。现在,要分析应用程序,请从菜单栏中转到分析 > 分析应用程序大小。我们会得到一个类似这样的窗口:


这些建议可以帮助我们以更好的方式减小应用程序的大小。

删除未使用的资源

正如我们已经讨论过的,apk 的大小会影响应用程序的加载速度、使用的内存量以及消耗的内存功率。因此,可以实现以减少 apk 大小的主要事情之一是删除应用程序中未使用的资源。

此外,建议使用可缩放的可绘制对象(导入矢量资源)而不是其他图像格式,如 PNG、JPEG 等。
使用 Vector Drawable 是显着减小尺寸的最佳方法之一。

使用Lint

Lint 实际上有助于在应用程序内生成警告或未使用的代码。因此,这实际上可以帮助删除它们,从而有助于减小应用程序的大小。

减少库大小

检查在使用库时是否可以减小大小。例如,仅使用特定的 Google Play 服务库。只编译需要的。

重用代码

面向对象编程解决了编程世界中的很多问题。尽量重用代码而不是重复代码。重复代码还会导致文件大小增加,从而影响 Apk 大小。

压缩 PNG 和 JPEG 文件

如果在您的项目中必须使用 PNG 和 JPEG 文件,您可以使用 TinyPNG 等图像质量工具对其进行压缩。

在大多数应用程序中,图像用于传达信息或改善用户体验。但是这里最大的缺点可能是使用了大量的图像,这会增加应用程序的大小。在将应用程序发布到 Play 商店之前,确保了解并实施图像压缩技术以减小 apk 的大小。

使用 WebP 文件格式

正如我们在上面为 Android Analyzer 插件共享的图片中看到的,其中一项建议是将 PNG 文件更改为 WebP 文件格式。

使用 Proguard

每次我们构建一个新项目时,我们都会在应用级的 build.gradle 文件中看到如下一段代码

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

ProGuard 对我们的项目产生以下影响,

  • 它减小了应用程序的大小。
  • 它删除了导致 Android 应用程序的 64K 方法计数限制的未使用类和方法。
  • 它通过混淆代码使应用程序难以进行逆向工程。

创建多个 APK

如果我们不使用 App Bundle,我们可以使用传统方式。我们可以创建多个类似于 App Bundle 的 APK。Multiple apk 主要用于针对不同的屏幕密度和不同的 CPU 架构生成特定的 APK。

收缩资源

尽可能减少资源。在 Gradle 中使用shrinkResources属性将删除项目中任何地方未使用的所有资源。通过添加以下行在您的应用程序级 build.gradle 文件中启用此功能:

buildTypes {
    release {
        ........
        shrinkResources true
        ........
    }
}

资源配置

使用resConfigs删除不需要的本地化资源。所有支持库都可能具有我们不需要的其他语言的本地化文件夹。
Gradle 资源收缩器仅删除您的应用代码未引用的资源,这意味着它不会删除不同设备配置的替代资源(特定于设备/位置)。如有必要,您可以使用 Android Gradle 插件的resConfigs属性来删除您的应用不需要的替代资源文件。
以下代码段显示了如何将语言资源限制为仅英语和法语:

android {
    defaultConfig {
        ...
        resConfigs "en", "fr"
    }
}

如前所述,拥有未使用的语言资源只会增加 apk 的大小。因此,删除未使用的文件和资源很重要。

调试实现

删除您在应用程序中拥有的任何调试库。它可以通过在构建测试调试 apk 时使用debugImplementation来完成。

debugImplementation 'com.amitshekhar.android:debug-db:1.0.1'

使用 R8 减小 APK 大小

R8 缩减是我们减少应用程序代码量的过程,通过这样做,APK 大小会自动减小。R8 作为 Proguard 完成大部分工作。为什么我们需要更喜欢它?原因是它适用于 Proguard 规则并在提高输出大小的同时更快地缩小代码。

最后,有什么比在我们的应用程序中理解和实施这些步骤来为我们的客户提供优化的 apk 更好的了!

这就是这篇文章的全部内容。

我们希望这篇文章对理解在 Android 中减小应用程序大小的不同方法有所帮助。

如果大伙有什么好的学习方法或建议欢迎大家在评论中积极留言哈,希望大家能够共同学习、共同努力、共同进步。

很多人在刚接触安卓这个行业的时候或者是在遇到瓶颈期的时候,总会遇到一些问题,比如学了一段时间感觉没有方向感,不知道该从那里入手去学习,需要一份小编整理出来的学习资料的点击文末微信卡片免费领取~

这里是关于我自己的Android 学习,面试文档,视频收集大整理,有兴趣的伙伴们可以看看~

如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言,一定会认真查询,修正不足,谢谢。

非常感谢您的参与!

### 动态功能模块的基本概念 动态功能模块(Dynamic Feature Modules)是 Android 提供的一种模块化机制,允许开发者将某些功能模块从主应用中分离出来,并在需要时按需下载和安装。这种方式可以显著减小初始 APK大小,提升用户下载和安装的效率。动态功能模块特别适用于型应用,如社交、游戏类应用,其中某些功能仅在特定场景下使用[^2]。 ### 动态功能模块的优势 - **减小初始 APK 体积**:通过将某些功能模块分离为动态模块,主应用的初始安装包可以只包含核心功能,避免包含不必要的功能代码和资源,从而减小 APK 的体积[^2]。 - **按需加载功能**:动态功能模块支持在运行时根据用户需求下载和安装特定功能模块,提升用户体验。例如,某些游戏应用可以在用户进入特定关卡时下载额外的地图资源[^3]。 - **优化资源管理**:通过模块化设计,可以更有效地管理资源文件,避免重复资源和冗余代码,进一步优化应用的整体性能。 ### 动态功能模块的实现步骤 1. **创建动态功能模块**:在 Android Studio 中,可以通过右键项目并选择 "New > Module > Dynamic Feature Module" 来创建一个新的动态功能模块。系统会自动生成相应的目录结构和配置文件。 2. **配置模块依赖关系**:确保动态功能模块依赖于主应用模块(通常为 `app` 模块),并在主应用模块的 `build.gradle` 文件中声明对动态模块的依赖关系。 3. **启用按需下载功能**:使用 `SplitInstallManager` API 实现按需下载和安装功能模块。以下是一个简单的 Kotlin 示例代码: ```kotlin val splitInstallManager = SplitInstallManagerFactory.create(context) val request = SplitInstallRequest.newBuilder() .addModule("dynamic_feature_module_name") .build() splitInstallManager.startInstall(request) .addOnSuccessListener { sessionId -> // 下载成功 } .addOnFailureListener { exception -> // 下载失败处理 } ``` 4. **处理安装状态**:通过监听 `SplitInstallStateUpdatedListener`,可以实时获取模块的安装状态,并在用户界面中提供反馈。 ### 动态功能模块的注意事项 - **兼容性问题**:动态功能模块仅支持 Android 5.0(API 21)及以上版本。对于旧版本设备,需要提供兼容方案或降级处理。 - **模块化设计原则**:合理划分功能模块,确保每个模块具有独立性和可维护性。避免模块之间的强耦合,减少依赖冲突。 - **测试与调试**:由于动态功能模块的加载过程较为复杂,必须进行充分的测试和调试,确保模块能够正确下载、安装和运行。 ### 动态功能模块的实践建议 - **模块划分策略**:根据功能的使用频率和重要性进行模块划分。核心功能应保留在主应用模块中,而低频功能或可选功能可以作为动态模块。 - **资源优化**:确保动态功能模块中的资源文件经过优化,例如使用 WebP 格式图片、删除冗余资源等,以进一步减小模块体积。 - **网络请求优化**:动态功能模块的下载过程涉及网络请求,建议使用高效的网络库(如 OkHttp)并优化请求策略,减少用户等待时间。 - **用户提示机制**:在模块下载过程中,提供明确的用户提示,例如进度条或加载动画,以提升用户体验。 ### 示例代码:动态功能模块的依赖配置 在主应用模块的 `build.gradle` 文件中,添加对动态功能模块的依赖: ```gradle dependencies { implementation project(path: ':dynamic_feature_module_name') } ``` 在动态功能模块的 `build.gradle` 文件中,确保配置了正确的模块类型: ```gradle android { namespace 'com.example.dynamicfeature' compileSdk 33 defaultConfig { minSdk 21 targetSdk 33 } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } // 指定模块类型为动态功能模块 dynamicFeatures = [":dynamic_feature_module_name"] } ``` ### 动态功能模块的应用场景 - **游戏应用**:某些游戏应用可以在用户进入新关卡时下载额外的地图资源或皮肤包。 - **社交应用**:社交应用可以将某些高级功能(如视频编辑、滤镜功能)作为动态模块,在用户需要时下载。 - **教育应用**:教育应用可以将课程内容或实验模块作为动态功能模块,按需提供给用户。 通过合理使用动态功能模块,可以有效减小 APK 的体积,提升应用的灵活性和用户体验。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值