想要让自己的APP软件能够被大家所喜爱并长期使用的话,那么这款APP的性能必须够硬,最起码是不能够出现启动时间长、页面卡顿或者是闪退的情况,而想要解决这些问题的途径就是不断地优化APP的性能。接下来,友盟+就来和大家分享几个别样的android启动优化方法。

  一、首页合并

  通常我们启动APP的时候分为闪屏和首页两个页面,我们将闪屏和首页合并成一个,通过fragment来操作真实页面,广告设计成一个dialog fragment浮在首页就行。首页合并后发现几个问题:首页管理、唤端启动问题。

  首页无法使用singletask,singletask的问题,我们通过手动维护一个activity栈去管理,保证一个首页。

  唤端启动,第三方app唤端没有加newtask标签,导致页面启动在第三方app内,这个暂时没有遇到很好的解决方式,还是在推动比较大的第三方平台去解决。

  二、渲染消息优先级队列

  我们数据请求后,通过handler将消息发送到主线程,handler消息队列内可能比较繁忙,我们思考的是将数据回调和图片回调的消息发送到消息队列前面。

  MessageQueue其实提供了一个方法sendMessageFont的方式。

  三、dex2oat

  Android ART虚拟机后,可以将dex文件预先的翻译处理成机器码直接运行,在Android 5 - 7版本,dex处理是在app安装的时候处理的,但是由于dex2oat性能影响较大,安装的时候将耗时过长,Android 7后改为安装的时候不做翻译,运行时还是解释执行,运行时的时候记录运行的函数等信息,在手机闲置的情况下去把这些热方法做dex2oat,下次运行直接运行机器码。

  但是系统判断闲置的条件比较苛刻,导致大部分情况下app没有被dex2oat,另外互联网app快速发展,发版速度较快,所以dex2oat的利用率低,通过app自己手动调用系统dex2oat达到快速将app的dex转化,提高代码执行效率。

  四、Redex

  Linux 文件系统从磁盘读文件的时候,会以 block 为单位去磁盘读取,一般 block 大小是 4KB。也就是说一次磁盘读写大小至少是 4KB,然后会把 4KB 数据放到页缓存 Page Cache 中。

  如果下次读取文件数据已经在页缓存中,那就不会发生真实的磁盘 I/O,而是直接从页缓存中读取,大大提升了读的速度。所以上面的例子,无论我们读取了多少次,事实上它只会发生一次磁盘 I/O,其他的数据都会在页缓存中得到。

  Dex 文件用到的类和安装包 APK 里面各种资源文件一般都比较小,但是读取非常频繁。所以我们可以利用系统的这个机制将它们按照读取顺序重新排列,以此减少真实的磁盘 I/O 次数。

  五、类重排

  启动过程类加载顺序可以通过插装静态代码块获取。然后通过 ReDex 的Interdex调整类在 Dex 中的排列顺序,最后可以利用 010 Editor 查看修改后的效果。

  从多方拿到的数据来看,收益在0-6%,整体不是很明显,而且需要把redex工程化、考虑和proguard的兼容等问题。

  六、 黑科技

  微信Hardcoder

  构建了App与系统(ROM)之间可靠的通信框架,让系统知道App的需求,可以让app获取更多的系统资源。

  原理

  1、其实质是让App跨过Framework直接跟厂商ROM通信。

  2、分为Client端和Server端,Server端由厂商系统侧自行实现。

  3、它们直接采用 LocalSocket 方式,Hardcoder是 Native 实现的,使用了Linux的Socket接口实现了一套自己的LocalSocket。

  七、GC抑制

  ART虚拟机,采用并行回收的算法,GC回收对性能的影响大大降低。但是通过systrace分析,在启动过程中,GC线程也存在抢占系统资源的情况。

  Google 也注意到了后台 GC 对于应用启动速度的影响,并尝试了在 Android 中对这一场景进行优化。

  这个改动的逻辑是:应用启动时 Zygote Fork 出新的进程之后,在2秒内暂时提高 Background GC 任务触发的阈值。这样 Background GC 将会更难被触发。

对于上述这几种android启动优化的方法大家可能并不常见,但是这几种优化方法的效果还是很显著的,所以建议各位优化专员们可以试着用它们来优化一下自己的APP。  

 U-APM应用性能监控平台,通过轻量级的集成接入即可拥有实时、可靠、全面的应用崩溃、ANR、自定义异常等捕获能力, 及卡顿、启动分析、内存分析、网络分析等性能监测能力,支持多场景、多通道智能告警监测,帮助 开发者高效还原异常、卡顿用户的访问路径和业务现场,缩短故障排查时间。提供云真机测试能力, 助力开发者从研发测试质量验收到线上问题复现排查,保障应用品质,提升测试效率。在云真机测试 期间自动采集崩溃信息,提供详尽的崩溃报告协助筛查,真正实现监控测试全流程深度打通。