f0x1d / logfox Goto Github PK
View Code? Open in Web Editor NEWYet another LogCat reader for Android
License: GNU General Public License v3.0
Yet another LogCat reader for Android
License: GNU General Public License v3.0
Im a software tester ,i need a option to hide build fingerprints in log for privacy,it helps me to feedback devs faster. i mentioned build fingerprints as phone software informations.
Could be helpful if the app crash causes bootloop or something, maybe even add an option in settings to clear all crashes after 7 days from when they were created
Environment: LogFox 1.5.6 running on a 905X3 television box with a custom ROM based on Android 9.
Started LogFox, and searched for a specific application that kept crashing. Eventually, I wanted to look at other things, I cleared the logs, but every time I go back into LogFox, I see two of the lines from two days ago, literally repeated (same timestamps) for hundreds of pages. I have tried force stopping the app, stopping the service, restaring logging, and everything else I can think of, but no matter what I try, when I start LogFox, I see nothing but those same two line from two days ago repeated for hundreds of pages.
The log for LogFox has nothing interesting (literally just "Start proc," but I do have a screenshot (although you can't see the incredibly small scroll bar on the right in it).
Any suggestions? Thank you in advance.
As a side request, could you add "Save" to "Copy," "Share," and "Zip" in the page that displays crashes?
Hello!
I'd like to buy the code owners a coffee!
Please setup a donation link :)
Digression
As a log capture tool, I think it should include the function of capturing its own crash logs
Is it possible to have the log that precedes the moment the app is launched, as in Logcat Reader (GitHub, F-droid)?
Note that Logcat Reader's recording service with the mandatory notification is started when the app is launched, and it is not running before; I did "Force stop" in the Android settings, to be sure.
Steps to reproduce:
Logs:
FATAL EXCEPTION: main
Process: com.f0x1d.logfox, PID: 8000
java.lang.IllegalArgumentException: Navigation action/destination com.f0x1d.logfox:id/action_settingsMenuFragment_to_settingsUIFragment cannot be found from the current destination g(com.f0x1d.logfox:id/settingsCrashesFragment) label=SettingsCrashesFragment class=com.f0x1d.logfox.ui.fragment.settings.SettingsCrashesFragment
at z0.y.j(SourceFile:169)
at r3.g.f(SourceFile:91)
at androidx.preference.Preference.s(SourceFile:20)
at e.b.onClick(SourceFile:82)
at android.view.View.performClick(View.java:7467)
at android.view.View.performClickInternal(View.java:7444)
at android.view.View.access$3700(View.java:840)
at android.view.View$PerformClick.run(View.java:28831)
at android.os.Handler.handleCallback(Handler.java:978)
at android.os.Handler.dispatchMessage(Handler.java:104)
at android.os.Looper.loopOnce(Looper.java:238)
at android.os.Looper.loop(Looper.java:357)
at android.app.ActivityThread.main(ActivityThread.java:8090)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1026)
Device details:
App version: 1.3.9
Android: 12
Model: moto g71 5G
FATAL EXCEPTION: DefaultDispatcher-worker-10
Process: com.f0x1d.logfox.debug, PID: 8562
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(BinderProxy.java:535)
at com.f0x1d.logfox.IUserService$Stub$Proxy.processOutput(IUserService.java:246)
at com.f0x1d.logfox.utils.terminal.ShizukuTerminal.execute(ShizukuTerminal.kt:114)
at com.f0x1d.logfox.repository.logging.LoggingRepository$readLogs$2.invokeSuspend(LoggingRepository.kt:144)
at com.f0x1d.logfox.repository.logging.LoggingRepository$readLogs$2.invoke(Unknown Source:8)
at com.f0x1d.logfox.repository.logging.LoggingRepository$readLogs$2.invoke(Unknown Source:4)
at kotlinx.coroutines.intrinsics.UndispatchedKt.startUndispatchedOrReturn(Undispatched.kt:78)
at kotlinx.coroutines.CoroutineScopeKt.coroutineScope(CoroutineScope.kt:264)
at com.f0x1d.logfox.repository.logging.LoggingRepository.readLogs(LoggingRepository.kt:132)
at com.f0x1d.logfox.repository.logging.LoggingRepository.access$readLogs(LoggingRepository.kt:34)
at com.f0x1d.logfox.repository.logging.LoggingRepository$startLoggingIfNot$2.invokeSuspend(LoggingRepository.kt:86)
at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106)
at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.kt:115)
at kotlinx.coroutines.scheduling.TaskImpl.run(Tasks.kt:100)
at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:584)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:793)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:697)
at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:684)
Suppressed: kotlinx.coroutines.internal.DiagnosticCoroutineContextException: [StandaloneCoroutine{Cancelling}@6ae6ff7, Dispatchers.IO]
Thought I'd mention since the README says "Get it on F-Droid", yet it is 4 versions out of date
This happens on my phone
These crashes bring hundreds of notifications every day, and there is no way to block them, but I don’t want to close LogFox either.
Add a block list to block some of the crash record notifications
Hello, please, add an option to enable Black theme in LogFox.
Alternatively, if possible, you can make Monet theming like it was in the previous version (version 1.5.2 and earlier), i.e. fully dynamic – due to questionable changes in material3 compose, background color is no longer dynamic (you can't make it darker/lighter/completely black with the use of apps like "Repainter" anymore), some app developers ignore this change, still allowing user to fully customize the Monet theme in their app.
Here's screenshots comparing LogFox v1.5.2 and v1.5.3 with "Repainter" enabled:
Anyway, good luck to you and thank you for your app
Would you consider publishing it on Accrescent; an alternative android app store?
See their guide: https://accrescent.app/docs/guide/getting-started/
I suggest changing the log icon in the navigation bar and notification bar to logfox icons, and changing the crash icon to bug. I think the meaning of bug is closer to crashes.
Moreover, the logcat icon on Android Studio is the same as the cat icon, so it is more reasonable to set the log icon to the logfox icon.
In Android, if textIsSelectable
is set to TextView, it will automatically enable focusInTouchMode
. (Although this may not be entirely reasonable, the fact is that it is.)
And in Android, if a View gains focus, Android will view it to display it fully on the screen.
This creates a situation in the video where when long pressing the selection button, ScrollView will immediately scroll to the position of TextView, causing a decrease in user experience (selecting multiple unrelated lines of text and potentially confusing the user).
In traditional android.widget.ScrollView
, we only need to set 'setRevealOnFocusHint' to TextView, but this value does not work when using NestedScrollView
because NestedScrollView
was not evaluated during implementation.
So we need to use other methods. That is, after inheriting NestedView
, rewrite the computeScrollDeltaToGetChildRectOnScreen
method and return 0
. I have tested in another project and it will work.
In Android, when the textIsSelectable
property is enabled for a TextView, the focusInTouchMode
is automatically activated. This may seem counterintuitive, but it's the actual behavior.
Additionally, in Android, when a View gains focus, the system assumes it needs to be fully visible on the screen.
This can lead to the issue described in the video, where upon long-pressing a TextView, the ScrollView immediately scrolls to the position of the TextView, potentially degrading the user experience (as multiple lines of text may be unintentionally selected during the long-press, leading to confusion).
In the traditional android.widget.ScrollView
, one workaround for this issue is to set the setRevealOnFocusHint
property of the TextView to true. However, when using NestedScrollView
, this workaround does not work as NestedScrollView
does not take this property into account during its implementation.
Therefore, an alternative approach is necessary. One such approach is to inherit from NestedScrollView
and override the computeScrollDeltaToGetChildRectOnScreen
method, returning 0
. I have tested this approach in another project, and it resolves the issue.
I hope it's understandable. Since, well, long enough I used Matlog Libre. I really like your app, but it really lacks the possibility to save files and view them later, or even open log files with file picker (something even matlog lacks). Could you add this feature?
On a side note, would you consider adding amoled theme or should I open another issue for that?
Please add an option to show logs by its level: debug, error, info, verbose e.t.c like in MatLog. Right now it shows all logs together and sometimes there is a need to see logs only certain level without all this mess
Reproduce :
Device :
FATAL EXCEPTION: main
Process: com.f0x1d.logfox, PID: 3857
java.lang.RuntimeException: android.os.TransactionTooLargeException: data parcel size 1482336 bytes
at android.content.ClipboardManager.setPrimaryClip(ClipboardManager.java:189)
at f3.a.d(SourceFile:1)
at e4.d.a(SourceFile:155)
at e4.d.k(SourceFile:28)
at i3.a.onMenuItemClick(SourceFile:13)
at k.o.q(SourceFile:19)
at k.x.onItemClick(SourceFile:41)
at android.widget.AdapterView.performItemClick(AdapterView.java:330)
at android.widget.AbsListView.performItemClick(AbsListView.java:1265)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3278)
at android.widget.AbsListView$3.run(AbsListView.java:4244)
at android.os.Handler.handleCallback(Handler.java:958)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:205)
at android.os.Looper.loop(Looper.java:294)
at android.app.ActivityThread.main(ActivityThread.java:8248)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:552)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:971)
Caused by: android.os.TransactionTooLargeException: data parcel size 1482336 bytes
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(BinderProxy.java:584)
at android.content.IClipboard$Stub$Proxy.setPrimaryClip(IClipboard.java:389)
at android.content.ClipboardManager.setPrimaryClip(ClipboardManager.java:182)
... 18 more
Because this code is dynamically generated, it may result in reduced readability.
My recommended way to do this is to write the background to the drawable resource folder and then get it in the code.
I recommend using context menu because it eliminates the need to generate a lot of PopupMenu and makes the menu follow the user's finger!
The minimum Android version of the software is 24, so the context menu can be displayed normally as PopupMenu style
And add a ripple effect to the background. This requires refactoring the background implementation.
Is the 1.5.6 apk built from the tag? Could you please take a look? Thanks!
Sometimes an app crashes constantly and then when there are too many it causes the phone to restart, please do that it will warn the user and deleted all crashes except one so that the restart won't happen.
Sorry if it's too much and tnx anyway
I use this app only to check for app crashes and I don't need logcat service on open
Is it possible to add Shizuku support? I'm not sure if it provides the ability to read the logcat, but what if?
Splitting fragments to different activities(especially pages without navigation bars) has the following advantages:
Hey,
Wow, thank you, really, this is the best Logcat viewer ever!
I always wondered why none of them showed package names.
Really awesome, and even showing crashes 👍👍
Regards
Hyper
Hello. Wanted to suggest some improvements:
Hi, it would be awesome, if a User could switch menu tabs through swiping to the left/right side. As an example I have the vertical navigation through folders from Telegram in mind.
Add an option to export all logs that are in logfox tab(with filters) instead of having to record them again
Maybe press on three dots and export option there
OS:Android 11 API 30
Version:1.5.7
FATAL EXCEPTION: FinalizerWatchdogDaemon
Process: com.f0x1d.logfox, PID: 28224
java.util.concurrent.TimeoutException: com.android.internal.os.BinderInternal$GcWatcher.finalize() timed out after 10 seconds
at java.lang.Object.wait(Native Method)
at java.lang.Object.wait(Object.java:442)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:190)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:211)
at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:273)
at java.lang.Daemons$Daemon.run(Daemons.java:139)
at java.lang.Thread.run(Thread.java:923)
when I delete them and restart the app(or restart the log record) ,they came back again
crash-com-f0x1d-logfox-02_02-16-08-25_407.zip
The log is taken from Logfox !
The details are as follows:
Searching by PID seems not working. Also the search is case sensitive (which makes searching more difficult). Overall improvement in the searching function can be made.
Some kind of indication when filter is applied will be great, I think.
Once, I opened LogFox the list was empty and I assumed it could be root permission. So, I tried,
denying/grant su access, "Restart service", force stop. Until I figured out it had a filter that I had added last time I used.
Thanks :)
The app is crashing for me whenever i tap on "crashes" button in navigation bar. It was working fine a few days ago. It just started to happen randomly. There isn't any problem when i tap on a current crash directly from notification to access it.
Here's the log:
FATAL EXCEPTION: main
Process: com.f0x1d.logfox, PID: 12943
android.database.sqlite.SQLiteBlobTooBigException: Row too big to fit into CursorWindow requiredPos=18, totalRows=19
at android.database.sqlite.SQLiteConnection.nativeExecuteForCursorWindow(Native Method)
at android.database.sqlite.SQLiteConnection.executeForCursorWindow(SQLiteConnection.java:1003)
at android.database.sqlite.SQLiteSession.executeForCursorWindow(SQLiteSession.java:838)
at android.database.sqlite.SQLiteQuery.fillWindow(SQLiteQuery.java:62)
at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:153)
at android.database.sqlite.SQLiteCursor.onMove(SQLiteCursor.java:123)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:255)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:287)
at w2.c.a(SourceFile:555)
at w2.c.call(SourceFile:182)
at j1.c.n(SourceFile:85)
at b7.a.m(SourceFile:1)
at q7.i0.run(SourceFile:1)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644)
at java.lang.Thread.run(Thread.java:1012)
Suppressed: v7.g: [p1{Cancelling}@b13b5ac, Dispatchers.Main.immediate]
I have debloated my phone so this one ad service keep crashing and Logfox shows me notification throughout the day. When I plug charger, switch apps & play music etc, i get dozen of notifications every day. This adservice doesn't really have any app as i can't get into app info page through logfox or other apps. The OEM somehow baked it into the system. I can't completely disable the crash notification for obvious reasons. Is it possible to implement something like this where we can select service which we don't want to see notification of?
FATAL EXCEPTION: main
Process: com.f0x1d.logfox, PID: 31710
java.lang.IllegalArgumentException: Navigation action/destination com.f0x1d.logfox:id/action_recordingsFragment_to_recordingBottomSheet cannot be found from the current destination b(com.f0x1d.logfox:id/recordingBottomSheet) label=RecordingBottomSheet
at f1.v.l(SourceFile:131)
at f1.v.n(SourceFile:1)
at y3.d.n(SourceFile:292)
at h4.i.onClick(SourceFile:54)
at android.view.View.performClick(View.java:7322)
at android.view.View.performClickInternal(View.java:7296)
at android.view.View.access$3600(View.java:839)
at android.view.View$PerformClick.run(View.java:28319)
at android.os.Handler.handleCallback(Handler.java:900)
at android.os.Handler.dispatchMessage(Handler.java:103)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8673)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1109)
This is your app, you can decide to fix this 💩 bug on huawei or ignore it. I would greatly appreciate it if you could fix this bug. I can also provide you with some help.
java.lang.ArrayIndexOutOfBoundsException: length=15000; index=-1
at java.util.ArrayList.get(ArrayList.java:439)
at java.util.Collections$UnmodifiableList.get(Collections.java:1356)
at com.f0x1d.logfox.ui.viewholder.base.BaseViewHolder.getCurrentItem(BaseViewHolder.kt:11)
at com.f0x1d.logfox.ui.viewholder.LogViewHolder.expandOrCollapseItem(LogViewHolder.kt:111)
at com.f0x1d.logfox.ui.viewholder.LogViewHolder._init_$lambda$1(LogViewHolder.kt:55)
at com.f0x1d.logfox.ui.viewholder.LogViewHolder.$r8$lambda$wpliB5BmvfRQPqhmRmCq5TmEJzs(Unknown Source:0)
at com.f0x1d.logfox.ui.viewholder.LogViewHolder$$ExternalSyntheticLambda1.onClick(Unknown Source:2)
at android.view.View.performClick(View.java:7575)
at android.view.View.performClickInternal(View.java:7548)
at android.view.View.-$$Nest$mperformClickInternal(Unknown Source:0)
at android.view.View$PerformClick.run(View.java:29848)
at android.os.Handler.handleCallback(Handler.java:942)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loopOnce(Looper.java:211)
at android.os.Looper.loop(Looper.java:300)
at android.app.ActivityThread.main(ActivityThread.java:8294)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:580)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1028)
I don't know what I did, and I can't reproduce it either.
I have checked the source code and it is possible that the RecyclerView. getBindingAdapterPosition()
method returned NO_POSITION
The following screenshot is an exception monitoring from MIUI.
Currently you can easily accidently close the notification by swiping it, please make it so that you need to click on notification, and then on exit button to close the notification
Thanks.
Im frequently running into a problem where im trying to view logs for a specific app on my phone but LogFox doesn't really have a neat way of doing it.
What I'm thinking is add an option to the filter that displays all apps including system (toggleable) and the user can select it to show only logs for that app
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.