前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何打造一款高质量的Android移动应用

如何打造一款高质量的Android移动应用

作者头像
顾翔
发布于 2019-12-12 03:03:09
发布于 2019-12-12 03:03:09
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

顾翔老师开发的bugreport2script开源了,希望大家多提建议。文件在https://github.com/xianggu625/bug2testscript,

主文件是:zentao.py 。bugreport是禅道,script是python3+selenium 3,按照规则在禅道上书写的bugreport可由zentao.py程序生成py测试脚本。

来源:http://www.ltesting.net

随着移动互联网红利的结束,移动应用开发的爆发期已经结束,现在已经进入稳定期,现在大家讲得最多是用户体验和应用质量,现在各种移动应用功能同质化很严重,所以如何打造出

随着移动互联网红利的结束,移动应用开发的爆发期已经结束,现在已经进入稳定期,现在大家讲得最多是用户体验和应用质量,现在各种移动应用功能同质化很严重,所以如何打造出一款高质量的移动应用是留住用户的的先决条件。

过去的 iOS 开发者可能做梦也想不到,现在也要开始适配屏幕和双卡双待,更不用说Android那么多如繁星的机型,厂家和操作系统,如果应用要出海,还要面对几十个国家不同的语言和环境。另一方面,我们的业务越来越复杂,如何管理上十几个上百个模块,以及还要面对React NativeFlutterKotlin,Tensorflow等各种语言跟框架堆积在一起的情况,所以做一款高质量的应用需要做很多的工作。一个应用至少要经过开发,编译CI,测试,灰度和发布几个阶段,见如下图所示:

除了在开发测试以及灰度阶段对应用进行分析外,应用一旦安装到用户手机上后对用户操作数据的分析才是最难捕获的,所以选择一款成熟稳定的移动端APM(Application Performance Management)平台是我们分析数据的坚实后盾,国内像阿里,腾讯,美团点评,饿了么,爱奇艺这些大厂都在大力投入研发应用性能管理平台。Google今年也发力Android Vitals监控,新增了耗电,权限管理等模块。

移动APM质量平台好处

1、统一管理,所有阶段的异常数据都汇总到一个平台;

2、统一三端,现在大部分应用都由Android,IOS,H5多个端组成,随着技术的发展还可能增加React Native,Flutter,Kotlin等新技术模块的监控,所以统一各个端非常重要。

移动应用的质量主要包括稳定性和性能,像崩溃,卡死,白屏这些问题对于用户而言是致命的,另一大类问题就是性能问题,安装包大小,启动,耗时,耗电,流量等范畴,具体分类如下:

由于Android碎片化和国内Android生态的乱象,手机厂商的随便定制ROM,导致国内Android应用需要对各个厂商的手机进行适配,在今年11月份举办的Android绿色联盟开发者大会上推出的应用体验标准,对应用的兼容性,稳定性,性能,功能和安全做了详细的定义,我们可以根据这组数据对我们的Android应用进行优化。

虽然移动APM质量平台可以帮助我们快速发现和定位问题,但是监控不能保证实现高质量,这里还需要程序员进行分析和优化,根据上面提到的移动应用质量指标,本文从崩溃,内存优化,卡顿定位和分析,以及应用启动等几个方面浅谈一下如何进行优化。

Android app崩溃率可以用:UV崩溃率=发生崩溃的UV / 登录UV,只要用户发生过一次崩溃就会被计算到。

1、Android崩溃分类:

1、java崩溃;

2、Native崩溃。

简单来说,Java崩溃就是在Java代码中,出现了未捕获异常,导致程序异常退出,Java崩溃相对来说比较容易捕获。在Android系统中有一个UncaughtExceptionHandler类,可以在uncaughtException回调函数中对异常进行捕获然后上报到APM质量平台。但是Native崩溃会比较麻烦,Native崩溃一般是在c/c++代码中访问了非法地址,也可能是地址对齐出现了问题,或者发生了程序主动abort,这些都会产生signal信号,导致程序异常退出。

2、Native崩溃的捕获流程:

1、编译阶段:编译c/c++的时候需要把符号信息保留下来;

2、客户端,捕获到异常的时候,尽可能地将有用的信息保存到本地,然后选择适当的时机上报服务器

3、服务端,读取客户端上报的日志文件,寻找的的符号文件,生成可读的c/c++调用栈。目前Native崩溃捕获最成熟的方案就是google的breakpad方案,在github上git clone https://github.com/google/breakpad.git ,可以在Linux或者mac平台上编译出minidump_stackwalk,dump_syms工具。通过dump_sysm工具可以生成发生崩溃so文件的符号表,通过mindump_stackwalk工具可以生成上报native崩溃日志的调用栈,结合符号表就能定位到发生崩溃的位置。

崩溃处理

1、Java崩溃类型比较明显,实际开发过程中NullPointerException空指针的情况比较多,从后台获取的数据没有判空就就进行使用等情况容易产生空指针异常,或者OutOfMemoryError,使用了大图片没有及时释放导致内存耗尽;

2、Native崩溃需要观察signal,code,fault addr等信息;

3、ANR的时候先看主线程的堆栈,是否因为锁等待导致,接着看ANR日志文件中iowait、CPU、GC、system server等信息,进一步确定是I/O问题,或者是CPU竞争问题,还是由于大量GC导致卡死。

内存优化

内存优化是崩溃优化中非常重要的一个部分,类似OOM,很多的异常退出都是由于内存问题引起的。内存引起的第一个问题就是异常,包括OOM,内存分配失败,内存整体不足引起应用被杀死;内存造成的第二个问题是卡顿,java内存不足会引起频繁地GC,除了频繁GC造成卡顿外,物理内存不足会引起系统触发low memoery kill机制。

内存优化主要从以下三个方面入手

1、设备分级;

2、bitmap优化;

3、内存泄漏。

Facebook 开发的检测手机主流配置工具device-year-class,我们可以对低端手机关闭复杂的动画效果,使用565格式图片,使用更小的缓存策略来提升应用在低端机上的体验。

根据以上的设备内存分配图,可以使用一下代码,根据不同设备使用不同的动画显示策略。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
if (year >= 2013) {
   // Do advanced animation
} else if (year > 2010) {
   // Do simple animation
} else {
   // Phone too slow, don't do any animations
}

一个空的进程也会占用10MB的内存,所以在低端机器上尽可能减少应用启动进程数,减少常驻进程数,尽量不要使用进程保活技术。一个80MB的应用很难在512MB内存的手机上流畅地运行起来,可以针对低端机用户推出轻量版本,比如facebook Lite,今日头条极速版本都是这个思路。

Bitmap内存一般占据应用总内存很大一部分,把bitmap放到native内存,虽然可以减少GC频繁调用带来的问题,提高了系统内存利用率,但是并不能解决bitmap占用内存过大的问题。Bitmap优化前提就是限制图片的调用,即限制Bitmap.createBitmap,BitmapFactory相关接口的调用,可以考虑使用统一的图片库比如Glide,Fresco等。检测大图片,例如长宽远远大于view甚至屏幕的宽高,就需要对这个大图片进行优化,重复图片监控,如果多个bitmap的像素数据完全一致,就应该删除冗余的图片。内存泄漏,应该从架构上进行设计,例如,避免长周期的对象持有短周期对象,各种监听器尽量不要引用Activity或者Fragment的context。Java内存泄漏可以借助类似LeakCanary自动化检查工具,可以做到Activity和Fragment的内存泄漏检查。

应用卡顿都和CPU时间相关,CPU时间分为两种:用户时间和系统时间。用户时间是应用程序执行代码消耗的时间;系统时间是执行内核系统调用所消耗的时间,包括I/O、锁、中断以及其他系统调用时间。通过cat /proc/stat得到整个系统CPU的使用情况,然后通过cat /proc/[pid]/stat获取某个进程的CPU使用情况,如果CPU使用率长期大于60%,标识系统处于繁忙状态,就需要进一步分析用户时间和系统时间的比例。对于普通的应用程序,系统时间一般不会超过30%,如果超过这个值,就需要进一步检查是不是I/O过多,或者是其他系统调用问题。

Andriod卡顿排查的主流工具

1、Traceview;

Traceview利用Android Runtime函数调用的event事件,将函数运行的耗时和调用关系写入trace文件,此工具本身有很大的性能开销,有时无法真是反应实际情况,比如一个函数本身耗时1秒,但是Traceview工具开启后可能变成了5秒。

2、Nanoscope;

Nanoscope是uber开源的工具,它直接修改Android虚拟机源码,在ArtMethod执行入口和执行结束位置增加埋点代码,将所有信息写入到内存,等到trace结束统一生成结果文件,它不会带来额外的性能开销,可以任意分析一个应用,但是需要自己刷ROM,目前只支持Nexus 6P。

3、systrace;

Systrace利用Linux的ftrace工具,在系统各个关键位置增加了监控埋点,可以对Graphics,Activity Manager,Dalvik VM,System server进行监控,而且性能开销非常低,但是它不支持应用程序代码耗时分析,使用起来有一定的局限性。

4、Simpleperf。

Simpleperf,可以分析Native函数耗时,它是Android5.0以后增加的性能分析工具,它可以监控dex,verify class等的耗时,在Android studio3.2可以直接在profiler中直接使用。总的来说卡顿分析的话,如果分析Native代码耗时,可以选择simpleperf;如果想分析系统调用可以选择systrace;如果想分析整个程序执行流程的耗时可以选择traceview或者插桩版本的systrace。

Android APP启动过程优化

Android APP启动过程:

1、点击桌面图标解析Manifest;

2、Application创建,闪屏Activity创建;

3、MainActivity主界面创建;

4、启动完成界面可操作。

根据整个启动流程我们可以把启动优化分为:闪屏优化,业务梳理,业务优化,线程优化,GC优化和系统调用优化。

一般应用都会先创建SplashActivity,然后在创建MainActivity,如果能把两个Activity合成一个,可以节省100ms左右的优化,通过MainActivity先展示SplashFragment,展示完毕有remove掉,同时在闪屏的2秒时间内进行首页网络数据的缓存,同时采用viewstub形式对activity_main的布局进行懒加载,防止首页过于复杂耽误view的解析时间。

由于很多项目会使用插件化,热更新等技术,而这些框架会使用各种反射,各种HOOK技术,这是非常耗时的(平均需要几百毫秒),所以应该对这些业务模块进行优化。

线程优化主要是减少CPU调度带来的波动,应该控制线程数,线程太多会互相竞争CPU资源,统一的线程池来管理,根据机器性能控制线程数。另外可以利用systrace检查是否有线程锁,因为主线程会因为有线程锁而等待,出现主线程长时间空转。

启动过程尽量减少GC次数,避免造成主线程长时间卡顿,通过systrace查看整个启动过程GC的时间,如果发现GC同步等待,那就需要使用allocation工具做进一步分析。

启动过程中避免进行大量字符串操作,特别是序列化和反序列化。一些频繁的创建对象,比如在网络库和图片库中byte数组,buffer尽量重复使用。如果一些模块确实需要频繁创建对象,可以考虑移到Native实现。通过systrace的System Service类型可以查看System Server的CPU工作情况,在app启动过程中,尽量不要做系统调用,比如PackageMangerService操作,Binder调用等等。

结语:

开一发一款高质量的应用涉及到的知识和内容比较多,本文基本上归纳总结了大致的方向,和一些实践中的应用总结,把所有的方面都做到了,非常耗费人力和时间,但是我们可以把这个作为一个终极目标,不断打磨产品,争取为用户带来更好的移动体验。

星云测试

http://www.teststars.cc

奇林软件

http://www.kylinpet.com

联合通测

http://www.quicktesting.net

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了
启动是指用户从点击 icon 到看到页面首帧的整个过程,启动优化的目标就是减少这一过程的耗时。启动性能是 APP 使用体验的门面,启动过程耗时较长很可能导致用户使用 APP 的兴趣骤减。提高启动速度是每一个 APP 在体验优化方向上必须要做的关键技术突破。
Rouse
2024/05/09
2.1K0
深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了
深入研究Android启动速度优化(下)- 不敢说100%秒开,但这样做“雀食”是快
在上一篇文章《深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了》中,梳理了应用启动的整个过程和问题,启动优化阶段与指标是什么,启动耗时方法的数据统计八种工具与分析,以及一些常见的启动时间问题。可以说是完成了启动优化工作最难的一部分。
Rouse
2024/05/10
3K0
深入研究Android启动速度优化(下)- 不敢说100%秒开,但这样做“雀食”是快
Android性能优化笔记(一)——启动优化
从上面的总结可以看出,在应用的启动过程中,冷启动是最慢最耗时的,系统以及应用本身都有大量的工作需要处理,所以,冷启动对于应用的启动速度是最具挑战以及最有必要进行优化的。
分你一些日落
2021/12/13
1.1K0
Android开发高手课NOTE
内存优化 卡顿的原因 频繁 GC 造成卡顿、物理内存不足时系统会触发 low memory killer 机制,系统负载过高是造成卡顿的俩个原因。
六月的雨
2020/03/27
9320
Android App性能优化全方面解析
为了让各位读者过好本次国庆节和中秋节,假日期间我将会推送一些非技术类文章,让你的假日不在孤单迷茫!
开发者技术前线
2020/11/23
7220
Android App性能优化全方面解析
Android 内存优化杂谈
微信终端开发团队
2017/08/14
3.7K0
Android 内存优化杂谈
Android性能优化
讲到Android开发,就不得不谈一下Android的优化,不管是平时开发中我们需要注意的一些Android对Java的一些类的优化,还是实际开发中对性能的优化,其实早在15年的google全球大会上google就Android的性能优化就给我们做了很好的介绍:点击打开链接。 接下来本文从几个方面入手讲一讲Android 的优化,主要从以下几点:布局优化,绘制优化,内存优化,响应速度优化,bitmap优化(主要结合listview),线程优化,其他常用性能优化;内存检测工具mat分析与提高。 为了达到优化的
xiangzhihong
2018/02/05
1.2K0
Android性能优化
Android性能优化(一)
一个应用App的启动速度能够影响用户的首次体验,启动速度较慢(感官上)的应用可能导致用户再次开启App的意图下降,或者卸载放弃该应用程序。
xiangzhihong
2021/01/22
2.8K0
金三银四要来了?不要慌,Android高级面试题刷一刷
这篇攻略是我从事开发工作七八年来,去面试,以及面试别人的经验总结。其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式,希望对大家之后找工作有帮助!
Android技术干货分享
2020/03/11
1.5K0
金三银四要来了?不要慌,Android高级面试题刷一刷
金九银十要来了?不要慌,这些Android BAT高级面试题刷一刷
这篇攻略是我从事开发工作七八年来,去面试,以及面试别人的经验总结。其中大部分都是大企业面试常问的面试题,可以对照这查漏补缺,当然了,这里所列的肯定不可能覆盖全部方式,希望对大家之后找工作有帮助!
Android技术干货分享
2020/09/15
1.1K0
金九银十要来了?不要慌,这些Android BAT高级面试题刷一刷
Android性能优化(一)之启动加速35%
应用的启动分为冷启动、热启动、温启动,而启动最慢、挑战最大的就是冷启动:系统和App本身都有更多的工作要从头开始! 应用在冷启动之前,要执行三个任务:
做个快乐的码农
2021/12/27
1.4K0
Android性能优化(一)之启动加速35%
爱奇艺技术分享:爱奇艺Android客户端启动速度优化实践总结
互联网领域里有个八秒定律,如果网页打开时间超过8秒,便会有超过70%的用户放弃等待,对Android APP而言,要求更加严格,如果系统无响应时间超过5秒,便会出现ANR,APP可能会被强制关闭,因此,启动时间作为一个重要的性能指标,关系着用户的第一体验。
JackJiang
2019/01/14
1.2K0
如何评价性能优化?涵盖知识面太广?
随着Android 开发越来越规范, 国内工程师的素质,以及用户对产品的要求也越来越高。
程序员小顾
2021/12/26
8970
ANR 原理与实战技巧
00 手机用用,就卡卡卡。莫名其妙的出现一堆程序无响应,欲哭无泪。这是为什么呢?因为你用的android手机。 android手机,为了让手机卡的不成样子,还想让用户知道,就发明了A
用户1263308
2018/02/02
2K0
ANR 原理与实战技巧
手机淘宝性能优化全记录
手机淘宝作为一个航母级的应用,承载了100多个业务方,部分是H5的形式接入,还有超过50个Native的业务方。为了规避安卓DEX65535的方法数限制以及各业务独立开发等需要,淘宝工程师门也是采用了多DEX(多Bundle)的开发形式,而且手淘作为一个以图片显示为重点的APP,在性能上不可避免的遇到了比较多的问题。
IT苦逼一枚
2020/02/17
1K0
手机淘宝性能优化全记录
你想要的Android性能优化系列:启动优化 !
手机桌面点击一个应用,用户希望应用能 及时响应、快速加载。启动时间过长的应用可能会令用户失望。这种糟糕的体验可能会导致用户在 Play 商店针对您的应用给出很低的评分,甚至完全弃用您的应用。
胡飞洋
2020/07/23
1.7K0
Android面试大纲(集合)
Activity是四大组件之一,它提供一个界面让用户点击和各种滑动操作,这就是Activity
陈宇明
2020/12/15
1.3K0
Android面试大纲(集合)
APP性能设计及优化专题——性能优化建议篇
应用性能设计及优化专题—性能设计概述篇中介绍了常见的卡顿场景类型、性能调优的基本原则、性能调优分析工具等,本文将围绕可能造成卡顿的应用启动流程、绘制刷新、内存管理三方面,给出一些切实可行的优化建议。
软件绿色联盟
2022/06/30
1.1K0
APP性能设计及优化专题——性能优化建议篇
深入探索 Android 内存优化(炼狱级别-上)
本篇是 Android 内存优化的进阶篇,难度可以说达到了炼狱级别,建议对内存优化不是非常熟悉的仔细看看前篇文章: Android性能优化之内存优化,其中详细分析了以下几大模块:
做个快乐的码农
2021/11/24
1.5K0
深入探索 Android 内存优化(炼狱级别-上)
抖音 Android 性能优化系列:Java 内存优化篇
在未对抖音内存进行专项治理之前我们梳理了一下整体内存指标的绝对值和相对崩溃,发现占比都很高。另外,内存相关指标在去年春节活动时又再次激增达到历史新高,所以整体来看内存问题相当严峻,必须要对其进行专项治理。抖音这边通过前期归因、工具建设以及投入一个双月的内存专项治理将整体 Java OOM 优化了百分之 80。
字节流动
2021/08/10
2.2K0
抖音 Android 性能优化系列:Java 内存优化篇
推荐阅读
相关推荐
深入研究Android启动速度优化(上)- 看完这些启动优化已经完成80%了
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验