chuckerteam / chucker Goto Github PK
View Code? Open in Web Editor NEW🔎 An HTTP inspector for Android & OkHTTP (like Charles but on device)
License: Apache License 2.0
🔎 An HTTP inspector for Android & OkHTTP (like Charles but on device)
License: Apache License 2.0
Describe the bug
Failed to resolve: com.github.chuckerteam.chucker:library:2.0.4
2.0.3 is ok
Is your feature request related to a problem? Please describe.
Chucker should provide a way to show the Cookies that are sent for every request.
Describe the solution you'd like
Ideally having a separated tab for cookies would be helpful. As a MVP having them listed below the headers would be a good starting point.
Do you want to develop this feature yourself?
nop :) It's open for development
Hi, I would love to have a way to set Chuck's notification priority to NotificationCompat.PRIORITY_MIN (https://stackoverflow.com/a/16999675) so that Android can hide it from the status bar (it gets pretty annoying otherwise, for someone using a debug app all day :)).
Let me know if this sounds good. I can take a shot at this, this weekend.
Is your feature request related to a problem? Please describe.
In Chuck the only way to get a log of the requests was through reflection for the Db open helper.
It would be very useful to add a way to obtain the records to export a trace
Describe the solution you'd like
Add to Chucker a method to query the logs and get a list of http or error logs.
Describe the bug
Because the image data is stored in database, if an image is too big, it crashes
To Reproduce
Steps to reproduce the behavior:
Expected behavior
Chucker should work
Chucker is crashing with these crash logs when clicked on the notification. It is working fine in the debug build when proguard is not enabled but crashing when the proguard is enabled.
2019-11-26 17:39:06.222 18381-18381/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.gojek.driver.bike.staging, PID: 18381
android.view.InflateException: Binary XML file line #17: Binary XML file line #17: Error inflating class
Caused by: android.view.InflateException: Binary XML file line #17: Error inflating class
Caused by: java.lang.reflect.InvocationTargetException
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
at android.view.LayoutInflater.createView(LayoutInflater.java:647)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:790)
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:730)
at android.view.LayoutInflater.inflate(LayoutInflater.java:492)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at dark.Ɨſ.onCreateView(:65)
at dark.ιʟ.performCreateView(:2439)
at dark.Іɹ.ˊ(:1460)
at dark.Іɹ.ॱॱ(:1784)
at dark.Іɹ.ॱ(:1852)
at dark.ϙ.ॱॱ(:802)
at dark.Іɹ.ˋ(:2625)
at dark.Іɹ.ˊ(:2411)
at dark.Іɹ.ˋ(:2366)
at dark.Іɹ.ˏ(:2243)
at dark.ϙ.ʼ(:654)
at dark.іɹ.finishUpdate(:146)
at dark.ɨӏ.ˊ(:1244)
at dark.ɨӏ.ˏ(:1092)
at dark.ɨӏ.onMeasure(:1622)
at android.view.View.measure(View.java:23355)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23355)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at dark.ɩı.onMeasure(:143)
at android.view.View.measure(View.java:23355)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23355)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23355)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23355)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6758)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:717)
at android.view.View.measure(View.java:23355)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2919)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1749)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2042)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1637)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7797)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1172)
at android.view.Choreographer.doCallbacks(Choreographer.java:984)
at android.view.Choreographer.doFrame(Choreographer.java:809)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1158)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6898)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-11-26 17:39:06.222 18381-18381/? E/AndroidRuntime: Caused by: java.lang.IllegalStateException: Binary XML file line #17: Unable to find LayoutManager dark.LinearLayoutManager
at dark.ιɍ.ˊ(:810)
at dark.ιɍ.(:713)
at dark.ιɍ.(:647)
... 65 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "dark.LinearLayoutManager" on path: DexPathList[[zip file "/system/framework/org.apache.http.legacy.boot.jar", zip file "/data/app/com.gojek.driver.bike.staging-QEokmeEQhz6U6wW5zueoIg==/base.apk"],nativeLibraryDirectories=[/data/app/com.gojek.driver.bike.staging-QEokmeEQhz6U6wW5zueoIg==/lib/arm64, /data/app/com.gojek.driver.bike.staging-QEokmeEQhz6U6wW5zueoIg==/base.apk!/lib/arm64-v8a, /system/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:134)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
at dark.ιɍ.ˊ(:791)
... 67 more
Is your feature request related to a problem? Please describe.
PR #70 (relating to issue #69) adds support for GraphQL by detecting an operation name field in the request. I believe that there are additional nuances to GraphQL we should address before calling our support "complete"
Additional context
PR #70 attempts to parse plain text requests to detect a operationName
field and if present, the GUI receives the GraphQL icon. It looks like there are several cases where an operationName
will be absent, but we would want to include the icon.
http://myapi/graphql?query={me{name}}
is valid GraphQLIf the query contains several named operations, an operationName query parameter can be used to control which one should be executed
If the "query" query string parameter is present (as in the GET example above), it should be parsed and handled in the same way as the HTTP GET case.
If the "application/graphql" Content-Type header is present, treat the HTTP POST body contents as the GraphQL query string.
Describe the solution you'd like
GraphQL (like SOAP before it) exposes a single HTTP endpoint, perhaps we could register that with the ChuckerInterceptor
and avoid introspecting the request looking for an operation name?
Also, we parse the request with GSON for all outgoing network calls, in-line with the actual network call. Knowing that a particular URL is a non-GraphQL endpoint would allow us to skip this step. Perhaps we could defer this work to the HttpTransactionDatabaseRepository
as we will be on a background thread away from the actual network call?
Do you want to develop this feature yourself?
I could easily see several user stories to extend the GraphQL support, each of which would add value and could be independently worked by people. I would be happy to work with you on coming up with several new issues, and would also be glad to work on any of them.
Describe the bug
When tapping the clear / notification item to clear / open the chucker activity, it crashses instead.
To Reproduce
Steps to reproduce the behavior:
Smartphone
java.lang.IllegalStateException: You can't access the transaction repository if you don't initialize it! at com.chuckerteam.chucker.api.internal.data.repository.RepositoryProvider.transaction(RepositoryProvider.kt:16) at com.chuckerteam.chucker.api.internal.support.ClearTransactionsService.onHandleIntent(ClearTransactionsService.java:25) at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:68) at android.os.Handler.dispatchMessage(Handler.java:105) at android.os.Looper.loop(Looper.java:169) at android.os.HandlerThread.run(HandlerThread.java:65)
java.lang.IllegalStateException: You can't access the transaction repository if you don't initialize it! at com.chuckerteam.chucker.api.internal.data.repository.RepositoryProvider.transaction(RepositoryProvider.kt:16) at com.chuckerteam.chucker.api.internal.ui.transaction.TransactionListFragment.getDataSource(TransactionListFragment.java:136) at com.chuckerteam.chucker.api.internal.ui.transaction.TransactionListFragment.onAttach(TransactionListFragment.java:81) at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1404) at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1195)
App crash because null exception
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String com.chuckerteam.chucker.api.internal.data.entity.HttpTransaction.getNotificationText()' on a null object reference
at com.chuckerteam.chucker.api.internal.support.NotificationHelper.show + 96(NotificationHelper.java:96)
at com.chuckerteam.chucker.api.ChuckerCollector.onResponseReceived$library_release + 66(ChuckerCollector.kt:66)
at com.chuckerteam.chucker.api.ChuckerInterceptor.intercept + 138(ChuckerInterceptor.kt:138)
at okhttp3.internal.http.RealInterceptorChain.proceed + 112(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed + 87(RealInterceptorChain.kt:87)
at okhttp3.logging.HttpLoggingInterceptor.intercept + 215(HttpLoggingInterceptor.kt:215)
at okhttp3.internal.http.RealInterceptorChain.proceed + 112(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed + 87(RealInterceptorChain.kt:87)
at com.happyfresh.snowflakes.hoverfly.interceptors.ClientInterceptor.intercept + 60(ClientInterceptor.kt:60)
at okhttp3.internal.http.RealInterceptorChain.proceed + 112(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed + 87(RealInterceptorChain.kt:87)
at okhttp3.RealCall.getResponseWithInterceptorChain + 184(RealCall.kt:184)
at okhttp3.RealCall$AsyncCall.run + 136(RealCall.kt:136)
at java.util.concurrent.ThreadPoolExecutor.runWorker + 1167(ThreadPoolExecutor.java:1167)
at java.util.concurrent.ThreadPoolExecutor$Worker.run + 641(ThreadPoolExecutor.java:641)
at java.lang.Thread.run + 764(Thread.java:764)
I spent some time learning about the Ktor HTTP client recently, porting the HttpBinClient
and HttpBinApi
to the Ktor HTTP client as a learning exercise for myself.
In the process I was happy to find that Chucker works perfectly with the Ktor HTTP client when configured to use the OkHttp
engine -
private val httpClient = HttpClient(OkHttp) {
install(JsonFeature) {
serializer = GsonSerializer()
}
engine {
addInterceptor(chuckerInterceptor)
addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))
config {
followRedirects(true)
readTimeout(30, TimeUnit.SECONDS)
connectTimeout(30, TimeUnit.SECONDS)
callTimeout(30, TimeUnit.SECONDS)
}
}
}
👍 Great work all!
Describe the bug
Update dependency from Chuck to Chucker, the database is not updated. So the RecordedThrowable
table is not created, the lib crash when trying to read/write in it.
Expected behavior
Update the database and its table when migrating to Chucker.
Some of the backends I work with send really large amounts of data.
Here is a sample: https://data.cityofnewyork.us/api/views/kku6-nxdu/rows.json
Moving from the request to response tab is slow, and trying to "Share as text" is also impossible. It'd be great to keep this on the roadmap for improvement.
Edit: Occurs in latest stable and beta
Edit 2: Maybe just show the first x amount of lines, but still provide a way to export or view the json as a file?
Describe the bug
Just got this failure report from Travis: https://travis-ci.org/ChuckerTeam/chucker/builds/461529966
Opening this issue to track the failure. I'm currently investigating.
Pretty sure Chuck did formatted JSON output but Chucker appears to be a compact format sans any white space / line feeds. Makes the output much harder to read.
Would love to have the option to show RESPONSE area pretty printed. Seems maybe it is pretty printed for small payloads and not for larger ones (could be the way our server sends it as well).
Is your feature request related to a problem? Please describe.
Currently, when opening the Chucker activity, the HTTP and Error tab are completely blank and empty when there is no request or no error to display.
Describe the solution you'd like
Each empty tab is a wasted opportunity to educate users about how to use chucker.
Alternative suggestions welcome :-)
Additional context
Chucker users will probably know how to use the ChuckerInterceptor: it's well documented, the "Getting Started 👣" section of the README.md describe how to use it. The Error tab is a more hidden feature (one has to read more of the readme :-P and nobody got time for that)
Do you want to develop this feature yourself?
[yes]
If the artifact is hosted on https://jitpack.io/, we could have security concerns. I know that it could be painful to get it work for the first time. We could leverage the plugin here https://github.com/vanniktech/gradle-maven-publish-plugin to minimize our effort.
Build failed after adding dependencies like this:
build.gradle (project)
allprojects {
repositories {
google()
jcenter()
maven { url "https://repo.eclipse.org/content/repositories/paho-snapshots/" }
maven { url "https://jitpack.io" }
}
}
build.gradle (app)
dependencies {
...
debugImplementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1"
}
Android Studio 3.5
Build #AI-191.8026.42.35.5791312, built on August 9, 2019
JRE: 1.8.0_202-release-1483-b49-5587405 x86_64
JVM: OpenJDK 64-Bit Server VM by JetBrains s.r.o
macOS 10.14.6
rg.gradle.internal.exceptions.LocationAwareException: Execution failed for task ':app:processDebugResources'.
at org.gradle.initialization.exception.DefaultExceptionAnalyser.transform(DefaultExceptionAnalyser.java:99)
at org.gradle.initialization.exception.DefaultExceptionAnalyser.collectFailures(DefaultExceptionAnalyser.java:65)
at org.gradle.initialization.exception.MultipleBuildFailuresExceptionAnalyser.transform(MultipleBuildFailuresExceptionAnalyser.java:39)
at org.gradle.initialization.exception.StackTraceSanitizingExceptionAnalyser.transform(StackTraceSanitizingExceptionAnalyser.java:29)
at org.gradle.initialization.DefaultGradleLauncher.finishBuild(DefaultGradleLauncher.java:174)
at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:165)
at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:134)
at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:58)
at org.gradle.internal.invocation.GradleBuildController$1.execute(GradleBuildController.java:55)
at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:82)
at org.gradle.internal.invocation.GradleBuildController$3.create(GradleBuildController.java:75)
at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:183)
at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:40)
at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:75)
at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:55)
at org.gradle.tooling.internal.provider.runner.BuildModelActionRunner.run(BuildModelActionRunner.java:54)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:58)
at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:39)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:49)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.call(RunAsBuildOperationBuildActionRunner.java:44)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:315)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:44)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:49)
at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:46)
at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:78)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:46)
at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:31)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:42)
at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:28)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:78)
at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:52)
at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:59)
at org.gradle.tooling.internal.provider.SubscribableBuildActionExecuter.execute(SubscribableBuildActionExecuter.java:36)
at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:68)
at org.gradle.tooling.internal.provider.SessionScopeBuildActionExecuter.execute(SessionScopeBuildActionExecuter.java:38)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:37)
at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:26)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:60)
at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:32)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:55)
at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:41)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:48)
at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:32)
at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:37)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
at org.gradle.util.Swapper.swap(Swapper.java:38)
at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:62)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:81)
at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104)
at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:295)
at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
Caused by: org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:processDebugResources'.
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:95)
at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:91)
at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57)
at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:119)
at org.gradle.api.internal.tasks.execution.ResolvePreviousStateExecuter.execute(ResolvePreviousStateExecuter.java:43)
at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:93)
at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:45)
at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:94)
at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:56)
at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:55)
at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:67)
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:315)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:305)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:101)
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)
... 3 more
Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed
/Users/andrey/.gradle/caches/transforms-2/files-2.1/933dfe73c201990f7e902c4a956f1aef/res/values-v28/values-v28.xml:9:5-12:13: AAPT: error: resource android:attr/dialogCornerRadius not found.
/Users/andrey/Documents/StudioProjects/android-terminal-development/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml:11: AAPT: error: resource android:attr/dialogCornerRadius not found.
/Users/andrey/.gradle/caches/transforms-2/files-2.1/54606f416f13842dfa024422a8fd0b6d/res/values/values.xml:161:5-202: AAPT: error: resource android:attr/fontVariationSettings not found.
/Users/andrey/.gradle/caches/transforms-2/files-2.1/54606f416f13842dfa024422a8fd0b6d/res/values/values.xml:161:5-202: AAPT: error: resource android:attr/ttcIndex not found.
error: failed linking references.
at com.android.builder.internal.aapt.v2.Aapt2Exception$Companion.create(Aapt2Exception.kt:45)
at com.android.builder.internal.aapt.v2.Aapt2Exception$Companion.create$default(Aapt2Exception.kt:39)
at com.android.build.gradle.internal.res.Aapt2ErrorUtils.rewriteException(Aapt2ErrorUtils.kt:97)
at com.android.build.gradle.internal.res.Aapt2ErrorUtils.rewriteLinkException(Aapt2ErrorUtils.kt:73)
at com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$AaptSplitInvoker.invokeAaptForSplit(LinkApplicationAndroidResourcesTask.kt:808)
at com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$AaptSplitInvoker.run(LinkApplicationAndroidResourcesTask.kt:669)
at com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask.doFullTaskAction(LinkApplicationAndroidResourcesTask.kt:262)
at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:47)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$2.run(ExecuteActionsTaskExecuter.java:284)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:301)
at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:293)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:175)
at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:91)
at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:273)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:258)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:67)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:145)
at org.gradle.internal.execution.impl.steps.ExecuteStep.execute(ExecuteStep.java:49)
at org.gradle.internal.execution.impl.steps.CancelExecutionStep.execute(CancelExecutionStep.java:34)
at org.gradle.internal.execution.impl.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:69)
at org.gradle.internal.execution.impl.steps.TimeoutStep.execute(TimeoutStep.java:49)
at org.gradle.internal.execution.impl.steps.CatchExceptionStep.execute(CatchExceptionStep.java:33)
at org.gradle.internal.execution.impl.steps.CreateOutputsStep.execute(CreateOutputsStep.java:50)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:43)
at org.gradle.internal.execution.impl.steps.SnapshotOutputStep.execute(SnapshotOutputStep.java:29)
at org.gradle.internal.execution.impl.steps.CacheStep.executeWithoutCache(CacheStep.java:134)
at org.gradle.internal.execution.impl.steps.CacheStep.lambda$execute$3(CacheStep.java:83)
at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:82)
at org.gradle.internal.execution.impl.steps.CacheStep.execute(CacheStep.java:36)
at org.gradle.internal.execution.impl.steps.PrepareCachingStep.execute(PrepareCachingStep.java:33)
at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:38)
at org.gradle.internal.execution.impl.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:23)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:52)
at org.gradle.internal.execution.impl.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)
at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:34)
at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:91)
... 32 more
Caused by: com.android.builder.internal.aapt.v2.Aapt2Exception: Android resource linking failed
/Users/andrey/Documents/StudioProjects/android-terminal-development/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml:7: error: resource android:attr/dialogCornerRadius not found.
/Users/andrey/Documents/StudioProjects/android-terminal-development/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values-v28/values-v28.xml:11: error: resource android:attr/dialogCornerRadius not found.
/Users/andrey/Documents/StudioProjects/android-terminal-development/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:4666: error: resource android:attr/fontVariationSettings not found.
/Users/andrey/Documents/StudioProjects/android-terminal-development/app/build/intermediates/incremental/mergeDebugResources/merged.dir/values/values.xml:4667: error: resource android:attr/ttcIndex not found.
error: failed linking references.
at com.android.builder.internal.aapt.v2.Aapt2Exception$Companion.create(Aapt2Exception.kt:45)
at com.android.builder.internal.aapt.v2.Aapt2Exception$Companion.create$default(Aapt2Exception.kt:39)
at com.android.builder.internal.aapt.v2.Aapt2DaemonImpl.doLink(Aapt2DaemonImpl.kt:191)
at com.android.builder.internal.aapt.v2.Aapt2Daemon.link(Aapt2Daemon.kt:103)
at com.android.builder.internal.aapt.v2.Aapt2DaemonManager$LeasedAaptDaemon.link(Aapt2DaemonManager.kt:176)
at com.android.builder.core.AndroidBuilder.processResources(AndroidBuilder.java:858)
at com.android.build.gradle.internal.res.LinkApplicationAndroidResourcesTask$AaptSplitInvoker.invokeAaptForSplit(LinkApplicationAndroidResourcesTask.kt:797)
... 70 more
I notice that you have an 'updated-deps' branch out there, and there's a general move toward modernizing the codebase with Kotlin. How do you feel about moving over to using Android Jetpack androidx
for AppCompatActivity, Fragments, etc?
Do you want to develop this feature yourself?
Happy to, yes.
Describe the bug
Looks like the version on development
right now has a bug where several paths will be displayed with a null
attached at the end.
To Reproduce
Steps to reproduce the behavior:
development
Do HTTP Activity
Expected behavior
The null
should not be displayed in the path if the query is missing.
Is your feature request related to a problem? Please describe.
I don’t know the details at first glance. Because every request is a POST method to /graphql
ex)
Describe the solution you'd like
I want to change POST /graphql
to used Query or Mutation name
Describe alternatives you've considered
Add processing to change the string in TransactionAdapter class when endpoint equals /graphql
If there are other good ways, please suggest 🙏
ref: https://graphql.org/learn/serving-over-http/#uris-routes
Do you want to develop this feature yourself?
yes
Hi, when I add the library to the app/build.gradle
file:
debugImplementation "com.github.ChuckerTeam.Chucker:library:3.0.1"
releaseImplementation "com.github.ChuckerTeam.Chucker:library-no-op:3.0.1"
I get the following build error:
Execution failed for task ':app:mergeDebugJavaResource'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> More than one file was found with OS independent path 'META-INF/library_release.kotlin_module'
Indeed, I have 2 libraries with this file, one of them is chucker:
There is a way to fix this with packagingOptions
:
packagingOptions {
exclude 'META-INF/library_release.kotlin_module'
}
However it seems that the root cause can be solved on the library, which is better because it avoids having everyone to add the exclude fix:
Takhion/android-extras-delegates#1
kosi-libs/Kodein#138
Would be nice if this was fixed at the library :)
I used ChuckInterceptor on FAN and can't upload file via multipart.
val okHttpClient = OkHttpClient().newBuilder()
.connectTimeout(120, TimeUnit.SECONDS)
.readTimeout(120, TimeUnit.SECONDS)
.addInterceptor(ChuckerInterceptor(this))
.writeTimeout(120, TimeUnit.SECONDS)
.build()
AndroidNetworking.initialize(applicationContext, okHttpClient)
Remove Interceptor is worked fine.
This will break with OkHttp 4
See jgilfelt/chuck#88
希望可以支持中文,虽然东西都挺简单 ,还是希望国际化一下。
Please do provide url encode and decode for api request
Chucker omits null values when they are set explicitly.
Here is my retrofit service:
interface MyService {
//JSON:
// {
// "person": "Hi Chucker"
// }
@GET("5d4d9ebf3300003e3a33792e?mocky-delay=1000ms")
fun getPersonValid(): Call<Person>
//JSON:
// {
//
// }
@GET("5d4d9f4f330000254b337934?mocky-delay=1000ms")
fun getPersonMissing(): Call<Person>
//JSON:
// {
// "person": null
// }
@GET("5d4da01d3300004b4433793d?mocky-delay=1000ms")
fun getPersonExplicitNull(): Call<Person>
}
I would expect the json in chucker to match the JSON outlined in the comments. But when a person is sent back from the server that is explicitly null, it just shows an {}
which is misleading.
Describe the solution you'd like
Also show images in response tab:)
Describe the bug
I can search in response, but not in request body.
To Reproduce
Steps to reproduce the behavior:
Expected behavior
There is a working magnifying class icon for searching in request body, same as in response tab.
Smartphone
The beta shows
"AppName • 0 • Now"
vs the stable showing
"AppName • 1 • Now"
Looks like the count isn't incrementing in the beta vs stable.
Screenshots need to be recorded for Chucker with 2.0.x improvments.
Describe the bug
LeakCanary reports a leak of MainActivity
. I've been able to reproduce it in my own application and in the sample app. It doesn't matter if there are captured network requests or not.
To Reproduce
Steps to reproduce the behavior using the sample app:
Screenshots
LeakCanary result in logcat:
┬
├─ android.app.Activity$1
│ Leaking: UNKNOWN
│ Anonymous subclass of android.app.IRequestFinishCallback$Stub
│ GC Root: Global variable in native code
│ ↓ Activity$1.this$0
│ ~~~~~~
╰→ com.chuckerteam.chucker.api.internal.ui.MainActivity
Leaking: YES (Activity#mDestroyed is true and ObjectWatcher was watching this)
key = 3d3901ea-a7b9-47fa-ba5a-566d1ede5924
watchDurationMillis = 5185
retainedDurationMillis = 178
, retainedHeapByteSize=165749)], libraryLeaks=[])
Smartphone
develop
branchAdditional context
I haven't being able to reproduce it in other android versions. I suppose this is happening due to Android Q but I don't know if it's a false positive from LeakCanary or not. I've attached the memory dump from LeakCanary
Describe the bug
A clear and concise description of what the bug is.
To Reproduce
Smartphone
Additional context
05-19 00:16:05.934 24324 24324 E AndroidRuntime: FATAL EXCEPTION: main
05-19 00:16:05.934 24324 24324 E AndroidRuntime: Process: com.android.expro, PID: 24324
05-19 00:16:05.934 24324 24324 E AndroidRuntime: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.database.AbstractCursor.checkPosition(AbstractCursor.java:466)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.database.AbstractWindowedCursor.isNull(AbstractWindowedCursor.java:92)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.database.CursorWrapper.isNull(CursorWrapper.java:182)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.database.CursorWrapper.isNull(CursorWrapper.java:182)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at nl.qbusict.cupboard.PreferredColumnOrderCursorWrapper.isNull(PreferredColumnOrderCursorWrapper.java:147)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at nl.qbusict.cupboard.convert.ReflectiveEntityConverter.fromCursor(ReflectiveEntityConverter.java:172)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at nl.qbusict.cupboard.QueryResultIterable$QueryResultIterator.next(QueryResultIterable.java:135)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at nl.qbusict.cupboard.QueryResultIterable.get(QueryResultIterable.java:67)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at nl.qbusict.cupboard.CursorCompartment.get(CursorCompartment.java:67)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at com.readystatesoftware.chuck.internal.ui.transaction.TransactionActivity.onLoadFinished(TransactionActivity.java:131)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at com.readystatesoftware.chuck.internal.ui.transaction.TransactionActivity.onLoadFinished(TransactionActivity.java:54)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.app.LoaderManagerImpl$LoaderObserver.onChanged(LoaderManagerImpl.java:250)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.arch.lifecycle.LiveData.considerNotify(LiveData.java:109)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.arch.lifecycle.LiveData.dispatchingValue(LiveData.java:126)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.arch.lifecycle.LiveData.setValue(LiveData.java:282)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.arch.lifecycle.MutableLiveData.setValue(MutableLiveData.java:33)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.app.LoaderManagerImpl$LoaderInfo.setValue(LoaderManagerImpl.java:189)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManagerImpl.java:174)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.content.Loader.deliverResult(Loader.java:132)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:109)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:41)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:258)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:83)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:490)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:507)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:105)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.os.Looper.loop(Looper.java:176)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6701)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:249)
05-19 00:16:05.934 24324 24324 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:783)
it's actually a question than a bug.
intercept() method does not have try/catch for logics other than network request itself.
if your logic throws some exception, the network request/response would fail to be passed to their downstream operators.
am i understanding correctly?
Describe the bug
I'm able to see the list of made requests, when I try to open the request details to see respons / headers etc.. Chucker will creash.
Crash Log
2019-09-29 13:20:14.457 30344-30344/com.myspringring E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myspringring, PID: 30344
java.lang.RuntimeException: Unable to resume activity {com.myspringring/com.chuckerteam.chucker.api.internal.ui.transaction.TransactionActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Activity.getWindow()' on a null object reference
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3429)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3469)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2732)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.Window android.app.Activity.getWindow()' on a null object reference
at androidx.core.app.ComponentActivity.dispatchKeyShortcutEvent(ComponentActivity.java:85)
at androidx.lifecycle.LiveData.observe(LiveData.java:172)
at com.chuckerteam.chucker.api.internal.ui.transaction.TransactionActivity.onResume(TransactionActivity.java:89)
at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1269)
at android.app.Activity.performResume(Activity.java:6783)
at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3406)
at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3469)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2732)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
The following code is where I initialize Chucker
public static Retrofit getRetrofit(final Context context) {
String baseURL = getAPIBaseUrl();
Retrofit.Builder retrofitBuilder;
OkHttpClient.Builder builder = null;
// Define the interceptor, add authentication headers
Interceptor interceptor = new Interceptor() {
@Override
public okhttp3.Response intercept(Chain chain) throws IOException {
// TODO improve this
if (!GlobalUtils.checkForInternetConnection(context, TAG)) {
//logThis(TAG, "No Internet Connection", null);
throw new NoConnectivityException(context);
}
Request newRequest = chain.request().newBuilder()
/**
Headers
**/
return chain.proceed(newRequest);
}
};
// Add the interceptor to OkHttpClient
builder = new OkHttpClient.Builder();
builder.connectTimeout((int) Global.getFirebaseRemoteConfigValue(context, Integer.class, Firebase.API_TIMEOUT_SHORT.toString(), 0), TimeUnit.SECONDS); // connect timeout
builder.readTimeout((int) Global.getFirebaseRemoteConfigValue(context, Integer.class, Firebase.API_TIMEOUT_LONG.toString(), 0), TimeUnit.SECONDS); // write timeout
builder.writeTimeout((int) Global.getFirebaseRemoteConfigValue(context, Integer.class, Firebase.API_TIMEOUT_LONG.toString(), 0), TimeUnit.SECONDS); // read timeout
builder.interceptors().add(interceptor);
// Add chuck interceptor
builder.addInterceptor(new ChuckerInterceptor(context));
if (isDebug()) {
HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
logging.setLevel(HttpLoggingInterceptor.Level.BODY);
builder.addInterceptor(logging);
}
// Set the custom client when building adapter
retrofitBuilder = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(builder.build());
return retrofitBuilder.build();
}
I have changed from Chuck to Chucker using the steps in the README but now in the Request and Response I get this message instead of the JSON: (encoded or binary body omitted).
I'm using this version of OkHttp: 3.8.1
I believe that it would be possible to hide the RetentionManager
from the public API and treat it as an implementation detail, so users would only need to supply a retention period and internally the ChuckCollector
manages an instance of it.
collector = ChuckCollector(this)
.showNotification(true)
.retentionManager(RetentionManager(this, ChuckCollector.Period.ONE_HOUR))
becoming
collector = ChuckCollector(this)
.showNotification(true)
.retentionPeriod(ChuckCollector.Period.ONE_HOUR)
I am assuming that you would always want to use the same context
for both the collector and the retention manager. Can you imagine any circumstance where this wouldn't be the case and the exposed constructor would be useful?
Do you feel this would be a good way to evolve the API?
Do you want to develop this feature yourself?
Yes, I'd be happy to.
I currently have to log FCM messages for debug builds of my application. It would be great if I could offload this responsibility to chucker. Perhaps by supporting an additional data type that would result in a 3rd tab, "Messages" or "Data" or something along those lines, that I would then be able to call in my FcmMessageReceiver
implementation's onMessageReceived
handler to be able to pass the message into Chuck for logging.
I don't expect you'd want to add a dependency on the FCM libraries, but supporting most of the values in the RemoteMessage class would be great. The only one that would be mandatory would be the data (Map<String,String>), and the current timestamp.
Something like:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
chuckerCollector.onMessage(remoteMessage.getData());
}
or:
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
chuckerCollector.onMessage(
remoteMessage.getData(),
remoteMessage.getFrom(),
remoteMessage.getTo(),
remoteMessage.getMessageId(),
remoteMessage.getmessageType(),
remoteMessage.getSentTime(),
remoteMessage.getTtl()
);
}
This or something like it could be useful to a lot of people, even if they're not using it for cloud messaging.
Trying to share these responses through the Slack android app fails because it pastes into the "Title" field in slack.
If you open up chrome, select any text, and share through slack, you can see that the "Title" field does not even show up in Slack and instead it pastes the output into the message field, so it seems like this isn't something necessarily wrong with the Slack app as other apps can share correctly into it.
Edit: Occurs in latest stable and beta
Describe the bug
I get a systematic crash on any build using Proguard when I try to launch a Chucker intent like this for example:
context.startActivity(Chuck.getLaunchIntent(context, SCREEN_HTTP))
I don't have any issue if I don't use Proguard, so that's why I guess it may be related to some Proguard rules missing.
Crash logs:
E/AndroidRuntime: FATAL EXCEPTION: ModernAsyncTask #2
java.lang.RuntimeException: An error occurred while executing doInBackground()
at androidx.i.b.d$3.done(ModernAsyncTask.java:164)
at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
at java.util.concurrent.FutureTask.run(FutureTask.java:271)
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)
Caused by: android.database.sqlite.SQLiteException: no such column: tag (code 1 SQLITE_ERROR[1]): , while compiling: SELECT _id, tag, clazz, message, date FROM 'd' ORDER BY date DESC
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1229)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:703)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:59)
at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:46)
at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1865)
at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1712)
at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1583)
at e.a.a.f$a.a(DatabaseCompartment.java:641)
at e.a.a.f.a(DatabaseCompartment.java:437)
at e.a.a.f.a(DatabaseCompartment.java:53)
at e.a.a.f$b.a(DatabaseCompartment.java:586)
at e.a.a.f$b.b(DatabaseCompartment.java:595)
at com.readystatesoftware.chuck.internal.data.ChuckContentProvider.query(ChuckContentProvider.java:95)
at android.content.ContentProvider.query(ContentProvider.java:1078)
at android.content.ContentProvider.query(ContentProvider.java:1170)
at android.content.ContentProvider$Transport.query(ContentProvider.java:241)
at android.content.ContentResolver.query(ContentResolver.java:808)
at android.content.ContentResolver.query(ContentResolver.java:758)
at androidx.core.content.a.a(ContentResolverCompat.java:81)
at androidx.i.b.b.h(CursorLoader.java:63)
at androidx.i.b.b.d(CursorLoader.java:41)
at androidx.i.b.a.e(AsyncTaskLoader.java:307)
at androidx.i.b.a$a.a(AsyncTaskLoader.java:60)
at androidx.i.b.a$a.a(AsyncTaskLoader.java:48)
at androidx.i.b.d$2.call(ModernAsyncTask.java:141)
To Reproduce
Steps to reproduce the behavior:
Enable Proguard and try to launch any Chucker intent.
Thanks a lot in advance for your help! 🙂👋
Is your feature request related to a problem? Please describe.
It would be nicer if Chucker could have a better support for RTL devices.
Describe the solution you'd like
ViewPager works the opposite way on RTL layout and some texts are overlapping each other.
Describe alternatives you've considered
Better RTL support.
Do you want to develop this feature yourself?
No unfortunately.
I use a few other crash reporters and crash viewers built into my application. The fact that Chucker added this onto Chuck is nice, but I want to get rid of it so my team doesn't get confused about whether or not we should be using it vs our other error reporters. During Chucker setup, it'd be nice to just opt-out of having the error feature showing/working.
Describe the bug
Chunker doesn't work with okhttp 4.0 due to API incompatibility
Error Log:
Caused by: java.lang.NoSuchMethodError: No static method hasBody(Lokhttp3/Response;)Z in class Lokhttp3/internal/http/HttpHeaders; or its super classes (declaration of 'okhttp3.internal.http.HttpHeaders' appears in /data/app/com.jora.android.debug-pyXggfGJ5Y4D-gUqowxVwQ==/split_lib_dependencies_apk.apk!classes2.dex)
at com.readystatesoftware.chuck.api.ChuckInterceptor.intercept(ChuckInterceptor.java:149)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
at com.jora.android.ng.network.authentication.AuthInterceptor.intercept(AuthInterceptor.kt:20)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.kt:37)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.kt:82)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.kt:84)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.kt:71)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:112)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.kt:87)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.kt:184)
at okhttp3.RealCall.execute(RealCall.kt:66)
at retrofit2.OkHttpCall.execute(OkHttpCall.java:188)
at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
at io.reactivex.Observable.subscribe(Observable.java:12267)
at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
at io.reactivex.Observable.subscribe(Observable.java:12267)
at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleMap.subscribeActual(SingleMap.java:34)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleOnErrorReturn.subscribeActual(SingleOnErrorReturn.java:38)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleFlatMap$SingleFlatMapCallback.onSuccess(SingleFlatMap.java:84)
at io.reactivex.internal.operators.single.SingleFromCallable.subscribeActual(SingleFromCallable.java:56)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleFlatMap.subscribeActual(SingleFlatMap.java:36)
at io.reactivex.Single.subscribe(Single.java:3603)
at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)
at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
Describe the bug
Looks like the first HttpTransaction
of a session is reported twice on the Push Notification (only). Opening Chucker shows the correct number of transactions.
To Reproduce
Steps to reproduce the behavior:
MainActivity.kt
to make sure only one request is firedExpected behavior
Network request should be reported only once in the push notification
Smartphone
develop-SNAPSHOT
Describe the bug
I do have an app that is calling an endpoint that returns a JSON Body of nearly 700kb.
Chucker is blocking the UI thread trying to parse the body and is causing an ANR/Crash if trying to inspect the response body.
To Reproduce
Expected behavior
The tab should open immediately
Actual behavior
The Chucker UI is completely frozen and eventually crashes
Smartphone
One related problem is that when you perform a search in the response tab, any highlighted matches will be unhighlighted as you scroll through the body of the response. Furthermore, the act of searching does not auto scroll to the first occurrence of the search result as I would expect.
I propose the following:
No other alternatives considered at this time
Thanks for a great product and for your consideration of this request.
Describe the bug
When opening Chucker in device and clicking to see the description of an Http Request, it crashes
To Reproduce
Steps to reproduce the behavior:
Smartphone
Describe the bug
The following NPE is thrown:
Caused by: java.lang.NullPointerException: Attempt to invoke interface method 'java.lang.String java.lang.CharSequence.toString()' on a null object reference
at com.chuckerteam.chucker.api.internal.ui.MainActivity.getApplicationName(MainActivity.java:90)
at com.chuckerteam.chucker.api.internal.ui.MainActivity.onCreate(MainActivity.java:46)
at android.app.Activity.performCreate(Activity.java:7802)
Affected line:
toString()
on ApplicationInfo.nonLocalizedLabel
which may me null.The string provided in the AndroidManifest file, if any.
If there is no such string in manifest then value is null
.
To Reproduce
context.startActivity(Chucker.getLaunchIntent(context, Chucker.SCREEN_HTTP))
where context
is valid activity Context
.Sample project:
https://github.com/DroidsOnRoids/FoQA
Use Chucker
Hyperion menu option to reproduce this issue.
Expected behavior
There should be no crash.
Smartphone
Describe the bug
java.lang.IllegalStateException: You can't access the transaction repository if you don't initialize it!
at com.chuckerteam.chucker.api.internal.data.repository.RepositoryProvider.transaction(RepositoryProvider.kt:16)
at com.chuckerteam.chucker.api.internal.ui.transaction.TransactionListFragment.getDataSource(TransactionListFragment.java:136)
at com.chuckerteam.chucker.api.internal.ui.transaction.TransactionListFragment.onAttach(TransactionListFragment.java:81)
at androidx.fragment.app.FragmentManagerImpl.moveToState(FragmentManager.java:1404)
at androidx.fragment.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1195)
at androidx.fragment.app.FragmentTransition.calculateFragments(FragmentTransition.java:1078)
at androidx.fragment.app.FragmentTransition.startTransitions(FragmentTransition.java:117)
at androidx.fragment.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2408)
at androidx.fragment.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
at androidx.fragment.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
at androidx.fragment.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
at androidx.fragment.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:146)
To Reproduce
context.startActivity(Chucker.getLaunchIntent(context, Chucker.SCREEN_HTTP))
where context
is valid activity Context
.Sample project:
https://github.com/DroidsOnRoids/FoQA
Use Chucker
Hyperion menu option to reproduce this issue.
Expected behavior
There should be no crash.
Smartphone
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.