Giter Site home page Giter Site logo

xiaojinzi123 / component Goto Github PK

View Code? Open in Web Editor NEW
2.8K 40.0 204.0 41.4 MB

A powerful componentized framework.一个强大、100% 兼容、支持 AndroidX、支持 Kotlin并且灵活的组件化框架

Home Page: https://github.com/xiaojinzi123/Component/wiki/Component-%E5%92%8C-ARouter-%E6%AF%94%E8%BE%83

License: Apache License 2.0

Java 85.14% Kotlin 14.35% HTML 0.51%
component android android-architecture router interceptor componentization service api framework rxjava

component's Introduction

Component 一定以最快的速度解决您的 issue, 提供解决方案.

KComponent 纯 Kotlin 版本已经发布很久啦, 欢迎大家使用 !!!!!!!!!!!!!

可以说到目前为止, 基于 URI 方面的所有路由框架中(ARouterWMRouterActivityRouter ...) Component 是最强大和完善的组件化框架.

选择一个更好、更全面的、更稳定、更有发展前景的框架更是你们技术团队或者技术负责人要做的事情!

Component VS ARouter

点击查看 Component 解决了哪些开发中的痛点

Component

一个功能强大的组件化框架,极度注重用户体验,带给你使用上不一样的享受.欢迎大家使用,在使用的过程中发现任何问题,欢迎下方的 QQ群 里问或者提 issue 给我

1. Demo体验

扫码或者点击图片即可下载

2. Hello World 文档

最简单的 Hello World 文档

3. 完整文档

了解更多请看 wiki 更多功能等你来发现 **有关的文章 到底什么是组件化 **

4. Component 功能介绍

组件化方案真的有很多,那么这个组件化方案优秀在哪里?相比于 ARouterWMRouterActivityRouterCCDDComponent 等开源的组件化框架, 有哪些一样或者更加优秀的点

  • 支持多 Module

  • 支持 Google App Bundle 架构

  • 支持 Flutter, H5 等混合项目

  • 支持 androidx, 几乎没有其他组件化框架支持 androidx

  • 整个设计贴近原生,对原生的代码入侵极少,尽最大的可能保留原生的代码

  • 支持依赖注入、支持目标界面的路由参数

  • 跨模块调用

  • 支持业务组件生命周期(被加载和被卸载)

  • 配套的 Idea Plugin 方便快速浏览,持续会更新此 插件

  • 完美支持 RxJava2(使用rx库)

  • 服务发现(跨模块调用)和路由分开设计 - 其实这两块本来就是两个方面,我不清楚为什么很多方案中都柔和在一块

  • 服务发现装饰增强

  • 业务模块单独运行

  • 路由跳转功能

    • 支持生成文档

    • 支持获取目标的 ProxyIntent

    • 支持标准 URI 的使用

    • 无缝对接 H5

      • H5 只需利用 URL 即可任意路由到任何界面(只需下面一段统一的跳转. 完全不需要关心目标界面是否需要登陆、定位、权限等.)

        @JavascriptInterface
        public void openUrl(final String url) {
            Router.with(this).url(url).forward();
        }
        
      • H5 发起路由不需要关心目标界面需要做的先决条件(框架的页面拦截器已经帮您做完)

    • 外部链接跳转

    • 支持原生的跳转动画

    • 支持跳转 Fragment(也就是跨组件获取Fragment)

    • 支持单 Activity 多 Fragment 架构

    • 路由拦截器执行线程设计是主线程, 整体是异步的(这点很多人不理解, 没有关系. 先用起来之后在慢慢理解)

      • 在路由拦截器的执行线程的设计上,考虑到用户平时书写的 90% 代码都是在主线程的,
        所以路由拦截器的执行线程也设计为主线程执行,可以让您放心的操作 UI、弹框等操作.
        同时提供 Callback 机制可以在拦截器中做任何耗时的任务
        这点绝对是压倒性的优势,不仅整体是 异步 的,而且拦截器中能像平常一样写实现的代码
    • 路由的取消,基本上没有路由框架支持路由的取消,这也是一个很大的优势!

      • 手动用代码取消某次路由
      • 路由自动取消, 当发起路由的 Fragment 或者 Activity 销毁的时候会取消
    • 路由拦截器,足矣满足所有业务情况(具体看 拦截器wiki)

      • 全局拦截器(针对全部路由)
      • 局部路由拦截器
        • 页面拦截器(针对所有跳转到某一个界面的路由)
        • 拦截器别名,支持跨模块使用(可以让每一个拦截器都放在自个的模块)
    • 跳转

      • 持标准 URI
      • 支持自定义 Intent, 你可以给任意一个 Intent 标记路由, 这个功能很强大!
      • 支持类似 Retrofit 接口编程式跳转
      • Idea Plugin 强势支持跳转代码和目标界面的来回导航,也支持拦截器的代码使用和声明处的来回导航
    • 0 配置拿到目标界面返回的 ActivityResult, 很多框架不支持或者需要入侵 BaseActivity. 绝对的优势

      • 和系统的行为一样,当 ContextApplication 或者 Service 的 Context 或者 ContentProvider 的 Context 的时候, 不支持获取ActivityResult, 如果真的有需要, 你可以使用栈顶的 Activity 来充当 Context
      • 除第一点说的几个 Context, 其他的情况都是支持的,包括 Dialog 中获取到的 Context.
      • 如果你想单独使用这个功能, 也可以单独依赖使用, 链接是这里
  • 注解驱动器 不支持增量更新, 暂时不知道怎么去做

5. 配套的 Idea Plugin

Android Studio 中搜索插件名称:RouterGo, 即可下载对应的插件

RouterGo 源码地址:帮助你快速导航到目标界面或者目标拦截器,你值得拥有!

6. Component 项目结构(Demo + 库源码)

  • demo 示例代码
    • app --> 壳工程
    • Module1 --> Java 业务模块
    • Module1run --> Module1 业务模块单独运行的 Application 应用
    • Module2 --> Kotlin 业务模块
    • ModuleHelp --> Help 业务模块, 一些有关通用的或者系统相关的放这里
    • ModuleUser --> User 业务模块
    • ModuleBase --> 各个业务模块的基础模块, 上述的没一个业务模块都需要依赖
  • 实现库源码
    • ComponentApi --> Api
    • ComponentCompiler --> 注解驱动器库
    • ComponentImpl --> 实现库
    • ComponentRxImpl --> 实现库 RxJava 的扩展
    • ComponentPlugin --> 配套的 Gradle, 功能有两个
      • 优化初始化的方式, 优化反射加载模块为正常的 new 对象的方式, 利用字节码修改技术
      • 生成路由文档

7. 扫码进群

8. 如果你觉得项目不错, 就请我喝杯咖啡吧! 一块钱也是爱!

9. License

component's People

Contributors

keepactive avatar linxueyuanstdio avatar lotosbin avatar passin95 avatar xiaojinzi123 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

component's Issues

关于flutter的支持

您好,我看到介绍说componet是支持flutter混合跳转的,但是没找到具体的文档,这块能详细介绍下吗?

请问Component支持Kotlin吗?

目前用的是ARouter,能很好兼容AndroidX和Kotlin。但是看了下Component有一些更吸引人的功能,想考虑试一下,请问支持Kotlin吗?

Annotation processors must be explicitly declared now.

Annotation processors must be explicitly declared now. The following dependencies on the compile classpath are found to contain annotation processor. Please add them to the annotationProcessor configuration.

  • jetified-component-compiler-v1.8.2.2-androidx.jar (com.github.xiaojinzi123.Component:component-compiler:v1.8.2.2-androidx)
    Alternatively, set android.defaultConfig.javaCompileOptions.annotationProcessorOptions.includeCompileClasspath = true to continue with previous behavior. Note that this option is deprecated and will be removed in the future.
    See https://developer.android.com/r/tools/annotation-processor-error-message.html for more details.

按照wiki的教程依赖,每个业务组件都已经添加了注解处理器,kpt增量也关了,这个是什么问题呢
环境Android Sutdio3.6,kotlin,Androidx

requestCode 变化的问题?

在一个界面中, 我只要用一次框架提供的获取 ActivityResult 的跳转之后,
后续我使用 如下代码跳转之后, 在 onActivityResult回调中的 requestCode 都是不对的, 不是下面我传递的那个值!!!

Router
      .with(this)
      .host("user")
      .path("address")
      .requestCode(100)
      .forward();

不用获取 ActivityResult 的跳转就没有问题

跳转 Fragment 的问题

ARouter 有路由 Fragment 的功能, 其实说白了就是获取一个 Fragment.

我看了你的源代码, 我发现你这里是完全把获取 Fragment 当成是服务发现的一部分, 我个人觉得从原则上看确实是属于服务发现的一部分, 但是获取 Fragment 是一个比较常用的功能. 是否能考虑像 ARouter 一样做一个 路由Fragment 的功能. 方便获取 Fragment. 我个人感觉这样子会比较方便. 毕竟很多时候, 一个 Activity 可能对应着很多个 Fragment.

路由拦截参数验证

val rawContext = chain.request().rawOrTopActivity
if (rawContext == null) {
chain.callback().onError(Exception("context is null"))
return
}else{
val request = chain.request()
if (request.uri.getQueryParameter("typeId")!=null){
chain.proceed(chain.request())
}
}

发现这里 没有我上面传递的typeId 这个字段 怎么在拦截器里对传递的参数进行验证呢 大佬

Fragment类上使用注解时传值问题

目前需要使用有参方法 在方法上使用注解

 @FragmentAnno("search_record")
 public static SearchRecordFragment newInstance(@NonNull Bundle args) {
            SearchRecordFragment fragment = new SearchRecordFragment();
            fragment.setArguments(args);
            return fragment;
 }

Bug 奖励机制

为了让 Component 更好, 我设计了这个奖励机制. 凡是满足以下的条件的 bug 都会奖励 25 元的奶茶钱. 钱虽然不多, 重在感谢

Bug 满足条件

  • 必须是能复现的
  • 必须是 Component 项目中的bug, 不能是其他第三方库的, Idea Plugin 不算在其中. 因为插件属于帮助性的工具, 出问题也不影响你们开发
  • 必须是没有其他人反馈过的 Bug
  • 必须是我认可的:首先如果真的是 bug, 我不会为了这点钱死皮赖脸不承认. 因为之前看下来, 很多 bug 都是用户自己配置有问题或者代码写的不对引起的, 并不是框架的问题. 所以这个是需要我来判断的. 当然了, 你足够了解 Component 的话, 你自己也会知道到底是不是 Component 的问题

所有发现 bug 受奖励的名单, 会持续更新(非真实姓名, 用户自己留的)

形式为:姓名 <--> 问题描述或者 Issue 链接

  • 空(群内名称) <--> 群里反馈注入功能对 Activity 模式是 SingleTask 的无效的问题.
  • 空(群内名称) <--> 群里反馈路由 Api 缺少对应的混淆配置的问题. 非代码问题, 文档缺失
  • 补假单的蛋炒饭(群内名称) <--> #36 某些跳转场景的错误信息没打印. 错误回调是有的
  • 曾勇浩(群内名称) <--> 群里反馈自定义 Intent 对 Kotlin 的支持是有问题的. #40
  • Bacchuc(github名称) <--> #41 普通跳转携带 requestCode 和 跳转拿数据混用导致普通跳转在 onActivityResult 中拿到的 requestCode 匹配不上的问题
  • @longyuan5 <--> #54 在更新几个版本之后, Activity的转场动画overridePendingTransition()失效
  • @pengbs <--> #69 ServiceManager.get() 和 FragmentManager.get() 死循环的问题

编译失败

Caused by: java.lang.IllegalArgumentException: not a valid name: 'component1ModuleApplicationGeneratedDefault
at com.squareup.javapoet.Util.checkArgument(Util.java:53)
at com.squareup.javapoet.TypeSpec$Builder.(TypeSpec.java:413)
at com.squareup.javapoet.TypeSpec$Builder.(TypeSpec.java:392)
at com.squareup.javapoet.TypeSpec.classBuilder(TypeSpec.java:112)
at com.xiaojinzi.component.ModuleAppProcessor.createImpl(ModuleAppProcessor.java:118)
at com.xiaojinzi.component.ModuleAppProcessor.init(ModuleAppProcessor.java:57)
at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.init(DelegatingProcessor.java:57)
at org.gradle.api.internal.tasks.compile.processing.NonIncrementalProcessor.init(NonIncrementalProcessor.java:33)
at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.init(DelegatingProcessor.java:57)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.access$301(TimeTrackingProcessor.java:37)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$4.create(TimeTrackingProcessor.java:88)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$4.create(TimeTrackingProcessor.java:85)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.track(TimeTrackingProcessor.java:117)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.init(TimeTrackingProcessor.java:85)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.(JavacProcessingEnvironment.java:500)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:597)

路由的常见问题解决(特意开这个 issue, 方便大家提 issue 之前是否能通过此 issue 的描述解决你的问题)

依赖失败?

  • 请检查你是否在项目级别的 gralde 文件中添加 jitpakc 仓库
  • 请检查项目依赖的地址是否正确,特别是版本号的地方, 是否替换成为了对应的版本号

依赖之后构建代码失败?

  • 项目提供了AndroidX 的支持,请检查你的项目是否与之对应
  • 其他的构建失败应该和 Component 没关系

模块加载失败 或者 第一个路由失败?

  • 检查目标业务模块是否在 App 模块的 build.gradle 中依赖了
  • 检查目标业务模块是否已经在 Application 中加载
  • 检查你要加载的各个模块的名称是否和对应的模块中 gradle 中的配置一致
  • 检查您的 Application 是否配置到清单文件中
  • 检查项目启动的时候日志是否提示您模块加载失败
  • 查看控制台是否有路由失败的日志, 查看错误内容排查错误
  • 检查你要跳转的路径和目标界面的路径是否一致
  • 是否项目的配置正确?请详细再看一遍 Config, 或者观看链接中的视频讲解

跳转拿 ActivityResult 注意事项

  • 要使用此功能必须传入 FragmentActivity 的上下文 Context 或者支持包中 Fragment 或者androidx 包中 Fragment, 不能省略,也就是 Router.with(xxx) 方法中的 xxx 不能省略
  • 框架帮你拿 ActivityResult的方式,在回调或者 RxJava2 的回调中会传给你 ActivityResult, 你不能让框架帮你拿的同时又自己重写 ActivityonActivityResult 方法匹配,这会导致你的代码无法匹配.两者选择用一个
  • 本框架支持在 Dialog 等环境中还能使用此功能. 只要你给的 Context 是一个 FragmentActivity 或者和 FragmentActivity 是有关联关系的.比如 DialogContext 就不是 FragmentActivity, 但是 Dialog 是依赖于 FragmentActivity 的, 所以这种框架也支持. 不支持 Context 是一个 Application 的!

最后一点

issue 之前麻烦大家尽量贴出有用的错误信息和详细的错误日志, 描述清楚错误的过程

不要提 issue 让作者我无从下手帮您解决.

最后谢谢大家相信我的组件化库,我会一直加油并且维护下去的

关于requestCode的问题

这样一个场景:A通过Router+requestCode跳转B,B又跳转了C,然后C返回B,B返回A,此时A收不到onActivityResult。

Google 的 App Bundle导致的模块加载失败

当你 optimizeInit(boolean) 传入 true, 并且正确配置了 Gradle 插件

Config.with(this)
                        .defaultScheme("router")
                        // 开启启动优化, 必须配套使用 Gradle 插件
                        .optimizeInit(true)
                        .build()

理论上加载时没问题的. 但是在 GoogleApp Bundle 下, 由于在编译的时候, 其实 Gradle 插件并不能处理到其他模块的 class, 所以自然没法扫描到所有模块. 这是加载不成功的原因.

但是可以关闭 optimizeInit(false), 框架就会在运行期间用反射加载模块. 这个在任何时候都是没问题的.

总结一下:GoogleApp Bundle和 ASM 加载模块的方式有冲突. optimizeInit(false) 传入 false, 采用反射加载即可. 效率比 ASM 的方式多了几毫秒罢了. 不用太担心.
如果你的项目并不是 GoogleApp Bundle 架构, 那你可以放心使用 ASM 方式

fragment 跳转activity 传值问题

fragment的代码
Router
.with(this@HomeTabFragment)
.host("home")
.path("more")
.putString("classifyType", sectionList[i].classifyType)
.putInt("typeId", sectionList[i].typeId)
.forward()

activity的代码
@JvmField
@AttrValueAutowiredAnno("classifyType")
var mClassifyType: String ?= null

@JvmField
@AttrValueAutowiredAnno("typeId")
var mTypeId: Int ? = null

最新版本无法编译通过

版本:1.7.6
gradle编译日志:
Caused by: java.lang.NullPointerException: element == null
at com.squareup.javapoet.Util.checkNotNull(Util.java:57)
at com.squareup.javapoet.ClassName.get(ClassName.java:207)
at com.xiaojinzi.component.ServiceProcessor.init(ServiceProcessor.java:58)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.(JavacProcessingEnvironment.java:500)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:597)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:690)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
at com.sun.tools.javac.main.Main.compile(Main.java:523)

1.7.6编译失败

java.lang.RuntimeException: java.lang.IllegalArgumentException: not a valid name: 'component1ModuleApplicationGeneratedDefault
at com.sun.tools.javac.main.Main.compile(Main.java:553)
at com.sun.tools.javac.api.JavacTaskImpl.doCall(JavacTaskImpl.java:129)
at com.sun.tools.javac.api.JavacTaskImpl.call(JavacTaskImpl.java:138)
at org.gradle.api.internal.tasks.compile.AnnotationProcessingCompileTask.call(AnnotationProcessingCompileTask.java:92)
at org.gradle.api.internal.tasks.compile.ResourceCleaningCompilationTask.call(ResourceCleaningCompilationTask.java:57)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:50)
at org.gradle.api.internal.tasks.compile.JdkJavaCompiler.execute(JdkJavaCompiler.java:36)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:100)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:52)
at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:38)
at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:51)
at org.gradle.api.internal.tasks.compile.AnnotationProcessorDiscoveringCompiler.execute(AnnotationProcessorDiscoveringCompiler.java:37)
at org.gradle.api.internal.tasks.compile.CleaningJavaCompilerSupport.execute(CleaningJavaCompilerSupport.java:39)
at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilerFactory$2.execute(IncrementalCompilerFactory.java:110)
at org.gradle.api.internal.tasks.compile.incremental.IncrementalCompilerFactory$2.execute(IncrementalCompilerFactory.java:106)
at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:60)
at org.gradle.api.internal.tasks.compile.incremental.IncrementalResultStoringCompiler.execute(IncrementalResultStoringCompiler.java:44)
at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:59)
at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler$2.call(CompileJavaBuildOperationReportingCompiler.java:51)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.compile.CompileJavaBuildOperationReportingCompiler.execute(CompileJavaBuildOperationReportingCompiler.java:51)
at org.gradle.api.tasks.compile.JavaCompile.performCompilation(JavaCompile.java:154)
at org.gradle.api.tasks.compile.JavaCompile.compile(JavaCompile.java:122)
at com.android.build.gradle.tasks.AndroidJavaCompile.compile(AndroidJavaCompile.kt:237)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskInputsTaskAction.doExecute(IncrementalTaskInputsTaskAction.java:46)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:404)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:393)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:376)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:80)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:213)
at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$0(ExecuteStep.java:32)
at java.util.Optional.map(Optional.java:215)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:32)
at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:201)
at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
at java.util.Optional.map(Optional.java:215)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:77)
at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:120)
at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:75)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:73)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: not a valid name: 'component1ModuleApplicationGeneratedDefault
at com.squareup.javapoet.Util.checkArgument(Util.java:53)
at com.squareup.javapoet.TypeSpec$Builder.(TypeSpec.java:413)
at com.squareup.javapoet.TypeSpec$Builder.(TypeSpec.java:392)
at com.squareup.javapoet.TypeSpec.classBuilder(TypeSpec.java:112)
at com.xiaojinzi.component.ModuleAppProcessor.createImpl(ModuleAppProcessor.java:118)
at com.xiaojinzi.component.ModuleAppProcessor.init(ModuleAppProcessor.java:57)
at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.init(DelegatingProcessor.java:57)
at org.gradle.api.internal.tasks.compile.processing.NonIncrementalProcessor.init(NonIncrementalProcessor.java:33)
at org.gradle.api.internal.tasks.compile.processing.DelegatingProcessor.init(DelegatingProcessor.java:57)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.access$301(TimeTrackingProcessor.java:37)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$4.create(TimeTrackingProcessor.java:88)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor$4.create(TimeTrackingProcessor.java:85)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.track(TimeTrackingProcessor.java:117)
at org.gradle.api.internal.tasks.compile.processing.TimeTrackingProcessor.init(TimeTrackingProcessor.java:85)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$ProcessorState.(JavacProcessingEnvironment.java:500)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$DiscoveredProcessors$ProcessorStateIterator.next(JavacProcessingEnvironment.java:597)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.discoverAndRunProcs(JavacProcessingEnvironment.java:690)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.access$1800(JavacProcessingEnvironment.java:91)
at com.sun.tools.javac.processing.JavacProcessingEnvironment$Round.run(JavacProcessingEnvironment.java:1035)
at com.sun.tools.javac.processing.JavacProcessingEnvironment.doProcessing(JavacProcessingEnvironment.java:1176)
at com.sun.tools.javac.main.JavaCompiler.processAnnotations(JavaCompiler.java:1170)
at com.sun.tools.javac.main.JavaCompiler.compile(JavaCompiler.java:856)
at com.sun.tools.javac.main.Main.compile(Main.java:523)
... 124 more

通过系统浏览器打开页面的问题

一个很常见的场景,分享某个页面到微信,其点击分享跳转地址为:router://app/main。
如果采用Manifest.xml中用

   <data
              android:host="app"
              android:pathPrefix="/main"
              android:scheme="router" />

方式,大部分系统浏览器是能识别router://app/main并打开app到对应页面的。
然而如果采用Component,是不识别的

可以考虑借鉴AutoRegister的思路,把反射相关的实现替换下:)

首先谢谢你的建议。下面我会解释为什么我没有使用

本项目用到反射的地方主要是初始化的地方,其他地方的反射基本就一次,第二次就有缓存了
后者是没啥问题的,就算 bufferknife 也还是有一次反射去寻找实现类的。
可能你觉得性能有问题的地方应该是初始化,加载各个模块的地方了。
这里讲道理确实有些不好,奔着养最好的性能上考虑,这里确实应该利用 gradle 插件去做这件事。但是我一开始没有考虑这样做的原因有以下几点:

  1. 模块在我这框架中是可以卸载的,如果利用 gradle 扫描进去的方式,就不能让用户用代码去控制加载了
  2. 我的框架我不想牵扯任何的动态修改代码的技术,我的目的是降低框架出现兼容性或者其他问题的可能性,所以我的框架我敢说 100% 兼容。这一点你去看下 Arouter 或者 CC 你就发现他们为什么有些用户出现兼容性或者一些乱七八糟的问题,根本原因就在这,我不想给任何一个用户带去这种问题发生的可能性
  3. 其实初始化的时候反射并没有你想的那么糟糕,几毫秒的时间,很多 app 其他的性能问题都比这个糟糕很多。另外如果有些项目确实很看中这个,那你可以考虑放到子线程去初始化,把这个时间埋藏在首屏的启动动画中。很多 app 启动动画都有两三秒

再一次感谢你的反馈,谢谢。期待你的其他反馈!

:octocat: From gitme iOS

采用component_impl_rx

在application 中初始化的时候 出现如下报错:java.lang.NoClassDefFoundError: com.xiaojinzi.component.support.RxErrorConsumer

代码警告报黄问题

image

如上所示,代码报黄,引起的原因是最后 subscribe 方法提示返回值需要处理

全局拦截器的问题

我现在有一个拦截器, 它是很多地方用到的. 比如登陆拦截器, 就像你的源码中, 你是放到了 User 模块. 我能否直接放到 Base 中. 看上去使用还方便些. 希望能给些建议

十分中肯的讨论

你好, 作者你这个项目除了生成文档这个功能没有, 我看其他方面都很好啊, 我也下载了 Demo 去使用了一下.

之前使用 ARouter, 后面发现还是有很多的不足的, 我们团队在思考是否可以使用你的这个框架.
因为 star 和热度都没有 Arouter 高, 我们团队需要用一些时间来考量这个项目. 希望在这段时间内坐着你可以给与帮助. 我们也会给出一些我们的建议

以下是这几天我们的一个建议:

  1. 生成文档的功能希望还是要有的, 毕竟我们之前就是有的, 而且生成文档也免于我们手动维护
  2. 在一些关键的功能上希望能更多的介绍下, 更便于大家熟悉
  3. 我看 Demo 中很多都是 Router.with(context).... 这种形式的, 是不是加在最后的 navigate 方法上会更好?
  4. 页面拦截器我感觉真的是一个很好地点, 这个解决了我们经常思考的一些痛点, 感谢。。
  5. 在大型的 App 上, 通常会有各自的 Apk 最终打包成为一个, 那么独立运行这件事就很重要, 不知道作者你怎么考虑?
  6. 作者你说的兼容性 100% 是依据什么得出的?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.