From 9b9603524869e92e4d045d332e7f9298aa3ba756 Mon Sep 17 00:00:00 2001 From: Tim Schneeberger Date: Sat, 1 Oct 2022 19:52:02 +0200 Subject: [PATCH] feat: better session dump with log for troubleshooting --- app/build.gradle.kts | 1 + .../rootlessjamesdsp/MainApplication.kt | 21 ++++++++++-- .../SettingsTroubleshootingFragment.kt | 33 ++++++++++++++++--- .../session/dump/DumpManager.kt | 11 ++++--- app/src/main/res/values/strings.xml | 4 ++- .../main/res/xml/app_about_preferences.xml | 9 +++++ 6 files changed, 67 insertions(+), 12 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 01d3be75e..3f26cae6a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -145,6 +145,7 @@ dependencies { // Logging implementation("com.jakewharton.timber:timber:5.0.1") + implementation("com.github.bastienpaulfr:Treessence:1.0.0") // Room databases val roomVersion = "2.4.3" diff --git a/app/src/main/java/me/timschneeberger/rootlessjamesdsp/MainApplication.kt b/app/src/main/java/me/timschneeberger/rootlessjamesdsp/MainApplication.kt index f09f3000b..ba4889dc5 100644 --- a/app/src/main/java/me/timschneeberger/rootlessjamesdsp/MainApplication.kt +++ b/app/src/main/java/me/timschneeberger/rootlessjamesdsp/MainApplication.kt @@ -7,16 +7,18 @@ import android.util.Log import com.google.firebase.crashlytics.FirebaseCrashlytics import com.google.firebase.crashlytics.ktx.crashlytics import com.google.firebase.ktx.Firebase +import com.google.firebase.ktx.app +import fr.bipi.tressence.file.FileLoggerTree import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.SupervisorJob -import me.timschneeberger.rootlessjamesdsp.activity.MainActivity import me.timschneeberger.rootlessjamesdsp.model.room.AppBlocklistDatabase import me.timschneeberger.rootlessjamesdsp.model.room.AppBlocklistRepository import me.timschneeberger.rootlessjamesdsp.utils.Constants import org.lsposed.hiddenapibypass.HiddenApiBypass import timber.log.Timber - import timber.log.Timber.* +import java.io.File + class MainApplication : Application() { init { @@ -33,6 +35,21 @@ class MainApplication : Application() { override fun onCreate() { Timber.plant(DebugTree()) Timber.plant(CrashReportingTree()) + Timber.plant(FileLoggerTree.Builder() + .withFileName("application.log") + .withDirName(this.cacheDir.absolutePath) + .withMinPriority(Log.VERBOSE) + .withSizeLimit(2 * 1000000) + .withFileLimit(1) + .appendToFile(false) + .build()) + Timber.i("====> Application starting up") + + // Clean up + val dumpFile = File(filesDir, "dump.txt") + if(dumpFile.exists()) { + dumpFile.delete() + } val prefs = getSharedPreferences(Constants.PREF_APP, Context.MODE_PRIVATE) // Soft-disable crashlytics in debug mode by default on each launch diff --git a/app/src/main/java/me/timschneeberger/rootlessjamesdsp/fragment/SettingsTroubleshootingFragment.kt b/app/src/main/java/me/timschneeberger/rootlessjamesdsp/fragment/SettingsTroubleshootingFragment.kt index e1fdfdff0..034ed8c55 100644 --- a/app/src/main/java/me/timschneeberger/rootlessjamesdsp/fragment/SettingsTroubleshootingFragment.kt +++ b/app/src/main/java/me/timschneeberger/rootlessjamesdsp/fragment/SettingsTroubleshootingFragment.kt @@ -18,9 +18,9 @@ import me.timschneeberger.rootlessjamesdsp.utils.ApplicationUtils import me.timschneeberger.rootlessjamesdsp.utils.AssetManagerExtensions.installPrivateAssets import me.timschneeberger.rootlessjamesdsp.utils.Constants import me.timschneeberger.rootlessjamesdsp.utils.ContextExtensions.showAlert -import me.timschneeberger.rootlessjamesdsp.utils.loadHtml import java.io.File import java.io.FileOutputStream +import java.io.InputStream import java.io.OutputStreamWriter class SettingsTroubleshootingFragment : PreferenceFragmentCompat() { @@ -31,14 +31,39 @@ class SettingsTroubleshootingFragment : PreferenceFragmentCompat() { findPreference(getString(R.string.key_troubleshooting_dump))?.setOnPreferenceClickListener { val debug = DumpManager.get(requireContext()).collectDebugDumps() - val path = requireContext().filesDir.absolutePath + "/dump.txt" + val path = File(requireContext().filesDir, "dump.txt") val output = FileOutputStream(path) val writer = OutputStreamWriter(output) + val log = File(requireContext().cacheDir, "application.log") + writer.write(debug) + writer.write("==================> Application log\n") + writer.flush() + + if (log.exists()) { + try { + log.inputStream().use { input -> + val buffer = ByteArray(8192) + var read: Int + while (input.read(buffer, 0, 8192) + .also { read = it } >= 0 + ) { + output.write(buffer, 0, read) + output.flush() + } + } + } + catch (ex: Exception) { + writer.write("NOTE: Failed to append log file.\n$ex\n") + } + } + else { + writer.write("NOTE: Log file does not exist\n") + } writer.close() output.close() - val uri = FileProvider.getUriForFile(requireContext(), BuildConfig.APPLICATION_ID + ".dump_provider", File(path)) + val uri = FileProvider.getUriForFile(requireContext(), BuildConfig.APPLICATION_ID + ".dump_provider", path) val shareIntent = Intent(Intent.ACTION_SEND) shareIntent.putExtra(Intent.EXTRA_STREAM, uri) shareIntent.flags = Intent.FLAG_GRANT_READ_URI_PERMISSION @@ -74,7 +99,7 @@ class SettingsTroubleshootingFragment : PreferenceFragmentCompat() { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, - savedInstanceState: Bundle? + savedInstanceState: Bundle?, ): View { val view = super.onCreateView(inflater, container, savedInstanceState) val a = TypedValue() diff --git a/app/src/main/java/me/timschneeberger/rootlessjamesdsp/session/dump/DumpManager.kt b/app/src/main/java/me/timschneeberger/rootlessjamesdsp/session/dump/DumpManager.kt index b3adadc0f..c3ecf6322 100644 --- a/app/src/main/java/me/timschneeberger/rootlessjamesdsp/session/dump/DumpManager.kt +++ b/app/src/main/java/me/timschneeberger/rootlessjamesdsp/session/dump/DumpManager.kt @@ -4,18 +4,19 @@ import android.content.Context import android.content.SharedPreferences import android.os.Build import me.timschneeberger.rootlessjamesdsp.BuildConfig -import me.timschneeberger.rootlessjamesdsp.session.AudioSessionManager -import me.timschneeberger.rootlessjamesdsp.utils.ContextExtensions.getVersionCode -import me.timschneeberger.rootlessjamesdsp.utils.ContextExtensions.getVersionName import me.timschneeberger.rootlessjamesdsp.R +import me.timschneeberger.rootlessjamesdsp.session.AudioSessionManager import me.timschneeberger.rootlessjamesdsp.session.dump.data.AudioPolicyServiceDump -import me.timschneeberger.rootlessjamesdsp.session.dump.data.ISessionPolicyInfoDump import me.timschneeberger.rootlessjamesdsp.session.dump.data.ISessionInfoDump +import me.timschneeberger.rootlessjamesdsp.session.dump.data.ISessionPolicyInfoDump import me.timschneeberger.rootlessjamesdsp.session.dump.provider.AudioPolicyServiceDumpProvider import me.timschneeberger.rootlessjamesdsp.session.dump.provider.AudioServiceDumpProvider import me.timschneeberger.rootlessjamesdsp.utils.Constants +import me.timschneeberger.rootlessjamesdsp.utils.ContextExtensions.getVersionCode +import me.timschneeberger.rootlessjamesdsp.utils.ContextExtensions.getVersionName import me.timschneeberger.rootlessjamesdsp.utils.SingletonHolder import timber.log.Timber +import java.io.File class DumpManager private constructor(val context: Context) { enum class Method (val value: Int) { @@ -120,7 +121,7 @@ class DumpManager private constructor(val context: Context) { if(exceptionRaised) { - sb.append("NOTE: One or more exceptions has been raised while collecting debug dumps") + sb.append("NOTE: One or more exceptions has been raised while collecting debug dumps\n") } return sb.toString() diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 31588ddb2..1b9631889 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -259,7 +259,9 @@ App & rootless implementation developed by JamesDSP core algorithm library developed by Visit project website on GitHub - Report issues, keep yourself updated, and download updates + Report issues, keep yourself updated, and read the source code + Visit RootlessJamesDSP on Google Play + Search for new updates Application version Build info diff --git a/app/src/main/res/xml/app_about_preferences.xml b/app/src/main/res/xml/app_about_preferences.xml index 8dec500a3..a3b0e940b 100644 --- a/app/src/main/res/xml/app_about_preferences.xml +++ b/app/src/main/res/xml/app_about_preferences.xml @@ -28,6 +28,15 @@ android:data="https://github.com/thepbone/RootlessJamesDSP" /> + + + +