Code Monkey home page Code Monkey logo

wmrouter's Introduction

License Release Version PRs Welcome

WMRouter是一款Android路由框架,基于组件化的设计思路,有功能灵活、使用简单的特点。

请注意,因为JCenter下线,从1.2.1开始,Group 从 com.sankuai.waimai.router 变更为 io.github.meituan-dianping。

功能简介

WMRouter主要提供URI分发、ServiceLoader两大功能。

URI分发功能可用于多工程之间的页面跳转、动态下发URI链接的跳转等场景,特点如下:

  1. 支持多scheme、host、path
  2. 支持URI正则匹配
  3. 页面配置支持Java代码动态注册,或注解配置自动注册
  4. 支持配置全局和局部拦截器,可在跳转前执行同步/异步操作,例如定位、登录等
  5. 支持单次跳转特殊操作:Intent设置Extra/Flags、设置跳转动画、自定义StartActivity操作等
  6. 支持页面Exported控制,特定页面不允许外部跳转
  7. 支持配置全局和局部降级策略
  8. 支持配置单次和全局跳转监听
  9. 完全组件化设计,核心组件均可扩展、按需组合,实现灵活强大的功能

基于SPI (Service Provider Interfaces) 的设计**,WMRouter提供了ServiceLoader模块,类似Java中的java.util.ServiceLoader,但功能更加完善。通过ServiceLoader可以在一个App的多个模块之间通过接口调用代码,实现模块解耦,便于实现组件化、模块间通信,以及和依赖注入类似的功能等。其特点如下:

  1. 使用注解自动配置
  2. 支持获取接口的所有实现,或根据Key获取特定实现
  3. 支持获取Class或获取实例
  4. 支持无参构造、Context构造,或自定义Factory、Provider构造
  5. 支持单例管理
  6. 支持方法调用

其他特性:

  1. 优化的Gradle插件,对编译耗时影响较小
  2. 编译期和运行时配置检查,避免配置冲突和错误
  3. 完善的调试功能,帮助及时发现问题

适用场景

WMRouter适用但不限于以下场景:

  1. Native+H5混合开发模式,需要进行页面之间的互相跳转,或进行灵活的运营跳转链接下发。可以利用WMRouter统一页面跳转逻辑,根据不同的协议(HTTP、HTTPS、用于Native页面的自定义协议)跳转对应页面,且在跳转过程中可以使用UriInterceptor对跳转链接进行修改,例如跳转H5页面时在URL中加参数。

  2. 统一管理来自App外部的URI跳转。来自App外部的URI跳转,如果使用Android原生的Manifest配置,会直接启动匹配的Activity,而很多时候希望先正常启动App打开首页,完成常规初始化流程(例如登录、定位等)后再跳转目标页面。此时可以使用统一的Activity接收所有外部URI跳转,到首页时再用WMRouter启动目标页面。

  3. 页面跳转有复杂判断逻辑的场景。例如多个页面都需要先登录、先定位后才允许打开,如果使用常规方案,这些页面都需要处理相同的业务逻辑;而利用WMRouter,只需要开发好UriInterceptor并配置到各个页面即可。

  4. 多工程、组件化、平台化开发。多工程开发要求各个工程之间能互相通信,也可能遇到和外卖App类似的代码复用、依赖注入、编译等问题,这些问题都可以利用WMRouter的URI分发和ServiceLoader模块解决。

  5. 对业务埋点需求较强的场景。页面跳转作为最常见的业务逻辑之一,常常需要埋点。给每个页面配置好URI,使用WMRouter统一进行页面跳转,并在全局的OnCompleteListener中埋点即可。

  6. 对App可用性要求较高的场景。一方面,可以对页面跳转失败进行埋点监控上报,及时发现线上问题;另一方面,页面跳转时可以执行判断逻辑,发现异常(例如服务端异常、客户端崩溃等)则自动打开降级后的页面,保证关键功能的正常工作,或给用户友好的提示。

  7. 页面A/B测试、动态配置等场景。在WMRouter提供的接口基础上进行少量开发配置,就可以实现:根据下发的A/B测试策略跳转不同的页面实现;根据不同的需要动态下发一组路由表,相同的URI跳转到不同的一组页面(实现方面可以自定义UriInterceptor,对匹配的URI返回301的UriResult使跳转重定向)。

设计与使用文档

设计与使用文档

发展背景

关于WMRouter的发展背景和过程,可参考美团技术博客 WMRouter:美团外卖Android开源路由框架

更新日志

更新日志

使用了WMRouter的项目


美团外卖

美团外卖商家版

美团

大众点评

欢迎补充,并创建PullRequest。

贡献者 / Contributors ✨

All Contributors

感谢所有参与贡献的人员:


江子健

💻 📖 🤔 📝 🚧

李少杰

🤔 💻 👀 🚧

yuanboGeng

💻 🤔

Laberat Yi

🤔

郑金光

🐛 👀 🚧

Ultra-Dejavu

💻

Jeremy Liao

💻

kiminozo

💻 🐛

zjiecode

🐛 🚧

hibate

🐛

卓修武

🐛 💻

Vali

📖

Caij

🐛

Acropolis

🐛

dingshaoran

🐛

栉风

🐛
  • 如有遗漏和需要补充的,可按照 all-contributors 文档自行添加,并创建Pull Request。
  • 参与贡献者可加微信jzj2015,进入 WMRouter Contributors 微信群学习交流。

wmrouter's People

Contributors

allcontributors[bot] avatar caij avatar hibate avatar jzj1993 avatar knight-zxw avatar leifzhang avatar zhaoya188 avatar zjiecode 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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

wmrouter's Issues

transformClassesWithMultidexlistFor##Debug

clean之后编译可以正常编译
编译一次之后再次编译无法编译,错误在transformClassesWithMultidexlistFor##Debug 这个流程中。
错误信息是
java.lang.RuntimeException: com.android.build.api.tranformException: Error while generating the main dex list
原因是
Program type already present: xxx
at com.andorid.build.gradle.internal.transforms.D8MainDexListTranform.tranform
...
duplicate_classes

@jzj1993

DefaultActivityLauncher,168行,context为application的时候,会崩溃

如题,
if (requestCode != null && context instanceof Activity) {
ActivityCompat.startActivityForResult((Activity) context, intent, requestCode,
options);
} else {
ActivityCompat.startActivity(context, intent, options);
}

如果 requeCode is null,而context是Application的,会崩溃,集成代码中已经出现了这种情况

是不是不能用模拟器?

按照接入指引接入和配置,在 Mac 上用模拟器运行的时候 crash 了

2018-10-16 16:08:48.636 1334-1405/? E/SurfaceFlinger: ro.sf.lcd_density must be defined as a build property
2018-10-16 16:08:48.654 29155-29171/? E/UncaughtExHandler: [work, uncaughtException, 53]:[main][uncaughtException -> msg:java.lang.RuntimeException: java.lang.ClassNotFoundException: com.sankuai.waimai.router.generated.ServiceLoaderInit]
2018-10-16 16:08:48.655 29155-29155/? E/UncaughtExHandler: exception stacktrace:com.futu.component.async.coroutines.AsyncException: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.sankuai.waimai.router.generated.ServiceLoaderInit
at com.test.preview.GlobalApplication$initWMRouter$2.doResume(GlobalApplication.kt:69)
at kotlin.coroutines.experimental.jvm.internal.CoroutineImpl.resume(CoroutineImpl.kt:42)
at kotlin.coroutines.experimental.CoroutinesKt.startCoroutine(CoroutinesLibrary.kt:26)
at com.test.preview.async.coroutines.AsyncKt.async(Async.kt:244)
at com.test.preview.async.coroutines.AsyncKt.async(Async.kt:181)
at com.test.preview.async.coroutines.AsyncKt.async$default(Async.kt:177)
at com.test.preview.GlobalApplication.initWMRouter(GlobalApplication.kt:69)
at com.test.preview.GlobalApplication.onCreate(GlobalApplication.kt:31)
at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1024)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5361)
at android.app.ActivityThread.-wrap2(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1528)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756)
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.sankuai.waimai.router.generated.ServiceLoaderInit
at com.sankuai.waimai.router.components.DefaultLogger.handleError(DefaultLogger.java:80)
at com.test.preview.GlobalApplication$initWMRouter$1$logger$1.handleError(GlobalApplication.kt:53)
at com.sankuai.waimai.router.components.DefaultLogger.fatal(DefaultLogger.java:69)
at com.sankuai.waimai.router.core.Debugger.fatal(Debugger.java:116)
at com.sankuai.waimai.router.service.ServiceLoader$1.doInit(ServiceLoader.java:42)
at com.sankuai.waimai.router.utils.LazyInitHelper.performInit(LazyInitHelper.java:51)
at com.sankuai.waimai.router.utils.LazyInitHelper.lazyInit(LazyInitHelper.java:30)
at com.sankuai.waimai.router.service.ServiceLoader.lazyInit(ServiceLoader.java:51)
at com.sankuai.waimai.router.Router.lazyInit(Router.java:71)
at com.test.preview.GlobalApplication$initWMRouter$2$1.invoke(GlobalApplication.kt:69)
at com.test.preview.GlobalApplication$initWMRouter$2$1.invoke(GlobalApplication.kt:20)
at com.test.preview.async.coroutines.AwaitTask.obtainValue(Async.kt:535)
at com.test.preview.async.coroutines.CancelableTask.run(Async.kt:504)
at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1367)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:256)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1123)
at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1961)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1909)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:128)
Caused by: java.lang.ClassNotFoundException: com.sankuai.waimai.router.generated.ServiceLoaderInit
at java.lang.Class.classForName(Native Method)
at java.lang.Class.forName(Class.java:400)
at java.lang.Class.forName(Class.java:326)
at com.sankuai.waimai.router.service.ServiceLoader$1.doInit(ServiceLoader.java:37)
at com.sankuai.waimai.router.utils.LazyInitHelper.performInit(LazyInitHelper.java:51) 
at com.sankuai.waimai.router.utils.LazyInitHelper.lazyInit(LazyInitHelper.java:30) 
at com.sankuai.waimai.router.service.ServiceLoader.lazyInit(ServiceLoader.java:51) 
at com.sankuai.waimai.router.Router.lazyInit(Router.java:71) 
at com.test.preview.GlobalApplication$initWMRouter$2$1.invoke(GlobalApplication.kt:69) 
at com.test.preview.GlobalApplication$initWMRouter$2$1.invoke(GlobalApplication.kt:20) 
at com.test.preview.async.coroutines.AwaitTask.obtainValue(Async.kt:535) 
at com.test.preview.async.coroutines.CancelableTask.run(Async.kt:504) 
at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1367) 
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:256) 
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1123) 
at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1961) 
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1909) 
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:128) 
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.sankuai.waimai.router.generated.ServiceLoaderInit" on path: DexPathList[[zip file "/data/app/com.test.preview-2/base.apk"],nativeLibraryDirectories=[/data/app/com.test.preview-2/lib/x86, /data/app/com.test.preview-2/base.apk!/lib/x86, /system/lib, /vendor/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at java.lang.Class.classForName(Native Method) 
at java.lang.Class.forName(Class.java:400) 
at java.lang.Class.forName(Class.java:326) 
at com.sankuai.waimai.router.service.ServiceLoader$1.doInit(ServiceLoader.java:37) 
at com.sankuai.waimai.router.utils.LazyInitHelper.performInit(LazyInitHelper.java:51) 
at com.sankuai.waimai.router.utils.LazyInitHelper.lazyInit(LazyInitHelper.java:30) 
at com.sankuai.waimai.router.service.ServiceLoader.lazyInit(ServiceLoader.java:51) 
at com.sankuai.waimai.router.Router.lazyInit(Router.java:71) 
at com.test.preview.GlobalApplication$initWMRouter$2$1.invoke(GlobalApplication.kt:69) 
at com.test.preview.GlobalApplication$initWMRouter$2$1.invoke(GlobalApplication.kt:20) 
at com.test.preview.async.coroutines.AwaitTask.obtainValue(Async.kt:535) 
at com.test.preview.async.coroutines.CancelableTask.run(Async.kt:504) 
at java.util.concurrent.ForkJoinTask$AdaptedRunnableAction.exec(ForkJoinTask.java:1367) 
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:256) 
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1123) 
at java.util.concurrent.ForkJoinPool.scan(ForkJoinPool.java:1961) 
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1909) 
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:128) 

gradle3.0和2.0兼容问题

Required: EXTERNAL_LIBRARIES, PROJECT. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS
建议将gradle升级到3.0

关于WMRouter service moudle设计的疑问

WMRouter的Service模块参考的SPI (Service Provider Interfaces) 设计,一个服务接口可以有多个服务实现,但是在实际的业务服务调用中,大部分情况下 一个服务接口只会有一个实现;
因此 WmRouter 是否可以提供 类似 Router. getService(Iservice.class) 的方法,目前是只有传入Key的实现
Router.getService(IService.class, "key1");

Could not find com.sankuai.waimai.compiler:1.1.0:.

奇怪的问题:配置好后,gradle问题提示:Could not find com.sankuai.waimai.compiler:1.1.0:.
我再三检查了配置,确认没有在版本号后面加过冒号。。。。。。。

环境如下:
build_versions.min_sdk = 21
build_versions.target_sdk = 28
build_versions.build_tools = "28.0.3"
build_versions.java = JavaVersion.VERSION_1_8

deps.android_gradle_plugin = "com.android.tools.build:gradle:3.3.0-alpha12"
distributionUrl=https://services.gradle.org/distributions/gradle-4.10.1-all.zip
求指导。。。谢谢

关于参数解析的一些建议

  1. 接入文档需完善 kotlin下kapt替换annotationProcessor;
  2. 目标页面的参数通过外部标准url传参与extra传参需要分别单独解析,而且还要匹配类型,最好能自动注入或者能自动提取url中参数;

plugin使用了debugComplie

Configuration 'debugCompile' is obsolete and has been replaced with 'debugImplementation' and 'debugApi'.
It will be removed at the end of 2018. For more information see:

关于WMRouter不支持InstantRun的问题

测试了 WMRouter的Demo工程 打开InstantRun的情况下编译会出错
错误日志为

What went wrong:
Execution failed for task ':demoapp:transformClassesWithInstantRunVerifierForDebug'.
Unexpected scopes found in folder '/Users/hb/code/opensource/WMRouter/demoapp/build/intermediates/transforms/WMRouter/debug'. Required: PROJECT, EXTERNAL_LIBRARIES. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS

尝试将WMRouterTransform 中的getInputTypes 方法返回值从 TransformManager.CONTENT_JARS 改为 TransformManager.CONTENT_CLASS 解决了这个问题

本身这个transform不需要对资源做处理,所以这样修改应该没什么问题

某一个页面或者module对外暴露的方法,如何约束调用者?

比如:A Module调用B Module的方法,B Module的方法有2个参数,但是调用者不小心传了3个或者1个参数,这显然是B Module不希望的,如果能以某种方式在编译期预处理,调用的时候有编译器提示就好了,请问作者对这方面有什么好的实现思路吗?

如何知道一个页面能否打开呢?(需要在不调用startActivity之前)

具体如下:
由于提供api给h5方法使用:以前有方法判断能否打开app一个activity,以前方法如下,以前都是在manifest中使用data schema:

boolean canOpen = false;
            if (url != null) {
                url = url.trim();
                Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
                intent.setPackage(context.getPackageName());
                if (null != intent.resolveActivity(context.getPackageManager())) {
                    canOpen = true;
                }
            }


但是使用你们router框架后,似乎没有类似api使用。而类似的
new DefaultUriRequest(context, url)
                  .onComplete(new OnCompleteListener() {
                      @Override
                      public void onSuccess(@NonNull UriRequest request) {
                       
                      }

                      @Override
                      public void onError(@NonNull UriRequest request, int resultCode) {
                       
                      }
                  })
                  .start())

这种必须要真实打开后才知道结果。

****请问有类似的方法可调用吗?

关于用Kotlin 编写业务模块的通信问题

在java编写的模块掉用RouterService调用会报。
2019-02-12 19:10:58.269 10827-10827/com.example.jarson.hallobiketest E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.jarson.hallobiketest, PID: 10827
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Intrinsics;

关于Java和Kotlin业务模块之间的调用方式还请在demo中多多完善~谢谢。

编译不通过

WMRouter-master\WMRouter-master\demokotlin\build\tmp\kapt3\stubs\debug\com\sankuai\waimai\router\demo\kotlin\KotlinActivity.java:6: 错误: 不兼容的类型: NonExistentClass无法转换为Annotation
@error.NonExistentClass()

不明白什么意思,怎么破?

不兼容InstantRun

WmRouter1.10、1.1.2版本,Android Studio 3.2.1,build tools插件3.2.1。

Android Studio使用绿三角 Run,报如下错误:
查看build task执行,卡在transformClassesWithInstantRunVerifierForDebug。
在设置里面关闭InstantRun,就可以了

具体错误:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':uxinUsedCar:transformClassesWithInstantRunVerifierForDebug'
中间省略。。
Caused by: java.lang.RuntimeException: Unexpected scopes found in folder '/Users/省略/build/intermediates/transforms/WMRouter/debug'. Required: EXTERNAL_LIBRARIES, PROJECT. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS

version number

readme里面为啥没有明显的版本号
最后在gradle里面找到了
希望能在里面添加版本号

Could not find com.sankuai.waimai.router:plugin:1.1.2.

整体设计感觉挺好,但有点疑问,为什么要让注解那么分散?

有时候页面非常多,路由改起来非常不直观。

为什么不把路由统一配置在一个文件里面呢?每个activity都在头部单独注解,没有好处呀。
我觉得前端Vue的route就很不错,一个文件配置 一切路由,查看的时候,也一览无遗。

还有些是有父子关系的,把他们放在一起,肯定会直观很多。

比如
/home/
/home/me/
/home/a/
/home/a/b

/function/xx
/function/bb
(这里的home和function 都不是host, 语义上是path)

而且有的path是基于父子关系,假如home是登陆用户才能进入的,那么只要在home这个父路径设置权限拦截器就可以了。而a 这个子路径只有管理员权限的用户才能进入,那么只要在a这个子路径设置一个拦截器就可以了。

至于如何把路由配置统一在一个文件,假如还是用注解来实现,我的建议是参考retrofit2那样。

但是我还是不喜欢注解,虽然已经把项目拆成了一个个小项目,编译时注解依旧是编译打包中最耗时的操作。(项目用到了大量编译时注解,还有databinding,现在已经后悔了)

一点小小的愚见,我更倾向于直接用java类来实现路由配置。假如是用kotlin,我觉得可以这样

class Router: WmRouter(){
   
   build{
     addRoute("/home",HomeActivity:class.java){
          seItnterceptor(LoginInterceptor::class.java)
          addChild{
               addRoute("/me",MeFragment:class.java)
               addRoute("/a",AFragment:class.java)
               addRoute("/b", BFragment:class.java)

         }
     }
  }

} 

key如何管理?

A Module和B Module(以下简称A,B)是2个平级的Module,互相没有依赖,A要调用B的方法,通过 Router.callMethod去调用,就会涉及到A和B都持有这个key,又不想把key下沉,因为一旦下沉必然面临,多人修改,难以维护的问题,想请教一下有没有什么优雅的解决方案呢?

Unable to find method 'org.gradle.api.internal.artifacts.ivyservice.projectmodule.ProjectPublicationRegistry.registerPublication(Ljava/lang/String;Lorg/gradle/api/internal/artifacts/ivyservice/projectmodule/ProjectPublication;)V'.

clone了代码,编译不过去.错误信息如下:

`` Download https://services.gradle.org/distributions/gradle-5.2.1-all.zip (132.55 MB)
[ 96%] [ =====================================================> ] 127.94 MB
Download https://services.gradle.org/distributions/gradle-5.2.1-all.zip succeeded, took 1 m 15 s 348 ms
Unzipping ...

FAILURE: Build failed with an exception.

  • What went wrong:
    org.gradle.api.internal.artifacts.ivyservice.projectmodule.ProjectPublicationRegistry.registerPublication(Ljava/lang/String;Lorg/gradle/api/internal/artifacts/ivyservice/projectmodule/ProjectPublication;)V

  • Try:
    Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

  • Get more help at https://help.gradle.org

CONFIGURE FAILED in 17s
Unable to find method 'org.gradle.api.internal.artifacts.ivyservice.projectmodule.ProjectPublicationRegistry.registerPublication(Ljava/lang/String;Lorg/gradle/api/internal/artifacts/ivyservice/projectmodule/ProjectPublication;)V'.
Possible causes for this unexpected error include:
Gradle's dependency cache may be corrupt (this sometimes occurs after a network connection timeout.)
Re-download dependencies and sync project (requires network)

The state of a Gradle build process (daemon) may be corrupt. Stopping all Gradle daemons may solve this problem.
Stop Gradle build processes (requires restart)

Your project may be using a third-party plugin which is not compatible with the other plugins in the project or the version of Gradle requested by the project.

In the case of corrupt Gradle processes, you can also try closing the IDE and then killing all Java processes.

`

通用链接app link搭配这个库怎么用呢

项目想使用app link, 就需要在某个activity中这样配置:

<activity ...>

    <intent-filter android:autoVerify="true">
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />
        <data android:scheme="http" android:host="www.example.com" />
        <data android:scheme="https" />
    </intent-filter>

</activity>

如果使用wmrouter,就产生两个问题:

  1. 这个配置在哪个activity下面。UriProxyActivity?如果是UriProxyActivity下面会有http schema和自定义的schema比如example://
  2. 我怎么区分http://www.example.com/redirect/searchPage?name=test(这个最终打开app 全局搜索activity)和http://www.example.com/web/asset/index.html#!/user/detail(打开app WebviewActivity然后打开这个html地址)呢?

mac 运行不通过麻烦看一下呢

Unable to add Transform 'dependencyChecker' on variant 'debug': requested streams not available: []+[PROJECT_LOCAL_DEPS, SUB_PROJECTS_LOCAL_DEPS, EXTERNAL_LIBRARIES] / [CLASSES]

关于多Module间Activity不能跳转问题

app依赖ModuleA、ModuleB、ModuleC。ModuleA、ModuleB、ModuleC三者之间的页面不能相互跳转么?测试过似乎从MuoduleA中的Activity跳回app中的Activity也不行

通知栏的跳转怎么使用呢?

又发现一个新的案例:通知栏url能打开的话,就跳转到相关页面同时打开首页,不能打开只打开首页。
这是以前的方式:

   ArrayList<Intent> intents = new ArrayList<>();
//        if (AppForegroundManager.get().isBackground()) {
        Intent tagetIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(redirectUrl));
        tagetIntent.setPackage(context.getPackageName());
        if (tagetIntent.resolveActivity(context.getPackageManager()) == null) {
            tagetIntent = Utils.getEntryIntent(context);
        } else {
            Intent entryIntent = Utils.getEntryIntent(context);
            entryIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
            intents.add(entryIntent);
        }
        tagetIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        intents.add(tagetIntent);
        Intent[] intentsArr = new Intent[intents.size()];
        PendingIntent contentIntent = PendingIntent.getActivities(context, NotificationUtils.REDIRECT_NOTIFY_ID, intents.toArray(intentsArr), PendingIntent.FLAG_UPDATE_CURRENT);
//            NotificationUtil.showNotification(NOTIFY_ID, context, context.getResources().getString(R.string.app_name), alertContent, redirectUrl);
        NotifyUtil notifyUtil = new NotifyUtil(context, NotificationUtils.REDIRECT_NOTIFY_ID);
        Bitmap largeIconBitMap = ImageUtils.getBitmapFromRes(context, R.drawable.app_icon);
        notifyUtil.showNotify(contentIntent, R.drawable.notify_icon, "您有一条新的通知", context.getResources().getString(R.string.app_name), alertContent, largeIconBitMap, true, true, false);

那么现在用这个框架该怎么正确使用呢?这里似乎还是绕不开我上个closed的问题:怎么能提前知道一个activity能否打开(不startActivity)

这会是一个长期版本的项目吗?

你好!
最近在项目开发选型,现在路由star比较多的就是阿里那款了
最近被人推荐了这个项目,考虑到公司的项目是长期使用的,想问下贵公司的这个项目是一个长期支持的版本吗?

为啥将apt生成的文件写入到assets

您好,看到源码里面对RouterService注解的处理,是先用注解处理器生成了文件,放到了map中,然后又用了transform将map里的数据写入到了assets中,想知道您为什么要这设计。谢谢!

关于登录拦截器的问题

我们现在有很多业务逻辑有登录判断。比如一个Activity是不需要登录就能进入,但是其中的某些方法是需要判断登录状态的:只有登录的才能执行,否则跳转到登录页面,登录成功之后返回原始页面继续执行该方法。
本来打算使用wmrouter的拦截器,但是发现拦截器只能用到类的注解上面,并不支持在方法上面进行注解。请问这种业务逻辑,WMRouter有没有什么比较好的方案能够解决?或者作者有没有什么好的思路?
非常感谢!

关于Router.callMethod方法入参做校验的建议

通过Demo中的Router.callMethod(path,args)中只要传入对应的路径和方法的入参的个数就可以调用,暴露了一个问题。
以下代码都是WMRouterDemo中的代码
假如我的方法调用原先是:
Integer result = Router.callMethod(DemoConstant.ADD_METHOD, 1, 2);
它是两个入参:1,2 而且对应的addMethod方法也是实现的Func2,而且可以正常返回。
但是当我将代码改成:
Integer result = Router.callMethod(DemoConstant.ADD_METHOD, 1);
此时它的入参只有:1,但是对应的addMethod方法也是实现的Func2.
当我调用的时候程序会crash.
是因为我并不能感知到对应方法参数名的改变,大体是意思是这个.
请问能有一种比较好的方式解决这个问题吗,
如果不清晰可以加我vx:598941331

about kotlin

I cant use in a kt file name...when i add a path at kt class Name

是不是应该把编译脚本中所有的complie改成了implementation了,还有一个编译报错

Caused by: java.lang.NullPointerException
at com.sankuai.waimai.router.compiler.BaseProcessor.typeMirror(BaseProcessor.java:58)
at com.sankuai.waimai.router.compiler.BaseProcessor.isSubType(BaseProcessor.java:80)
at com.sankuai.waimai.router.compiler.BaseProcessor.isSubType(BaseProcessor.java:84)
at com.sankuai.waimai.router.compiler.BaseProcessor.isConcreteSubType(BaseProcessor.java:103)
at com.sankuai.waimai.router.compiler.BaseProcessor.isHandler(BaseProcessor.java:118)
at com.sankuai.waimai.router.compiler.UriAnnotationProcessor.process(UriAnnotationProce。

ServiceLoader自定义接口解耦问题

自定义继承IService的接口都要下沉到底层模块来解耦上层业务模块吗?如果是这样的话业务模块要添加或者修改接口,岂不要更新底层平台模块。

接入问题,不能找到ServiceLoaderInit

我把Debugger打开了,发现报错,不能找到类ServiceLoaderInit,再找文档中的常见问题,说是gradle没有正常工作,又检查gradle,我并没有加上这句,apply plugin: 'WMRouter',因为加上这句会编译不了,Unexpected scopes found in folder 'G:\文件夹路径'. Required: EXTERNAL_LIBRARIES, PROJECT. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS
我的配置是:Android studio3.0, Android plugin version:3.1.3',gradle version:4.4
classpath "com.sankuai.waimai.router:plugin:1.1.0"
implementation 'com.sankuai.waimai.router:router:1.1.0'
annotationProcessor 'com.sankuai.waimai.router:compiler:1.1.0'
求解答,谢谢

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.