Observe and get notifications about Java/JNI crashes and ANRs
Powerful filters for logs
Accessibility support
Material You design
Download
Screenshots
License
Copyright (C) 2022-2024 Maksim Zoteev
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Huawei's notification icons allow for colorful icons, so they will not be automatically colored like AOSP
Solution: Copy a dedicated icon file for notifications and manually fill the file with colors
Huawei's navigation bar is gray by default, not white, and it is the same behavior in new EMUI now.
Solution: Remove the navigation bar background on Huawei devices, regardless of whether the device is Android 8.1+ or use a darker background instead (not recommended as it may not look good)
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?
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
Hi, I'm using Las version 1.5.4 an the only option to save the log is by record, but I need to save full log, since boot, it is possible? How to save the info on the main window?
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.
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]
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.
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
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)
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.
Translated from ERNIE Bot
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 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?
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)
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
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.
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 ππ
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
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.
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
Version: The latest version on the master with #113
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]
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)
Splitting fragments to different activities(especially pages without navigation bars) has the following advantages:
Animation Follow System, and avoid the non-animated disappearance of rail or navigation view
Remove content protection from navigation bar only for MainActivity, because it is better to set the transparent navigation bar in the portrait home screen. In the original situation, switching to a page without a navigation bar requires manually setting the navigation bar color, as in my pr.
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.
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
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.
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.
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?
The current dark theme is more like an AMOLED theme. Is it possible to make the background less black?
Item 1
Maybe add a language selection in the application? It always depends on your system, which is sometimes inconvenient.
Item 2
Do you think it's worth adding the "AndroidRuntime" tag filter on the first launch of the application? This is a very useful filter in case of debugging. And beginners can quickly use it.
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
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.