如何打造安卓高质量的应用

如何打造高质量的应用

技术更新不断迭代,生态环境不断完善,功能实现逐渐变得简单,进而大家开始追求用户体验和应用质量。除了内存优化、弱网络优化,想做一款高质量的应用还远远不止这些。本文着重介绍了编译有哪些阶段,优化分哪些步骤,但具体到每一步,又可以细化分出很多知识点,这就需要我们平常大量的联系和积累。

一方面,我们面对的环境越来越复杂。 Android 那多如繁星的机型、厂家和系统。如果你的应用也要出海,那么还要面对几十个国家不同的语言、环境。另一方面,我们的代码跟业务也越来越复杂了。先不说大量“年久失修”的历史代码,业务越来越复杂,如何管理好几十上百个模块?还要面对 React Native、Flutter、Kotlin等各种语言跟框架堆积在一起的情况,再加上复杂的环境和庞大的系统,想想做一款高质量的应用真的不容易。

在我看来,一个应用至少会经过开发、编译 CI、测试、灰度和发布这几个阶段。每个阶段需要关注什么问题呢?

开发阶段。我们需要熟练掌握各种开发工具,懂其实现原理,并且能移植到线上使用。

编译 CI 阶段。如何防止代码不断地恶化?怎样进一步优化性能?如何利用好静态分析工具?这部分可能需要一些编译原理的知识,你会发现移动开发也有很多值得深入研究的东西。

测试阶段。我们常说敏捷开发,用户是最好的测试。遇到问题在线上反复试错,对自己、对用户都十分痛苦。我们希望可以做到测试“左移”,尽可能早地发现问题。但是很多时候我们不是不想测试,而是发现测不出什么问题。那么怎样提升实验室发现问题的能力呢?如何尽可能地模拟用户的操作路径?做好测试并不容易,自动化测试结合 AI 或许可以帮助我们解决一些痛点。

灰度和发布阶段。动态部署流行起来之后,多开发变得松懈起来。有问题发补丁,一个不行就两个,两个不行就十个。怎样去保证产品质量?很多线上问题概率很低,基本很难复现,比如对于一个印度的用户,我们希望有一个远程的听诊器,而不需要把用户拉到我们的手术台上。

崩溃优化:Android 崩溃分为 Java 崩溃和 Native 崩溃。简单来说,Java 崩溃就是在 Java 代码中,出现了未捕获异常,导致程序异常退出。那 Native 崩溃又是怎么产生的呢?一般都是因为在 Native 代码中访问非法地址,也可能是地址对齐出现了问题,或者发生了程序主动 abort,这些都会产生相应的 signal 信号,导致程序异常退出。

内存优化:内存造成的第一个问题是异常。在前面的崩溃分析我提到过“异常率”,异常包括 OOM、内存分配失败这些崩溃,也包括因为整体内存不足导致应用被杀死、设备重启等问题。不知道你平时是否在工作中注意过,如果我们把用户设备的内存分成 2GB 以下和 2GB 以上两部分,你可以试试分别计算他们的异常率或者崩溃率,看看差距会有多大。内存造成的第二个问题是卡顿。Java 内存不足会导致频繁 GC,这个问题在 Dalvik 虚拟机会更加明显。而 ART 虚拟机在内存管理跟回收策略上都做大量优化,内存分配和 GC 效率相比提升了 5~10 倍。如果想具体测试 GC 的性能,例如暂停挂起时间、总耗时、GC 吞吐量,我们可以通过发送 SIGQUIT 信号获得 ANR 日志。要进行内存优化,通常需要从会从设备分级、Bitmap 优化和内存泄漏这三个方面入手。

卡顿优化:造成卡顿的原因可能有千百种,不过最终都会反映到 CPU 时间上。我们可以把 CPU 时间分为两种:用户时间和系统时间。用户时间就是执行用户态应用程序代码所消耗的时间;系统时间就是执行内核态系统调用所消耗的时间,包括 I/O、锁、中断以及其他系统调用的时间。

启动优化:用户从桌面点击图标开始,会经过 4 个关键阶段T1 预览窗口显示T2 闪屏显示T3 主页显示T4 界面可操作用户启动过程会遇到的 3 个问题点击图标很久都不响应首页显示太慢首页显示后无法操作具体的优化方式,我把它们分为闪屏优化、业务梳理、业务优化、线程优化、GC 优化和系统调用优化。

I/O优化:整个文件 I/O 操作由应用程序、文件系统和磁盘共同完成。首先应用程序将 I/O 命令发送给文件系统,然后文件系统会在合适的时机把 I/O 操作发给磁盘。

存储优化:Android 分区Android 系统可以通过 /proc/partitions 或者 df 命令来查看的各个分区情况,分区简单来说就是将设备中的存储划分为一些互不重叠的部分,每个部分都可以单独格式化,用作不同的目的。除了数据的分区隔离,存储安全也是 Android 系统非常重要的一部分,存储安全首先考虑的是权限控制。其次是数据加密。

网络优化:对网络传输速度有决定性影响的主要有以下两个方面:延迟数据从信息源发送到目的地所需的时间。带宽逻辑或物理通信路径最大的吞吐量。对于网络来说,我们关心的是下面这些指标吞吐量网络接口接收和传输的每秒字节数。延迟系统调用发送 / 接收延时、连接延迟、首包延迟、网络往返时间等。连接数每秒的连接数。错误:丢包计数、超时等。

耗电优化:第一个方向是优化应用的后台耗电第二个方向是符合系统的规则,让系统认为你耗电是正常的。耗电优化的难点缺乏现场,无法复现信息不全,难以定位无法评估结果。

UI优化:应该包含两个方面:一个是效率的提升,我们可以非常高效地把 UI 的设计图转化成应用界面,并且保证 UI 界面在不同尺寸和分辨率的手机上都是一致的;另一个是性能的提升,在正确实现复杂、炫酷的 UI 设计的同时,需要保证用户有流畅的体验。

包体积的优化:包体积对应用的影响下载转化率推广成本应用市场。包体积与应用性能安装时间运行内存ROM 空间业务梳理开发模式升级优化的几个方面,去掉 Debug 信息或者去掉行号混淆优化、dex(Android系统的可执行文件)分包、dex压缩、Native LibraryLibrary 压缩合并和剪裁。

总得来说,要做好崩溃优化、内存优化、卡顿优化、启动优化、I/O优化、存储优化、网络优化、耗电优化、UI优化、包体积优化。在利用好第三方工具分析APP性能的时候,会用并能发现问题这是第一步,进而发现工具不足之处这是第二步。并要不断思索如何提升个人研发效能,不断复盘,不断回顾和思考。

以上内容借鉴,张绍文《Android开发高手课》

  • 13
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值