性能优化(五)-Android启动优化2

344 阅读2分钟

1、启动优化重点怎么做?

不改变启动任务执行逻辑的前提下,启动优化本质就是解决启动任务依赖问题。用有向无环图DAG的拓扑排序,表示事件之间的驱动依赖关系,管理任务的调度。本质还是数据结构问题 image.png

2、什么时有向无环图DAG、拓扑排序?

一个有向图无法从某个顶点出发经过若干条边回到该顶点,这个图就是有向无环图DAG图。DAG常被表示为事件之间的驱动依赖关系,管理任务之间的调度。拓扑排序时对一个有向图构造拓扑序列的过程。

想要具体了解图的可以看我的这篇文章。图论 - 掘金 (juejin.cn)

4、main线程 100个线程 执行完成之后 主线程打印完成

  • 网络拓补排序+countDownLaunch
  • 任务启动管理的优化,主要是 合理使用CPU资源,该用线程用线程该并发的并发。 -任务排序问题。拓扑排序 -线程同步问题。countDownlaunch

5、android 启动框架

image.png

上述方式还是太麻烦了,contentProvide直接传入最后一个执行的任务,然后自动给你配置任务树。适合所有任务都有,前后依赖关系,如果有没有到最后一个,则也要写进去。

<provider
    android:name="com,enjoy.appstartup.startup.provider.StartupProvider"
    android:authorities="$(applicationId].android startup'android:exported="false">
    <meta-data android:name="com.enjoy.appstartup.tasks.Task5"android:value="android.startup" />
</provider>

为啥不需要在application中初始化?因为ContentProvider#onCreate在Application#onCreate之前

image.png

6、拓扑优化

  • 同步任务阻塞异步任务怎么办? image.png

  • 因为是for循环发任务的,for循环 在主线程中。如果同步线程2放在最开头,那么同步线程2执行完之后,再继续for循环。那么必定影响效率,所以把同步线程2放在尾部即可,如果在异步都分发之后,在执行分发同步线程2,那么则不影响异步线程的分发,提高CPU效率。 image.png

将主线程和子线程分开

image.png

image.png 分别对异步和同步任务排序。 看懂了,牛逼

想清楚两个问题 分发-》执行

7、Android startup框架

Android Startup提供一种在应用启动时能够更加简单、高效的方式来初始化组件。开发人员可以使用Android Startup来简化启动序列,并显式地设置初始化顺序与组件之间的依赖关系。 与此同时,Android Startup支持同步与异步等待、手动控制依赖执行时机,并通过有向无环图拓扑排序的方式来保证内部依赖组件的初始化顺序。

github.com/idisfkj/and…

image.png