DSAppTeam / Anchors

:white_check_mark: Anchors 是一个基于图结构,支持同异步依赖任务初始化 Android 启动框架。其锚点提供 "勾住" 依赖的功能,能灵活解决初始化过程中复杂的同步问题。参考 alpha 并改进其部分细节, 更贴合 Android 启动的场景, 同时支持优化依赖初始化流程, 自动选择较优的路径进行初始化。
Apache License 2.0
820 stars 79 forks source link

大家还希望 Anchor 新增哪些功能?欢迎大家盖楼。 #9

Open YummyLau opened 4 years ago

YummyLau commented 4 years ago

任务暂停机制支持 v1.0.3 开发完毕

lispking commented 4 years ago

任务暂停机制支持 v1.0.3 开发完毕

lgtm

YummyLau commented 4 years ago

任务暂停机制支持 v1.0.3 开发完毕

lgtm

(⊙_⊙)? 啥

lispking commented 4 years ago

目前场景是图上所有路径都会执行,能否支持这么一种场景,只支持图中某一条路径,因为实际场景中,比如游戏等级,如果你选了不同难度级别,中间碰到的难关是不一样的,选择高难度看到的怪物是不一样,中级难度掉落物品也会不一样,低级难度获取经验更少,甚至中间不同的任务执行也会不一样,如果该场景支持,该库的普及度会更广。

galaxybruce commented 4 years ago

@YummyLau 首先感谢你的开源了这个项目,我对比了几个启动框架,感觉Anchors流程蛮适合我们的,然后我fork了一份,同时增加了多进程支持和注解。 https://github.com/galaxybruce/Anchors

YummyLau commented 4 years ago

@galaxybruce 感谢认可,我fork下看下

YummyLau commented 4 years ago

@YummyLau 首先感谢你的开源了这个项目,我对比了几个启动框架,感觉Anchors流程蛮适合我们的,然后我fork了一份,同时增加了多进程支持和注解。 https://github.com/galaxybruce/Anchors

昨天clone了代码仔细看了一番,说一下我的理解。新增了注解解析器用于新增依赖及Task支持进程功能。在start入口新增了工厂及多个task能力,但在内部再一次聚合。能解决业务的代码才是适合自己的代码,这里只讨论下两个功能对框架的影响。

  1. 注解申明依赖关系。由于单一task可能落在多条依赖链上,如果申明依赖关系实际上会限制了单一task的场景灵活性,这也是我一直权衡的原因,希望task的灵活使用时在使用者手上。但是如果task的依赖链不复杂且不存在交叉,注解是可以的。

  2. 关于多进程的初始化,目前我们线上的项目有严格的进程初始化管理,再根绝统一task可能出现在不同的进程且不同进程有着复杂的初始化链,所以并没有开放task的初始化绑定进程,同时,倘若业务新增了一个进程同时需要引入某个task的初始化,那么修改业务进程的初始化链的合理性会大于修改task的初始化代码。一个task的初始化代码建议只实现一个task的核心初始化功能即可。

针对多进程及初始化链的配置,一直在寻求合适的解决方案,欢迎随时pr或者探讨。

galaxybruce commented 4 years ago

很感谢你抽出时间对我的修改做了点评。我比较赞同你的看法。 关于第一条看法,其实注解是支持多依赖的,而且是下收集所有的task,最后再处理依赖关系。应该可以解决单一task场景灵活性的问题。

  1. 所有的task id是task的class.simpleName
  2. 注解支持多依赖
  3. TaskFactory构造函数中调用loadTasks()函数,收集所有的task
  4. AnchorsManager.start方法中处理依赖关系 [image: image.png]

[image: image.png] [image: image.png]

不知道是否正确理解你的意图。

YummyLau notifications@github.com 于2020年1月20日周一 上午10:14写道:

@YummyLau https://github.com/YummyLau 首先感谢你的开源了这个项目,我对比了几个启动框架,感觉Anchors流程蛮适合我们的,然后我fork了一份,同时增加了多进程支持和注解。 https://github.com/galaxybruce/Anchors

昨天clone了代码仔细看了一番,说一下我的理解。新增了注解解析器用于新增依赖及Task支持进程功能。在start入口新增了工厂及多个task能力,但在内部再一次聚合。能解决业务的代码才是适合自己的代码,这里只讨论下两个功能对框架的影响。

1.

注解申明依赖关系。由于单一task可能落在多条依赖链上,如果申明依赖关系实际上会限制了单一task的场景灵活性,这也是我一直权衡的原因,希望task的灵活使用时在使用者手上。但是如果task的依赖链不复杂且不存在交叉,注解是可以的。 2.

关于多进程的初始化,目前我们线上的项目有严格的进程初始化管理,再根绝统一task可能出现在不同的进程且不同进程有着复杂的初始化链,所以并没有开放task的初始化绑定进程,同时,倘若业务新增了一个进程同时需要引入某个task的初始化,那么修改业务进程的初始化链的合理性会大于修改task的初始化代码。一个task的初始化代码建议只实现一个task的核心初始化功能即可。

针对多进程及初始化链的配置,一直在寻求合适的解决方案,欢迎随时pr或者探讨。

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub https://github.com/YummyLau/Anchors/issues/9?email_source=notifications&email_token=AASZHXUOOS3SGBSBAVNEXULQ6UCGVA5CNFSM4JXKQD6KYY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LNMVXHJKTDN5WW2ZLOORPWSZGOEJLEKOI#issuecomment-576079161, or unsubscribe https://github.com/notifications/unsubscribe-auth/AASZHXR4QEGNEU6VGI5MF4LQ6UCGVANCNFSM4JXKQD6A .

--


姓名:张小龙 手机:13739188962 QQ: 282347554 MSN: zxl-ong@hotmail.com Email:brucezhanggood@gmail.com


andyhaha commented 4 years ago

有一个小小的疑问 AnchorsManager#start方法,最后一段有一个while的循环,这里有个sleep10ms的方法,这里为什么是10ms,可以换成1ms么,不用sleep会有什么问题吗

YummyLau commented 4 years ago

@andyhaha sleep为的是让主线程短暂挂起。改成1ms理论上是可以的,但是没有必要,1ms后重新唤起主线程太频繁,增加损耗。如果不 sleep ,由于外层 onCreate 是一个阻塞行为,则会导致 ANR。

Alexxiaopang commented 4 years ago

现在的任务都是基于Runnable去实现的,如果基于协程去写,是否能节省更多的线程开支?通过async await等达到异步和同步还有锚点

YummyLau commented 4 years ago

@Alexxiaopang 本质上是一样的。引入协程只会让库的包体变得更大或者限制依赖方引入协程库,所以是不建议如此的。

NickHu150 commented 4 years ago

如果有一些必须在Splash之前要初始化完成的类是要放到anchors这个api里面去执行吧,后面放在图里面的同步task都是丢给Handler不能保证在UI渲染之前执行完毕,这个理解对么

YummyLau commented 4 years ago

@NickHu150 嗯是的

NickHu150 commented 4 years ago

@YummyLau 我们现在有这样的需求,默认启动的时候走一套初始化流程,判断用户是否同意了隐私弹窗,如果是就继续走,否则弹出隐私弹窗让用户点击之后通过回调再初始化一部分的三方库,这种需求有API支持么

YummyLau commented 4 years ago

@NickHu150 用户同意隐私弹窗,是你自己的界面吗? 你可以参考lock功能设计就好了。

NickHu150 commented 4 years ago

@YummyLau 用户同意了隐私弹窗,继续初始化某一个task,lock功能可以在回调完成之后释放某一个task的锁才让某一个task执行是么,如果一直不释放就一直不会执行对么

YummyLau commented 4 years ago

@NickHu150 lock可以释放,也可以选择中断

NickHu150 commented 4 years ago

@YummyLau 我们现在保证稳定性做逐步拆解一开始只是拆成两个Task,每个版本迭代抽出一个task,目前我们这样写,貌似creator的creattask方法没有被执行,麻烦看下是不是使用姿势的问题

 factory = new AnchorTaskFactory(instance);
    Project project = new Project.Builder(TasksName.PROJECT_ONE,factory)
          .build();
    AnchorsManager.getInstance().debuggable(DuConfig.DEBUG).addAnchors(
            TasksName.TASK_SYNC,TasksName.TASK_INIT
    ).start(project);
YummyLau commented 4 years ago

@NickHu150 这个issue不做api使用讨论了,不然后续太长了。加一下微信我 Ming_Lyan 拉你进讨论组一下,到那边讨论。

openproject commented 3 years ago

执行时机能否区分 attachBaseContext 和 onCreate?

YummyLau commented 3 years ago

@openproject 框架内部对这两个实际没有区分。强调的是Anchor同步阻塞是方法级别的,如果在attachBaseContext启动链就是以attachBaseContext方法作为背景,有anchors就是阻塞该方法;同理application#onCreate也如此。甚至在任何主线程方法都如此。

Toyssabc commented 3 years ago

我需要一个直播平台。它将包含赌场

Fredlxy commented 3 years ago

可以增加task执行时机的功能,例如task可能在attachBaseContext 、onCreate、firstActivityResume、idleHandler中执行

shenxiaolin commented 2 years ago

kotlin版本,懵逼中,再出个java版本;皆大欢喜,还有https://github.com/galaxybruce/Anchors 提到的注解等是否考虑加到这个框架中来;

MichaelJokAr commented 2 years ago

有没有类似这样的对比图啊,跟alpha和appStartUp的 image