使用友盟+的APM服务实现基于APK加速启动时间的Android系统资源优化

本文涉及的产品
应用实时监控服务-用户体验监控,每月100OCU免费额度
应用实时监控服务-应用监控,每月50GB免费额度
简介: 为了尽可能减⼩应⽤的⼤⼩,我们应该在发布版本中移除不使⽤的代码和资源。 另外还存在两个优化⽅向可以⽤来缩减应⽤程序的占⽤空间,⼀项是使⽤混淆处理功能,该功能会缩短应⽤的类 和成员的名称;另⼀项是使⽤优化功能,该功能会采⽤更积极的策略来进⼀步减⼩应⽤的⼤⼩。本⽂将介绍如何通过APK的资源优化来减轻应⽤程序的占⽤空间从⽽节省⽤户资源。

为了尽可能减⼩应⽤的⼤⼩,我们应该在发布版本中移除不使⽤的代码和资源。 另外还存在两个优化⽅向可以⽤来缩减应⽤程序的占⽤空间,⼀项是使⽤混淆处理功能,该功能会缩短应⽤的类 和成员的名称;另⼀项是使⽤优化功能,该功能会采⽤更积极的策略来进⼀步减⼩应⽤的⼤⼩。本⽂将介绍如何通过APK的资源优化来减轻应⽤程序的占⽤空间从⽽节省⽤户资源。

提出问题

⾸先使⽤友盟+推出的产品U-APM来实际测试应⽤程序在不同的设备上的使⽤情况:

1.jpg

从图中可以看出应⽤程序在启动时间上还存在优化空间,下⼀步我们将读取应⽤程序的内存分配,确定能从哪些⽅向⼊⼿对资源进⾏优化,从⽽加快启动时间。

哦2.jpg


为了对以上⼏个指标进⾏详细分析,我们使⽤了Android窗⼝上的Memory选项卡,它将向我们显示随时间在堆上分配的数据量:

2.jpg

图中显示发⽣了 GC 事件, 删除了未使⽤的对象并释放了堆上的空间。

为了调查当前在堆中分配的内容, 我们可以使⽤左侧的堆转储按钮。 这将对堆中当前分配的内容 进⾏快照,并将其显示在AndroidStudio内的特殊报告屏幕中:

3.jpg

在左侧,我们看到堆中实例的直⽅图,按类名分组。对于每⼀个,都有分配的对象数量、这些实例的⼤⼩(浅层⼤⼩)以及这些对象在内存中保留的⼤⼩。后者告诉我们如果这些实例被释放 可以释放多少内存。 这个视图让我们对应⽤程序的内存占⽤有⼀个重要的了解, 帮助我们识别⼤ 型数据结构和对象关系。 这些信息可以帮助我们构建更⾼效的数据结构, 解开对象连接以减少保 留的资源,并最终尽可能地减少资源占⽤。

随后,我们使⽤单个布局⽂件构建⼀个最⼩的APK以计算布局⽂件的名称在AndroidAPK出现次数。

使⽤Gradle构建Android应⽤程序只需要⼀个AndroidManifest.xml⽂件。我们可以添加⼀个虚拟布局。


.

├── build.gradle

└── src

└── main

├── AndroidManifest.xml

└── res

└── layout

└── home_view.xml

运⾏gradleassembleRelease将产⽣⼀个只有2,118字节的发布版APK我们可以使⽤转储其 内容xxd并查找home_view字节序列。

5.jpg

6.jpg

根据此输出,在 APK 中存在 3 次未压缩的路径和 1 次未压缩的仅名称。

zip ⽂件是⼀个⽂件条⽬列表,后跟所有可⽤条⽬的⽬录。每个条⽬都包含⽂件路径,⽬录也是如此。这说明了输出中的第⼀次出现(条⽬标题)和最后⼀次出现(⽬录记录)。

输出中出现的中间两次来⾃resources.arsc⽂件内部,该⽂件是资源排序的数据库。它的内容是

可⻅的,因为该⽂件在 APK 中未压缩。运⾏aapt dump --values resources

build/outputs/apk/release/app-release-unsigned.apk显示home_view记录及其到路径的映射:

7.jpg

APK 包含classes.dex⽂件中第五次出现的名称。它没有显示在xxd输出中,因为⽂件被压缩了。运⾏baksmali dump <(unzip -p build/outputs/apk/release/app-release-unsigned.apkclasses.dex)显示 dex ⽂件的字符串表,其中包含以下条⽬home_view:

8.jpg

这是⽤于将R.layout布局名称映射到唯⼀整数值的类中的字段。顺便说⼀下,该整数是

resources.arsc数据库的索引,⽤于查找相关⽂件名以读取其 XML 内容。

总结⼀下我们问题的答案,对于每个资源⽂件,完整路径出现 3 次,名称出现两次。

优化资源

Android Gradle 插件 4.2 引⼊了⼀个android.enable ResourceOptimizations=true标志,它将运⾏针对资源的优化。这会aapt optimize在合并的资源和resources.arsc⽂件打包到 APK 之前调⽤它们的命令。优化仅适⽤于发布版本,⽆论是否minifyEnabled设置为 true ,都会运⾏。添加标志后,gradle.properties我们可以使⽤漫反射来⽐较两个 APK以查看其效果。输出很⻓,所以我们将按部分分解。

9.jpg

10.jpg

⾸先是 APK 中内容的差异。“压缩”列是 APK 内的成本,“未压缩”列是提取时的成本。该res类别代表我们的单个资源⽂件,其⼤⼩下降了 28 个字节。该arsc类别⽤于resource.arsc本身,显然,这⾥产⽣了⼀定的优化。

11.jpg

这两部分代表资源数据库的代码和内容。没有变化,我们可以推断优化没有影响

R.layout.home_view字段和home_view资源条⽬。

12.jpg

最后显示了优化的效果。我们的布局资源的⽂件名被明显截断并移出layout/⽂件夹。

在 Gradle 项⽬中,XML 的⽂件夹和⽂件名是有意义的。⽂件夹是资源类型,名称对应.arsc⽂件中⽣成的字段和资源条⽬。但是,如果这些⽂件位于 APK 中,⽂件路径就变得毫⽆意义。资源优化通过使名称尽可能短来进⾏优化。

输出aapt dump资源数据库也反映了⽂件更改:

13.jpg

APK 中路径的所有三个出现现在都更短,从⽽节省了 36 字节。虽然 36 字节是⼀个⾮常⼩的数字,但整个⼆进制⽂件只有 2,118 字节。36 字节的节省了 1.7% 的资源。

Nick Butcher 的Plaid应⽤程序有 734 个资源⽂件。除了数量之外,资源⽂件的名称更具描述性(这是说它们更⻓的⼀种奇特⽅式)。home_viewPlaid 包含的名称是searchback_stem_search_to_back.xml、attrs_elastic_drag_dismiss_frame_layout、 和

designer_news_story_description.xml。

没有资源优化的构建与启⽤它的构建进⾏⽐较:

14.jpg

资源优化使 APK ⼤⼩节省了 0.76%。

Uwe Trottmann 的SeriesGuide应⽤程序有 1044 个资源⽂件。与 Plaid 不同,它没有本机库,这应该会让优化效果更好。

我再次将项⽬更新到 AGP 4.2并⽐较两个版本:

15.jpg

16.jpg

在这⾥,资源优化能够将 APK ⼤⼩减少 2.0%!

Chris Banes 的Tivi应⽤程序有⼀个使⽤Jetpack Compose 编写的重要⼦集,这意味着整体资源更少。当前构建仍包含 776 个资源⽂件。

通过使⽤ Compose,Tivi 已经在使⽤最新的 AGP 4.2。通过两个快速构建,我们可以看到资源优化的影响:

17.jpg

我们再⼀次达到了 APK ⼤⼩缩减 2.0% 的程度

APK签名

APK 签名有多个版本,如果您的版本minSdkVersion低于 24,则需要在签名时包含版本V1。

V1 签名使⽤Java 的.jar 签名规范,该规范将每个⽂件作为⽂件中的⽂本条⽬单独签名METAINF/

MANIFEST.MF。

在为原始单布局应⽤程序创建和配置密钥库后,转储清单⽂件unzip -c

build/outputs/apk/release/app-release.apk META-INF/MANIFEST.MF显示以下签名:

18.jpg

每个⽂件的完整路径出现,使每个资源路径的总出现次数达到四次。由于较短的名称将再次导致此⽂件包含更少的字节,因此资源优化在签名中具有更⼤的影响。

________________________________________

根据资料显示,这⼀⽅法可以节省 1-3% 的APK ⼤⼩。根据实际测试,这个范围似乎是正确的。最终节省的费⽤将取决于 APK 中资源⽂件的⼤⼩和数量。

作者:杜洪林






相关实践学习
通过云拨测对指定服务器进行Ping/DNS监测
本实验将通过云拨测对指定服务器进行Ping/DNS监测,评估网站服务质量和用户体验。
相关文章
|
3月前
|
人工智能 搜索推荐 物联网
Android系统版本演进与未来展望####
本文深入探讨了Android操作系统从诞生至今的发展历程,详细阐述了其关键版本迭代带来的创新特性、用户体验提升及对全球移动生态系统的影响。通过对Android历史版本的回顾与分析,本文旨在揭示其成功背后的驱动力,并展望未来Android可能的发展趋势与面临的挑战,为读者呈现一个既全面又具深度的技术视角。 ####
|
16天前
|
Dart 前端开发 Android开发
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
|
3月前
|
IDE Java 开发工具
移动应用与系统:探索Android开发之旅
在这篇文章中,我们将深入探讨Android开发的各个方面,从基础知识到高级技术。我们将通过代码示例和案例分析,帮助读者更好地理解和掌握Android开发。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的信息和技巧。让我们一起开启Android开发的旅程吧!
|
2月前
|
监控 Java Android开发
深入探索Android系统的内存管理机制
本文旨在全面解析Android系统的内存管理机制,包括其工作原理、常见问题及其解决方案。通过对Android内存模型的深入分析,本文将帮助开发者更好地理解内存分配、回收以及优化策略,从而提高应用性能和用户体验。
|
2月前
|
存储 安全 Android开发
探索Android系统的最新安全特性
在数字时代,智能手机已成为我们生活中不可或缺的一部分。随着技术的不断进步,手机操作系统的安全性也越来越受到重视。本文将深入探讨Android系统最新的安全特性,包括其设计理念、实施方式以及对用户的影响。通过分析这些安全措施如何保护用户免受恶意软件和网络攻击的威胁,我们希望为读者提供对Android安全性的全面了解。
|
3月前
|
监控 Java Android开发
深入探讨Android系统的内存管理机制
本文将深入分析Android系统的内存管理机制,包括其内存分配、回收策略以及常见的内存泄漏问题。通过对这些方面的详细讨论,读者可以更好地理解Android系统如何高效地管理内存资源,从而提高应用程序的性能和稳定性。
111 16
|
3月前
|
安全 Android开发 iOS开发
深入探讨Android与iOS系统的差异及未来发展趋势
本文旨在深入分析Android和iOS两大移动操作系统的核心技术差异、用户体验以及各自的市场表现,进一步探讨它们在未来技术革新中可能的发展方向。通过对比两者的开放性、安全性、生态系统等方面,本文揭示了两大系统在移动设备市场中的竞争态势和潜在变革。
|
3月前
|
算法 JavaScript Android开发
|
3月前
|
安全 搜索推荐 程序员
深入探索Android系统的碎片化问题及其解决方案
在移动操作系统的世界中,Android以其开放性和灵活性赢得了广泛的市场份额。然而,这种开放性也带来了一个众所周知的问题——系统碎片化。本文旨在探讨Android系统碎片化的现状、成因以及可能的解决方案,为开发者和用户提供一种全新的视角来理解这一现象。通过分析不同版本的Android系统分布、硬件多样性以及更新机制的影响,我们提出了一系列针对性的策略,旨在减少碎片化带来的影响,提升用户体验。
|
3月前
|
安全 Android开发 iOS开发
深入探索iOS与Android系统的差异性及优化策略
在当今数字化时代,移动操作系统的竞争尤为激烈,其中iOS和Android作为市场上的两大巨头,各自拥有庞大的用户基础和独特的技术特点。本文旨在通过对比分析iOS与Android的核心差异,探讨各自的优势与局限,并提出针对性的优化策略,以期为用户提供更优质的使用体验和为开发者提供有价值的参考。

热门文章

最新文章

  • 1
    apk安装包EXE,mis程序打包后报毒的正确处理方式-千万不要再人傻钱多被骗-真正的合法途径的处理方式才是正确的-apk安装包EXE,mis程序如何处理-优雅草央千澈
  • 2
    【03】完整flutter的APP打包流程-以apk设置图标-包名-签名-APP名-打包流程为例—-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈 章节内容【03】
  • 3
    ARMS 用户体验监控正式发布原生鸿蒙应用 SDK
  • 4
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 5
    app开发之安卓Android+苹果ios打包所有权限对应解释列表【长期更新】-以及默认打包自动添加权限列表和简化后的基本打包权限列表以uniapp为例-优雅草央千澈
  • 6
    【03】优雅草央千澈详解关于APP签名以及分发-上架完整流程-第三篇安卓APP上架华为商店后面的步骤-华为应用商店相对比较麻烦一些-华为商店安卓上架
  • 7
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 8
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 9
    RAG Logger:专为检索增强生成(RAG)应用设计的开源日志工具,支持查询跟踪、性能监控
  • 10
    【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈