一款面向泛前端产品研发全生命周期的效率平台。

Overview

简介

DoraemonKit







DoKit诞生于滴滴城运服体验技术部,是一款面向泛前端产品研发全生命周期的效率平台。经过两年的发展,当前DoKit已经发展成了一个相对完整的生态,比如DoKit For Android、DoKit For iOS、DoKit For 小程序、DoKit For Flutter、DoKit For Web。同时我们的项目被BAT以及滴滴、字节、快手、京东等等头部独角兽企业广泛使用并获得良好的口碑。随着dokit.cn平台端的推出,标志着DoKit已经从单纯的效率工具正式进入了效率工具平台的阶段。与此同时我们一直都未停下持续探索的精神,积极地在更多平台领域进行尝试,不给自己设限。我们相信DoKit的未来充满无限可能。

English Readme

领域生态

DoKit 首页效果演示

使用手册

访问DoKit官网,点击"使用中心"。

温馨提示:当前DoKit的所有功能都只针对Debug环境,Release环境未经过实际验证,所以请大家严格按照官方文档来集成,也不建议大家在Release环境上使用DoKit的任何功能。如果大家一定要在Release环境上使用,请自行进行充分的测试和验证,DoKit官方将不承担任何责任和损失。

更新日志

社区活动

DoKit调研问卷 亲爱的DoKit用户,动动你的小手指参与一下我们的官方调研活动吧。我们极度渴望听到你们的声音:

链接:https://page.juyanwenjuan.com/jy_0CMpJzlu.html

DoKit 首页效果演示

开发背景

每一个稍微有点规模的 App,总会自带一些线下的测试功能代码,比如环境切换功能、帧率查看功能等等,这些功能的切换入口往往放在各式各样的入口中,比如一些特殊的手势,双击 statusBar,双击某一个功能区块,或者新建一个 keyWindow 始终至于 App 最上方等等,而且每一个 App 里面的线下附带功能模块很多是相似的,比如帧率查看、内存和 CPU 监控等等,但是现在基本上都是每个 App 都是自己实现了一份,经历了以上的问题之后,DoKit 就有了它存在的意义。

DoKit 是一个功能平台,能够让每一个 App 快速接入一些常用的或者你没有实现的一些辅助开发工具、测试效率工具、视觉辅助工具,而且能够完美在 Doraemon 面板中接入你已经实现的与业务紧密耦合的一些非通有的辅助工具,并搭配我们的dokit平台,让功能得到延伸,接入方便,便于扩展。

简单总结

1、DoKit 能够快速让你的业务测试代码能够在这里统一管理,统一收口;

2、DoKit 内置很多常用的工具,避免重复实现,一次接入,你将会拥有强大的工具集合;

3、搭配dokit平台,借助接口Mock健康体检文件同步助手一机多控让你方便和他人协同,极大的提升研发过程中的效率。

功能模块

一、平台工具(www.dokit.cn)

  1. 【数据Mock】 App接口Mock解决方案,提供一套基于App网络拦截的接口Mock方案,无需修改代码即可完成对于接口数据的Mock。
  2. 【健康体检】 一键式操作,整合DoKit多项工具,数据可视化,快速准确定位问题,让你对app的性能了如指掌。
  3. 【文件同步助手】 通过终端服务,让你的终端空间在平台端完整的展现并提供强大的文件以及数据库操作能力。
  4. 【一机多控】 主从同步,释放人力,让研发测试效率提升看得见

二、常用工具

  1. 【App 信息查看】 快速查看手机信息,App 基础信息、签名相关、权限信息的渠道,避免去手机设置查找或者查看项目源代码的麻烦;
  2. 【开发者选项 Android特有】 一键跳转开发者选项,避免安卓由于平台差异导致的入口不一致
  3. 【本地语言】 一键跳转本地语言,避免安卓由于平台差异导致的入口不一致
  4. 【沙盒浏览】 App 内部文件浏览的功能,支持删除和预览, 并且能通过 AirDrop 或者其他分享方式上传到 PC 中,进行更加细致的操作;
  5. 【MockGPS】 App 能定位到全国各地,支持地图地位和手动输入经纬度;
  6. 【H5任意门】 开发测试同学可以快速输入 H5 页面地址,查看该页面效果;
  7. 【Crash查看】 方便本地打印出出现 Crash 的堆栈;
  8. 【子线程UI】 快速定位哪一些 UI 操作在非主线程中进行渲染,避免不必要的问题;(iOS独有)
  9. 【清除本地数据】 一键删除沙盒中所有数据;
  10. 【NSLog】 把所有 NSLog 信息打印到UI界面,避免没有开发证书无法调试的尴尬;
  11. 【Lumberjack】 每一条 CocoaLumberjack 的日志信息,都在在 App 的界面中显示出来,再也不需要导出日志这么麻烦;(iOS独有)
  12. 【DBView】 通过网页方便快捷的操作应用内数据库,让数据库的调试变得非常优雅;
  13. 【模拟弱网】 限制网速,模拟弱网环境下App的运行情况。(android独有)

三、性能检测

  1. 【帧率】 App 帧率信息提供波形图查看功能,让帧率监控的趋势更加明显;
  2. 【CPU】 App CPU 使用率信息提供波形图查看功能,让 CPU 监控的趋势更加形象;
  3. 【内存】 App 内存使用量信息提供波形图查看功能,让内存监控的趋势更加鲜明;
  4. 【流量监控】 拦截 App 内部流量信息,提供波形图展示、流量概要展示、流量列表展示、流量筛选、流量详情,对流量信息统一拦截,成为我们 App 中自带的 "Charles";
  5. 【卡顿】 锁定 App 出现卡顿的时刻,打印出对应的代码调用堆栈;
  6. 【大图检测】 通过流量监测,找出所有的大小超标的图片,避免下载大图造成的流量浪费和渲染大图带来的CPU消耗。
  7. 【启动耗时】 无侵入的统计出App启动过程的总共耗时;
  8. 【UI层级检查】 检查出每一个页面中层级最深的元素;
  9. 【函数耗时】 从函数级别分析app性能瓶颈;
  10. 【Load】 找出所有的Load方法,并给出耗时分析;(iOS独有)
  11. 【内存泄漏】 找出App中所有的内存泄漏的问题。

四、视觉工具

  1. 【颜色吸管】 方便设计师 UI 捉虫的时候,查看每一个组件的颜色值是否设置正确;
  2. 【组件检查】 可以抓取任意一个UI控件,查看它们的详细信息,包括控件名称、控件位置、背景色、字体颜色、字体大小;
  3. 【对齐标尺】 参考 Android 系统自带测试工具,能够实时捕获屏幕坐标,并且可以查看组件是否对齐;
  4. 【元素边框线】 绘制出每一个 UI 组件的边框,对于组件布局有一定的参考意义。

五、Weex专项工具(CML专项工具)

  1. 【console日志查看】 方便在端上查看每一个Weex文件中的console日志,提供分级和搜索功能;
  2. 【storage缓存查看】 将Weex中的storage模块的本地缓存数据可视化展示;
  3. 【容器信息】 查看每一个打开的Weex页面的基本信息和性能数据;
  4. 【DevTool】 快速开启Weex DevTool的扫码入口。

tips : 如果使用我们滴滴优秀的开源跨端方案 chameleon 也可以集成该工具集合

六、支持自定义的业务工具集成到面板中

统一维护和管理所有的测试模块,详见接入手册

七、微信小程序专项工具

详见 Doraemon mini program debugger

相关文档

微信交流群(一群满员,已开二群)

扫描以下二维码或者搜索jintsky加我微信好友,注意请添加备注:昵称-DoKit社区用户,否则你的申请将不会被验证通过。

微信交流群














QQ 交流群

QQ 交流群









微信公众号

微信公众号









项目成员

创始人 yixiangboy(易翔) 负责人 jtsky(金台)

内部核心成员 yixiangboyjtskyLinJZongjayconsciousxukaibinjellybean

贡献者榜单 changzuozhenwanglikun7342wenquanlebaohiXgbChinnkoy644938647wm219goolongmiracle9312lwhsgz123huakuchaHuginChenfeng562925462azhonrex26csc-EricWuxiandanin0xd-cck373379320fabczy500Knight-ZXWboaiklone1127DeveloperLYsagdragonccworld1000HDB-Liyu-jianfengydlsl

如何成为外部贡献者? 提交有意义的PR,并被采纳。

使用提醒

因为SDK目前会配合dokit.cn平台, 会产生一些网络数据,这些信息我们收集绝不用于任何恶意用途。

以下为所有涉及到网络请求的部分

  1. 统计有多少用户集成了dokit

    Android : DoraemonStatisticsUtil#uploadUserInfo

    iOS : DoraemonStatisticsUtil#upLoadUserInfo

  2. 统计每个内置kit的使用情况

    Android : DataPickManager#realPost

    iOS : DoraemonBuriedPointManager#uploadData

  3. 上传健康体检的相关数据

    Android : AppHealthInfoUtil#post

    iOS : DoraemonHealthManager#upLoadData

  4. 数据mock的相关网络请求

    Android : NetWorkMockFragment 里涉及到接口mock的相关网络请求

    iOS : DoraemonMockManager#queryMockData&uploadSaveData

敬请各位用户知晓。

友情链接

  1. Hummer,Hummer 是一套高性能高可用的跨端开发框架,一套代码可以同时支持开发 Android 和 iOS 应用。现已经支持 Vue/TypeScript/JavaScript 三种语法,面向大前端开发人员,总有一款适合你。

  2. Chameleon,简写CML,中文意思变色龙,意味着就像变色龙一样能适应不同环境的跨端整体解决方案,达到真正意义上"一套代码,多端运行"的终极目标

  3. Booster 是一款专门为移动应用设计的易用、轻量级且可扩展的质量优化框架,其目标主要是为了解决随着 APP 复杂度的提升而带来的性能、稳定性、包体积等一系列质量问题。Booster 提供了性能检测、多线程优化、资源索引内联、资源去冗余、资源压缩、系统 Bug 修复等一系列功能模块,可以使得稳定性能够提升 15% ~ 25%,包体积可以减小 1MB ~ 10MB。同时DoKit插件的底层也是基于Booster进行开发的。

  4. AoE,一个终端侧AI集成运行时环境

  5. Mand Mobile 一款优秀的面向金融场景的 移动端UI组件库

  6. 我们团队的技术公众号【滴滴OrangeLab】,欢迎关注,我们会在这里持续输出团队内部比较有深度的技术沉淀和经验分享,欢迎一起交流。

协议

Apache-2.0 license

DoKit 基于 Apache-2.0 协议进行分发和使用,更多信息参见 协议文件

Comments
  • aspectjx编译的时候有点问题

    aspectjx编译的时候有点问题

    unable to write compilation result java.util.zip.ZipException: duplicate entry: com/gem/tastyfood/fragments/UserPayPwdSecurityEmailFragment$AjcClosure1.class at java.util.zip.ZipOutputStream.putNextEntry(ZipOutputStream.java:232) at java.util.jar.JarOutputStream.putNextEntry(JarOutputStream.java:109) at org.aspectj.ajdt.internal.core.builder.AjBuildManager$4.writeZipEntry(AjBuildManager.java:1181) at org.aspectj.ajdt.internal.core.builder.AjBuildManager$4.acceptResult(AjBuildManager.java:1118) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.acceptResult(AjPipeliningCompilerAdapter.java:460) at org.aspectj.ajdt.internal.compiler.WeaverAdapter.finishedWith(WeaverAdapter.java:225) at org.aspectj.ajdt.internal.compiler.WeaverAdapter.next(WeaverAdapter.java:130) at org.aspectj.weaver.bcel.BcelWeaver.weave(BcelWeaver.java:1170) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.weaveQueuedEntries(AjPipeliningCompilerAdapter.java:514) at org.aspectj.ajdt.internal.compiler.AjPipeliningCompilerAdapter.afterCompiling(AjPipeliningCompilerAdapter.java:375) at org.aspectj.ajdt.internal.compiler.CompilerAdapter.ajc$afterReturning$org_aspectj_ajdt_internal_compiler_CompilerAdapter$2$f9cc9ca0(CompilerAdapter.java:69) at org.aspectj.org.eclipse.jdt.internal.compiler.Compiler.compile(Compiler.java:471) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performCompilation(AjBuildManager.java:1051) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.performBuild(AjBuildManager.java:274) at org.aspectj.ajdt.internal.core.builder.AjBuildManager.batchBuild(AjBuildManager.java:187) at org.aspectj.ajdt.ajc.AjdtCommand.doCommand(AjdtCommand.java:112) at org.aspectj.ajdt.ajc.AjdtCommand.runCommand(AjdtCommand.java:60) at org.aspectj.tools.ajc.Main.run(Main.java:371) 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.codehaus.groovy.runtime.callsite.PlainObjectMetaMethodSite.doInvoke(PlainObjectMetaMethodSite.java:43) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoCachedMethodSite.invoke(PojoMetaMethodSite.java:190) at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:55) at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:135) at com.hujiang.gradle.plugin.android.aspectjx.internal.AJXTask.call(AJXTask.groovy:99) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745)

    opened by TurboSnails 17
  • 【Android】-最新3.7.1在APG7版本编译不过

    【Android】-最新3.7.1在APG7版本编译不过

    Android 端引入apply plugin: 'com.didi.dokit'后编译不过,报错如下 APG版本:7.1.3 gradle版本:7.3 DOKit版本:3.7.1 错误信息和堆栈信息:

    org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugManifest'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.lambda$executeIfValid$1(ExecuteActionsTaskExecuter.java:145) at org.gradle.internal.Try$Failure.ifSuccessfulOrElse(Try.java:282) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:143) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) 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:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61) Caused by: org.gradle.api.InvalidUserCodeException: Querying the mapped value of property(org.gradle.api.file.RegularFile, property(org.gradle.api.file.RegularFile, property(org.gradle.api.file.RegularFile, map(org.gradle.api.file.RegularFile flatmap(provider(task 'processDetestMainManifest', class com.android.build.gradle.tasks.ProcessApplicationManifest)) check-type())))) before task ':app:processDetestMainManifest' has completed is not supported at org.gradle.api.internal.provider.TransformBackedProvider.lambda$beforeRead$0(TransformBackedProvider.java:84) at org.gradle.api.internal.provider.ValueSupplier$TaskProducer.visitContentProducerTasks(ValueSupplier.java:136) at org.gradle.api.internal.provider.TransformBackedProvider.beforeRead(TransformBackedProvider.java:81) at org.gradle.api.internal.provider.TransformBackedProvider.calculateOwnValue(TransformBackedProvider.java:63) at org.gradle.api.internal.provider.AbstractMinimalProvider.getOrNull(AbstractMinimalProvider.java:93) at com.didiglobal.booster.android.gradle.v7_0.V70.getFinalArtifactFiles(V70.kt:61) at com.didiglobal.booster.android.gradle.v7_0.V70.getMergedManifests(V70.kt:171) at com.didiglobal.booster.gradle.BaseVariantKt.getMergedManifests(BaseVariant.kt:152) at com.didichuxing.doraemonkit.plugin.processor.DoKitPluginConfigProcessor$process$$inlined$let$lambda$1.execute(DoKitPluginConfigProcessor.kt:145) at com.didichuxing.doraemonkit.plugin.processor.DoKitPluginConfigProcessor$process$$inlined$let$lambda$1.execute(DoKitPluginConfigProcessor.kt:31) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:770) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:743) at org.gradle.api.internal.tasks.execution.TaskExecution$2.run(TaskExecution.java:239) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47) at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68) at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:224) at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:207) at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:190) at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:168) at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:89) at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:40) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:53) at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:50) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:50) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:40) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:68) at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:38) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:36) at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41) at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74) at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55) at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51) at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:29) at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:61) at org.gradle.internal.execution.steps.CaptureStateAfterExecutionStep.execute(CaptureStateAfterExecutionStep.java:42) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:60) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:27) at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:188) at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75) at org.gradle.internal.Either$Right.fold(Either.java:175) at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:59) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73) at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:38) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:27) at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:36) at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:22) at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:109) at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:56) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:56) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:73) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:44) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27) at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:89) at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:50) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:114) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:57) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:76) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:50) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:93) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:93) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:43) at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:31) at org.gradle.internal.execution.steps.AssignWorkspaceStep.lambda$execute$0(AssignWorkspaceStep.java:40) at org.gradle.api.internal.tasks.execution.TaskExecution$3.withWorkspace(TaskExecution.java:284) at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:40) at org.gradle.internal.execution.steps.AssignWorkspaceStep.execute(AssignWorkspaceStep.java:30) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:37) at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:27) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:44) at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:33) at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:76) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:142) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:131) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:77) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51) 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:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:204) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:199) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53) at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:74) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:402) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:389) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:382) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:368) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:61)

    opened by weinierfei 16
  • DoKit官方活动:提PR,赢大奖

    DoKit官方活动:提PR,赢大奖

    官方活动:提PR,赢大奖

    各位社区的朋友您们好:

    为了让DoKit开源项目更好更快的发展,希望更多的开发者参与进来,一起经营好这个项目。我们决定发起一个有奖参与的活动。只要给我们提PR,并被我们采纳,就会获得我们提供的精美礼品。

    提交PR的主题可以是以下几项:

    第一、现在一些未解决的issues的处理

    比如 issues105 横屏APP还是有问题

    第二、对于现有功能的一些优化

    第三、提供单独的工具集成到DoKit中

    除了以上我们列出来的一些功能点,如果你在平时有所积累的,符合我们DoKit研发工具的精神的工具也欢迎提交给我们,一起造福于github社区。

    比如QQ群 花裤衩同学提交的load耗时检查就非常棒。

    第四、完成我们提供的指定任务

    任务1:大图检测

    如果app中存在某一张图片过大的话,会浪费用户的流量,也会加载比较慢,影响用户体验。我们就想在开发、测试阶段就把这种图片找出来,替换成轻量级的图片。

    任务2:列表卡顿检测

    列表卡顿也是影响用户体验的主要原因之一。检测生成每一个cell的耗时,也是非常关键的。能够在开发阶段就发现我们哪一些cell是不合格的,需要重新设计的。

    任务3:内存泄漏

    当原来应该被回收的对象,一直占据着内存空间的,使得我们实际使用的空间变小,甚至会产生crash。内存泄漏检测主要就是用来检测这种情况。

    任务4:函数耗时

    分析我们app中每一个方法的耗时,能精确的定位出函数调用栈的耗时,帮助我们快速定位可以优化的方法。

    任务5:iOSUI渲染性能的一些检查

    类似于android的过度绘制检查、或者也可以添加一些iOS自己的检查项,可以参考instruments的一些渲染性能检查项。

    任务6:mock路径

    目前mockGPS只能模拟当前的位置,模拟一整条路径应该如何来做呢?

    获奖方式:

    我们将会评选从今天(2019年4月22号)开始,截止2019年6月22号中所有的PR,按照PR的质量进行评选。

    一等奖5名,奖励滴滴限量版徽章1套 + 电影票一张 + 个人github账号加入到DoKit贡献者名单。

    二等奖10名,奖励滴滴开源卫衣1件 + 电影票一张 + 个人github账号加入到DoKit贡献者名单。

    三等奖15名,奖励电影票一张 + 纪念笔记本一本 + 个人github账号加入到DoKit贡献者名单。

    参与奖10名,奖励纪念笔记本一本。

    参与方式:

    进入官方QQ、联系群主,说明你准备要做的东西,并且留下联系方式。

    提交PR的时候,请备注你的在群内的QQ号。

    奖品如下:

    滴滴限量版徽章

    https://javer.oss-cn-shanghai.aliyuncs.com/2019/1/111.png

    滴滴开源卫衣

    https://javer.oss-cn-shanghai.aliyuncs.com/2019/1/222.png

    笔记本

    https://javer.oss-cn-shanghai.aliyuncs.com/2019/1/333.png

    电影票

    任意热门电影票兑换券(60元以内), 私聊群主,群主给你购买

    任务已经被认领一览,欢迎更多朋友参与(每个任务也可以多人参加,一起共建)

    iOS View Hierarchy功能 : XXEgges iOS 横屏适配 解决issueshttps://github.com/didi/DoraemonKit/issues/105 : Hugin (已经解决) iOS H5任意门支持扫码和历史记录功能 :feng562925462 (已经解决) Android H5任意门支持扫码和历史记录功能 :azhon (已经解决) Android 希望能加一个按照页面进行分类的最高值,最低值、平局值这些数据,对单独页面做分析统计 解决issues141rex26(已经解决) iOS 希望能加一个按照页面进行分类的最高值,最低值、平局值这些数据,对单独页面做分析统计 解决issues141BiBoyang Android 内存泄漏 : pujyzx Android 函数耗时 :pujyzx iOS Bug iPad UI横竖屏幕切换时出现黑框 解决issueshttps://github.com/didi/DoraemonKit/issues/158Hugin(已经解决) Android 支持Mock路径 : Saint2078 iOS 系统12以下修复预览本地视频不能全屏幕播放问题, PR163 : https://github.com/didi/DoraemonKit/pull/163csc-EricWu (已经解决) Android 添加查看当前栈顶Activity的信息。azhon (已经解决) Android 模拟弱网功能 。 dengyuhan (已经解决) iOS 修复浏览沙盒文件不能看到底部文件问题。pr177 : csc-EricWu (已经解决) iOS 大图检测。0xd-cc (已经解决) iOS 添加卡顿时间统计。 志斌_肖 (已经解决) iOS 新增block接入自定义组件的方式。csc-EricWu (已经解决) iOS 模拟弱网功能 。 TYLink iOS 元素边框线优化 。 fabcz (已经完成)

    opened by yixiangboy 13
  • 是否可以提供实时检测,比如我一边操作app,一边看cpu的使用情况或者流量使用情况

    是否可以提供实时检测,比如我一边操作app,一边看cpu的使用情况或者流量使用情况

    Please complete the following informations.

    Expected behavior and actual behavior. Steps to reproduce the problem. Android or iOS? OS version? Brand? More informations such as error messages and stack traces are welcomed.

    请补充如下信息。

    期望的表现和实际的表现。(如有) 问题重现的步骤。(如有) Android 还是 iOS?系统版本是多少?手机品牌是什么?(如有) 其他的错误信息和堆栈信息如果有也可以一并提供出来。(如有)

    todo 
    opened by nealkafuly 13
  • 一个更实用的Hierarchy功能

    一个更实用的Hierarchy功能

    DoKit中的Hierarchy功能并不是很实用,所以我从我的库LLDebugTool中抽离了一个更实用的Hierarchy功能。放在了Core/Plugin/Hierarchy目录下。

    简介

    新增的Hierarchy功能,可以更明显的查看View的Frame等属性,包括选中View的父视图的位置。同时提供一个ViewController用于动态的修改属性,实现的原理就是基于KVC,具体代码在Function/Category/NSObject+DoraemonHierarchy.m。有针对枚举值单独处理,针对枚举值则采用ActionSheet弹窗,其他情况采用Alert的弹窗。

    PS: 提供了我自己库这部分功能的Gif,可以用于参考效果。如果图片不显示,VPN请开全局模式。 preview

    结构

    • Hierarchy / 目录
      • DoraemonHierarchyPlugin / Plugin文件
      • Function / 功能文件
      • UserInterface / 界面文件

    风格

    尽量保持了DoKit的代码风格,区别点如下:

    1. DoraemonHierarchyWindow未采用单例,因为注册了Views,单例会比较难释放对象。
    2. 未采用通用View,而是采用自定义Cell(见UserInterface/Cell),这部分的原因一方面是复用问题,另一方面是因为从别的库中拆出来,所以这里采用Cell的方式改动比较小。
    3. DoraemonMoveView / DoraemonPickerView 属于继承父类,其实可以把他合并到具体的View中,但是在DoKit未发现的类似功能的通用父类,所以这里把这两个文件保留,相当于提供一个意见吧,像拾取器这种,可以做成通用View,也方便其他功能插入。

    具体文件功能

    • DoraemonHierarchyPlugin 插件文件
    • NSObject+DoraemonHierarchy 动态KVC实现文件
    • UIColor+DoraemonHierarchy 针对UIColor描述的文件
    • UIViewController+DoraemonHierarchy 用于弹窗
    • DoraemonEnumDescription 枚举值描述文件
    • DoraemonHierarchyFormatterTool 日期、数字格式化单例
    • DoraemonHierarchyHelper 功能入口,用于持有window和获取Application结构
    • DoraemonHierarchyWindow Hierarchy功能Window, level 在 entry之上
    • DoraemonHierarchyViewController DoraemonHierarchyWindow的rootViewController,用于持有PickerViewInfoView
    • DoraemonHierarchyDetailViewController 属性详情视图,KVC入口视图,由DoraemonHierarchyViewController present进入
    • DoraemonHierarchyInfoView/DoraemonHierarchyPickerView 为DoraemonHierarchyViewController中选择控件和显示属性控件
    • DoraemonHierarchyHeaderView tableView中SectionHeaderView
    • DoraemonHierarchy******Cell DoraemonHierarchyDetailViewController中cell样式集合
    • DoraemonHierarchy******Model 数据模型
    • DoraemonHierarchyTableViewController/DoraemonMoveView/DoraemonPickerView 为父类

    其他修改点

    • 新增了8张(4组)图片在Resource目录下,文件名前缀为doraemon_hierarchy
    • 修改了Doraemon.strings,新增了UI结构关键字
    • 修改了DoraemonManager,增加了新的枚举值,并将新的功能添加到主页上

    未完成部分

    1. 基本完全区别旧的Hierarchy功能,我个人推荐是取代旧的Hierarchy功能,当然具体的集成情况还是看你们如何集成,此次的PR未修改旧的hierarch,而是新增一个枚举值DoraemonManagerPluginType_DoraemonHierarchyPlugin
    2. 图片和标题还需要你们处理一下,毕竟图片也需要统一风格。
    opened by HDB-Li 12
  • flutter版本dokit: 0.8.0-nullsafety.0空安全适配问题

    flutter版本dokit: 0.8.0-nullsafety.0空安全适配问题

    flutter-2.5.1/.pub-cache/hosted/pub.flutter-io.cn/dokit-0.8.0-nullsafety.0/lib/engine/dokit_http.dart:77:27: Error: A value of type 'Future Function(Uri, String, String)?' can't be assigned to a variable of type 'Future Function(Uri, String, String?)?' because 'String?' is nullable and 'String' isn't.

    • 'Future' is from 'dart:async'.
    • 'Uri' is from 'dart:core'. origin.authenticate = f; ^ fluttersdk/flutter-2.5.1/.pub-cache/hosted/pub.flutter-io.cn/dokit-0.8.0-nullsafety.0/lib/engine/dokit_http.dart:84:32: Error: A value of type 'Future Function(String, int, String, String)?' can't be assigned to a variable of type 'Future Function(String, int, String, String?)?' because 'String?' is nullable and 'String' isn't.
    • 'Future' is from 'dart:async'. origin.authenticateProxy = f; ^
    opened by niumenglin 9
  • 统计app信息到滴滴服务器上不太合适吧

    统计app信息到滴滴服务器上不太合适吧

    Please complete the following informations.

    Expected behavior and actual behavior. Steps to reproduce the problem. Android or iOS? OS version? Brand? More informations such as error messages and stack traces are welcomed.

    请补充如下信息。

    期望的表现和实际的表现。(如有) 问题重现的步骤。(如有) Android 还是 iOS?系统版本是多少?手机品牌是什么?(如有) 其他的错误信息和堆栈信息如果有也可以一并提供出来。(如有)

    opened by jseanj 9
  • DoraemonInterceptor 拦截器报错

    DoraemonInterceptor 拦截器报错

    java.lang.IllegalStateException: cannot make a new request because the previous response is still open: please call response.close() at okhttp3.internal.connection.Transmitter.newExchange(Transmitter.java:164) at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:41) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:94) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:88) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.DoraemonInterceptor.intercept(DoraemonInterceptor.java:81) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.LargePictureInterceptor.intercept(LargePictureInterceptor.java:29) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at com.didichuxing.doraemonkit.kit.network.okhttp.interceptor.MockInterceptor.intercept(MockInterceptor.java:49) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:142) at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:117) at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:229) at okhttp3.RealCall$AsyncCall.execute(RealCall.java:172) at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1167) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641) at java.lang.Thread.run(Thread.java:764)

    opened by winchances 8
  • 接口mock失败?

    接口mock失败?

    请补充如下信息。

    期望的表现和实际的表现。(如有) 已经添加产品和新建接口,有两个场景且规定好json格式数据 但好像没有拦截成功,插件已经映入了 问题重现的步骤。(如有) Android 还是 iOS?系统版本是多少?手机品牌是什么?(如有) Android 其他的错误信息和堆栈信息如果有也可以一并提供出来。(如有) 最好给我们提供可以复现问题的Demo

    opened by qtybpg 8
  • 开启流量拦截后某些图片无法下载报错

    开启流量拦截后某些图片无法下载报错

    Please complete the following informations.

    Expected behavior and actual behavior. Steps to reproduce the problem. Android or iOS? OS version? Brand? More informations such as error messages and stack traces are welcomed.

    请补充如下信息。

    期望的表现和实际的表现。(如有)开启抓包功能可以下载图片 问题重现的步骤。(如有) 开启抓包流程后,发现某些图片无法下载,最后定位到RealInterceptorChain中抛出了异常 如图 download

    Android 还是 iOS?系统版本是多少?手机品牌是什么?(如有) Android 其他的错误信息和堆栈信息如果有也可以一并提供出来。(如有)

    下载图片使用的是 HttpUrlConnection 我看到开启抓包后使用了 ObsoleteUrlFactory里面注入的 okhttp实现的HttpUrlConnection

    opened by zyallday 8
  • Type com.google.gson.FieldNamingPolicy is defined multiple times

    Type com.google.gson.FieldNamingPolicy is defined multiple times

    Please complete the following informations.

    Expected behavior and actual behavior. Steps to reproduce the problem. Android or iOS? OS version? Brand? More informations such as error messages and stack traces are welcomed.

    请补充如下信息。

    期望的表现和实际的表现。(如有) 问题重现的步骤。(如有) Android 还是 iOS?系统版本是多少?手机品牌是什么?(如有) 其他的错误信息和堆栈信息如果有也可以一并提供出来。(如有) 最好给我们提供可以复现问题的Demo

    1.Android10系统,华为P30 gradle版本4.0.1 2.编译没问题,运行报错。 3.只集成了 debugApi 'com.didichuxing.doraemonkit:doraemonkit:3.2.0' releaseApi 'com.didichuxing.doraemonkit:doraemonkit-no-op:3.2.0' debugApi 'com.didichuxing.doraemonkit:doraemonkit-weex:3.2.0' 4.日志信息如下: image

    opened by liuleshuai 7
  • 【Flutter】- Andorid端连不上上VM,Windows端可以

    【Flutter】- Andorid端连不上上VM,Windows端可以

    flutter 本地环境
      [√] Flutter (Channel stable, 3.3.10, on Microsoft Windows [版本 10.0.22621.1037], locale zh-CN)
          • Flutter version 3.3.10 on channel stable at C:\Tools\flutter
          • Upstream repository https://github.com/flutter/flutter.git
          • Framework revision 135454af32 (2 weeks ago), 2022-12-15 07:36:55 -0800
          • Engine revision 3316dd8728
          • Dart version 2.18.6
          • DevTools version 2.15.0
          • Pub download mirror http://192.168.2.186:4001
          • Flutter download mirror https://storage.flutter-io.cn
      
      [√] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
          • Android SDK at C:\Tools\AndroidSDK
          • Platform android-33, build-tools 33.0.0
          • ANDROID_HOME = C:\Tools\AndroidSDK
          • Java binary at: C:\Tools\ToolboxApps\apps\AndroidStudio\ch-0\213.7172.25.2113.9123335\jre\bin\java
          • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
          • All Android licenses accepted.
      
      [X] Chrome - develop for the web (Cannot find Chrome executable at .\Google\Chrome\Application\chrome.exe)
          ! Cannot find Chrome. Try setting CHROME_EXECUTABLE to a Chrome executable.
      
      [√] Visual Studio - develop for Windows (Visual Studio Community 2022 17.3.1)
          • Visual Studio at C:\Tools\VSstudioIDEA
          • Visual Studio Community 2022 version 17.3.32811.315
          • Windows 10 SDK version 10.0.19041.0
      
      [√] Android Studio (version 2021.2)
          • Android Studio at C:\Tools\ToolboxApps\apps\AndroidStudio\ch-0\212.5712.43.2112.8815526
          • Flutter plugin version 71.0.3
          • Dart plugin version 213.7433
          • Java version OpenJDK Runtime Environment (build 11.0.12+7-b1504.28-7817840)
      
      [√] Android Studio (version 2021.3)
          • Android Studio at C:\Tools\ToolboxApps\apps\AndroidStudio\ch-0\213.7172.25.2113.9123335
          • Flutter plugin installed
          • Dart plugin version 212.5744
          • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
      
      [√] IntelliJ IDEA Community Edition (version 2022.2)
          • IntelliJ at C:\Tools\ToolboxApps\apps\IDEA-C\ch-0\222.4345.14
          • Flutter plugin can be installed from:
             https://plugins.jetbrains.com/plugin/9212-flutter
          • Dart plugin can be installed from:
             https://plugins.jetbrains.com/plugin/6351-dart
      
      [√] Connected device (4 available)
          • SM G988N (mobile) • 127.0.0.1:5555 • android-x86    • Android 7.1.2 (API 25)
          • SM G988N (mobile) • emulator-5554  • android-x86    • Android 7.1.2 (API 25)
          • Windows (desktop) • windows        • windows-x64    • Microsoft Windows [版本 10.0.22621.1037]
          • Edge (web)        • edge           • web-javascript • Microsoft Edge 108.0.1462.54
      
      [√] HTTP Host Availability
          • All required HTTP hosts are available  
    
    

    我使用Android和手机端分别运行使用了dokit插件的同一套代码,而手机端总会在连接时报错
    https://github.com/didi/DoKit/blob/b89f86c936ab274f11f734c6ac30587a91e58657/Flutter/lib/kit/apm/vm/vm_service_wrapper.dart#L27

    然而 Service.Getinfo() 返回的路由是http://127.0.0.1:xxxx,所以Android端连不上,不知道我这样理解对不对,有没有办法解决呢?

    感谢!!!

    opened by SakurasDuck 0
  • 【DoKit生态场景】- Android添加流量监控以及其他AOP功能时编译不通过

    【DoKit生态场景】- Android添加流量监控以及其他AOP功能时编译不通过

    引入com.didi.dokit插件和dokitExt设置时,release下混淆默认时打开的,这时编译会不通过,关闭混淆或者移除com.didi.dokit插件和dokitExt脚本就可以正常运行,编译不通过的错误如下:

    Illegal invoke-super to boolean android.app.Activity.dispatchKeyEvent(android.view.KeyEvent) Stack trace: com.android.tools.r8.errors.a: Illegal invoke-super to boolean android.app.Activity.dispatchKeyEvent(android.view.KeyEvent) at com.android.tools.r8.graph.N0$j.a(:62) at com.android.tools.r8.graph.N0$j.d(:2) at com.android.tools.r8.shaking.Enqueuer.markSuperMethodAsReachable(:16) at com.android.tools.r8.shaking.EnqueuerWorklist$MarkReachableSuperAction.run(:1) at com.android.tools.r8.shaking.Enqueuer.trace(:9) at com.android.tools.r8.shaking.Enqueuer.traceApplication(:5) at com.android.tools.r8.R8.a(:1228) at com.android.tools.r8.R8.a(:119) at com.android.tools.r8.R8.c(:1) at com.android.tools.r8.R8.b(:1) at com.android.tools.r8.utils.W.a(:30) at com.android.tools.r8.R8.a(:28) at com.android.tools.r8.R8.run(:3) at com.android.builder.dexing.R8Tool.runR8(r8Tool.kt:247) at com.android.build.gradle.internal.tasks.R8Task$Companion.shrink(R8Task.kt:472) at com.android.build.gradle.internal.tasks.R8Task.doTaskAction(R8Task.kt:334) at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:74) at com.android.build.gradle.internal.tasks.NonIncrementalTask$taskAction$$inlined$recordTaskAction$1.invoke(AndroidVariantTask.kt:34) at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:91) at com.android.build.gradle.internal.tasks.NonIncrementalTask.taskAction(NonIncrementalTask.kt:57) at jdk.internal.reflect.GeneratedMethodAccessor14684.invoke(Unknown Source) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:566) at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:104) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:49) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:42) at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:727) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:694) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$3.run(ExecuteActionsTaskExecuter.java:568) 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:553) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:536) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$300(ExecuteActionsTaskExecuter.java:109) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.executeWithPreviousOutputFiles(ExecuteActionsTaskExecuter.java:276) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:265) at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$1(ExecuteStep.java:33) at java.base/java.util.Optional.orElseGet(Optional.java:369) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:33) at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26) at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:63) at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:49) at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:34) at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:43) 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:34) at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:44) at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:54) at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:38) at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49) at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:153) at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:67) at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:41) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:44) at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:33) 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:92) at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:85) at java.base/java.util.Optional.map(Optional.java:265) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:55) at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:39) at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:76) 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:94) at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:49) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:79) at org.gradle.internal.execution.steps.CaptureStateBeforeExecutionStep.execute(CaptureStateBeforeExecutionStep.java:53) at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:74) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.lambda$execute$2(SkipEmptyWorkStep.java:78) at java.base/java.util.Optional.orElseGet(Optional.java:369) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:78) at org.gradle.internal.execution.steps.SkipEmptyWorkStep.execute(SkipEmptyWorkStep.java:34) at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:39) at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:40) at org.gradle.internal.execution.steps.LoadExecutionStateStep.execute(LoadExecutionStateStep.java:28) at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:192) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:184) at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:109) at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:62) 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:77) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55) at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52) 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:52) at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:41) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:372) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:359) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:352) at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:338) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.lambda$run$0(DefaultPlanExecutor.java:127) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:191) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:182) at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:124) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:48) at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128) at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628) at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:56) at java.base/java.lang.Thread.run(Thread.java:829)

    求大佬解答

    opened by Jeremyzwc 0
  • Fix/log lost

    Fix/log lost

    • 在串行队列中添加删除log数据,防止多线程读写

    • 读取log数据返回NSArray而不是NSMutableArray,修复DoraemonNSLogListViewController对log进行reverseObjectEnumerator时修改数据源,导致数据丢失问题。 参考:https://developer.apple.com/documentation/foundation/nsarray/1415734-reverseobjectenumerator#:~:text=When%20you%20use%20this%20method%20with%20mutable%20subclasses%20of%20NSArray%2C%20you%20must%20not%20modify%20the%20array%20during%20enumeration.

    opened by limingmingzerozero 0
Releases(3.1.3)
Owner
DiDi
滴滴出行
DiDi