Android中App启动速度优化

在项目的持续迭代中,总是会引入很多第三方的SDK,初始化时,都建议在Application的onCreate方法中做初始化,这就导致了App启动时,因初始化消耗大量的时间,给用户带来很不优化的体验。
针对这一问题,进行逐步攻破解决

一,统计应用的启动时间

  1. 通过Adb命令启动应用获取App启动的耗时:adb shell am start -W com.xx.xx/.MainActivity
    运行adb命令后会在dos窗口输入应用启动的大概耗时时间
    ThisTime :最后一个Activity启动时间
    TotalTime:一系列Activity启动时间
    WaitTime :总启动时间,包含在冷启动时,需要加载App信息到内存的时间
  2. 使用Debug.startMethodTracing()/Debug.stopMethodTracing()统计方法耗时
    例:
public void onCreate(){
     super.onCreate();
     File file = new File(Environment.getExternalStorageDirectory(),“app.trace”);
     Debug.startMethodTracing(file.getAbsolutePath());
    //中间SDK初始化
   init();
   test();
   Debug.stopMethodTracing()}

添加Debug.startMethodTracing()方法后启动App,会生成一个app.trace的文件,使用:adb pull /storage/emulated/0/app.trace命令把文件pull到电脑上,拖动到AndroidStudio中,即可预览,查看onCreate中所有方法的耗时。

  1. Trace.beginSection(“Launcher”)/Trace.endSection()方法
    例:
public void onCreate(){
     super.onCreate();
   Trace.beginSection("Launcher");
    //中间SDK初始化
   init();
   test();
   Trace.endSection()}

使用方法和Debug.startMethodTracing()类似,也会生成一个文件,放到AndroidStudio中查看应用方法的耗时
4)最普通的统计方法,声明全局变量,在onCreate()放启动时赋值,然后在每个方法之前和之后打印当前时间,计算时间差,统计相关SDK初始化的耗时

二,初始化耗时优化的方法

1)延迟初始化

在初始化时,并不是所有的第三方库都需要立即进行初始化(比如,网络请求库,不会立即使用的三方UI库,层级很深的引用库),这些都是需要耗费启动时间的,针对这些库,我们可以选择性的进行延迟初始化,通过在Applicaton中添加
registerActivityLifecycleCallbacks() 的注册监听获取当前的Activity对象,判断当Activity进入启屏页时,再调用需要延迟初始化的SDK进行初始化,这样就可以达到一定的优化(市面上大部分的App启屏页都会停留2~3秒的时间)利用这段时间,可以初始化很多的第三方库。
注:延迟初始化,仅初始化立即需要的对象,不要创建全局静态对象,而是移动到单例模式,其中应用尽在第一次访问对象时初始化它们。

2)异步初始化

所谓异步初始化,就是在Appliction中开启子线程,把一些不依赖主线程的初始化工作放到子线程中进行初始化,减少主线程的工作,从而达到优化启动速度的效果。
注:
异步线程中使用的api不能创建Handler
不能有UI操作
对异步要求不高
在使用异步初始化时,需要确定SDK能不能异步优化,执行的方法是否有先后顺序

3)空闲时初始化

通过:Looper.myQueue().addIdleHandler监控当前内存是否空闲进行初始化

Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
        @Override
        public boolean queueIdle() {
            SDKConfig.INSTANCE.initSdk();
            return false;
        }
    });
4)避免重复的初始化

随着业务的不断增多,很多应用都使用了多进程的方式开辟更多的内存空间来提升用户体验,在Android中当开启多个进程时Application的onCreate方法就会走多次,在做SDK初始化时,如果不做处理,就会导致SDK被初始化多次,导致资源的浪费和时间的占用,为了避免这个问题,需要在onCreate方法中,获取当前进程名,进行针对性处理

5)布局加载速度优化

App启动时,看到的第一个界面,也是优化点之一,如果布局加载的时间很长也会影响到App启动的速度,Android中所有的布局大都是xml的形式实现,在加载到屏幕上时根据布局的复杂程度需要耗费很多的时间,针对这一点,可以使用google官方提供的AnsyncLayoutInflater进行异步优化加载,提升速度或者使用使用阅文集团的开源库:“X2C”进行布局加载的优化,从而进一步提升App的启动速度。
做完如上优化后,App的启动速度会得到质的提升,如需更进一步优化:

  • 去除不在使用的库,优化过时的库
  • 仅仅提取使用的代码
  • 选用更小的外部库
    如上优化仅个人理解,如有错误或其他方法,请补充优化。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值