Skip to content

Commit 2928d4e

Browse files
possibly fix ksu support
at some point, ksu re-removed the ability to run su -v, so now it needs extra special detection rework crash handler too Signed-off-by: androidacy-user <opensource@androidacy.com>
1 parent f6da136 commit 2928d4e

5 files changed

Lines changed: 41 additions & 108 deletions

File tree

app/build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,9 @@ dependencies {
433433
implementation("androidx.room:room-ktx:2.5.2")
434434

435435
implementation("pl.droidsonroids.gif:android-gif-drawable:1.2.28")
436+
437+
// crash activity
438+
implementation("cat.ereza:customactivityoncrash:2.4.0")
436439
}
437440

438441
android {

app/src/main/kotlin/com/fox2code/mmm/CrashHandler.kt

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -13,17 +13,18 @@ import android.os.Bundle
1313
import android.view.View
1414
import android.widget.Toast
1515
import androidx.appcompat.app.AppCompatActivity
16+
import cat.ereza.customactivityoncrash.CustomActivityOnCrash
1617
import com.google.android.material.dialog.MaterialAlertDialogBuilder
1718
import com.google.android.material.textview.MaterialTextView
1819
import timber.log.Timber
19-
import java.io.PrintWriter
20-
import java.io.StringWriter
2120

2221
class CrashHandler : AppCompatActivity() {
23-
@Suppress("DEPRECATION")
2422
@SuppressLint("RestrictedApi")
2523
override fun onCreate(savedInstanceState: Bundle?) {
26-
if (MainApplication.forceDebugLogging) Timber.i("CrashHandler.onCreate(%s)", savedInstanceState)
24+
if (MainApplication.forceDebugLogging) Timber.i(
25+
"CrashHandler.onCreate(%s)",
26+
savedInstanceState
27+
)
2728
// log intent with extras
2829
if (MainApplication.forceDebugLogging) Timber.d("CrashHandler.onCreate: intent=%s", intent)
2930
super.onCreate(savedInstanceState)
@@ -32,21 +33,7 @@ class CrashHandler : AppCompatActivity() {
3233
// convert stacktrace from array to string, and pretty print it (first line is the exception, the rest is the stacktrace, with each line indented by 4 spaces)
3334
val crashDetails = findViewById<MaterialTextView>(R.id.crash_details)
3435
crashDetails.text = ""
35-
// get the exception from the intent
36-
val exceptionFromIntent = intent.getSerializableExtra("exception") as Throwable?
37-
var exception: String? = null
38-
// parse the exception from the intent into exception if it is not null
39-
if (exceptionFromIntent != null) {
40-
val stringWriter = StringWriter()
41-
exceptionFromIntent.printStackTrace(PrintWriter(stringWriter))
42-
var stacktrace = stringWriter.toString()
43-
stacktrace = stacktrace.replace(",", "\n ")
44-
exception = stacktrace
45-
}
46-
val sharedPreferences = MainApplication.getPreferences("mmm")
47-
if (exception == null && sharedPreferences != null) {
48-
exception = sharedPreferences.getString("pref_crash_stacktrace", null)
49-
}
36+
val exception = CustomActivityOnCrash.getStackTraceFromIntent(intent)
5037
// if the exception is null, set the crash details to "Unknown"
5138
if (exception == null) {
5239
crashDetails.setText(R.string.crash_details)
@@ -74,8 +61,6 @@ class CrashHandler : AppCompatActivity() {
7461
startActivity(intent)
7562
finish()
7663
}
77-
// remove pref_crashed from shared preferences
78-
sharedPreferences?.edit()?.remove("pref_crashed")?.apply()
7964
}
8065

8166
fun copyCrashDetails(view: View) {

app/src/main/kotlin/com/fox2code/mmm/MainActivity.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -624,12 +624,11 @@ class MainActivity : AppCompatActivity(), OnRefreshListener, OverScrollHelper {
624624
moduleViewListBuilder.addNotification(
625625
NotificationType.MAGISK_OUTDATED
626626
)
627-
} else {
628-
moduleViewListBuilder.addNotification(
629-
NotificationType.KSU_EXPERIMENTAL
630-
)
631627
}
632628
}
629+
if (InstallerInitializer.isKsu) {
630+
moduleViewListBuilder.addNotification(NotificationType.KSU_EXPERIMENTAL)
631+
}
633632
if (!MainApplication.isShowcaseMode) moduleViewListBuilder.addNotification(
634633
NotificationType.INSTALL_FROM_STORAGE
635634
)

app/src/main/kotlin/com/fox2code/mmm/MainApplication.kt

Lines changed: 10 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,12 @@
44

55
package com.fox2code.mmm
66

7-
import android.Manifest
87
import android.annotation.SuppressLint
98
import android.app.Activity
109
import android.app.ActivityManager
1110
import android.app.ActivityManager.RunningAppProcessInfo
1211
import android.app.Application
1312
import android.app.Application.ActivityLifecycleCallbacks
14-
import android.app.PendingIntent
1513
import android.content.Context
1614
import android.content.Intent
1715
import android.content.SharedPreferences
@@ -24,14 +22,13 @@ import android.util.Log
2422
import androidx.annotation.StyleRes
2523
import androidx.appcompat.app.AppCompatActivity
2624
import androidx.appcompat.view.ContextThemeWrapper
27-
import androidx.core.app.ActivityCompat
28-
import androidx.core.app.NotificationCompat
2925
import androidx.core.app.NotificationManagerCompat
3026
import androidx.emoji2.text.DefaultEmojiCompatConfig
3127
import androidx.emoji2.text.EmojiCompat
3228
import androidx.security.crypto.EncryptedSharedPreferences
3329
import androidx.security.crypto.MasterKey
3430
import androidx.work.Configuration
31+
import cat.ereza.customactivityoncrash.config.CaocConfig
3532
import com.fox2code.mmm.installer.InstallerInitializer
3633
import com.fox2code.mmm.installer.InstallerInitializer.Companion.peekMagiskVersion
3734
import com.fox2code.mmm.manager.LocalModuleInfo
@@ -51,8 +48,6 @@ import ly.count.android.sdk.Countly
5148
import ly.count.android.sdk.CountlyConfig
5249
import timber.log.Timber
5350
import java.io.File
54-
import java.io.PrintWriter
55-
import java.io.StringWriter
5651
import java.security.SecureRandom
5752
import java.text.SimpleDateFormat
5853
import java.util.Date
@@ -204,53 +199,15 @@ class MainApplication : Application(), Configuration.Provider, ActivityLifecycle
204199
get() = !this.isLightTheme
205200

206201
override fun onCreate() {
207-
208-
Thread.setDefaultUncaughtExceptionHandler { _: Thread?, throwable: Throwable ->
209-
clearCachedSharedPrefs()
210-
// send high importance notification with pending intent to open CrashHandler activity with stacktrace
211-
val intent = Intent(this, CrashHandler::class.java)
212-
intent.putExtra("exception", throwable)
213-
intent.putExtra("isCrashing", true)
214-
intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
215-
val pendingIntent = PendingIntent.getActivity(
216-
this, 0, intent,
217-
PendingIntent.FLAG_CANCEL_CURRENT or PendingIntent.FLAG_IMMUTABLE
218-
)
219-
// set pref
220-
val sharedPreferences = getPreferences("mmm")
221-
val editor = sharedPreferences!!.edit()
222-
editor.putBoolean("pref_crashed", true)
223-
val stringWriter = StringWriter()
224-
throwable.printStackTrace(PrintWriter(stringWriter))
225-
val stacktrace = stringWriter.toString()
226-
editor.putString("pref_crash_stacktrace", stacktrace)
227-
editor.apply()
228-
val crashreportingenabled = sharedPreferences.getBoolean(
229-
"pref_crashreportingenabled",
230-
true
231-
)
232-
// send notification
233-
val notificationManagerCompat = NotificationManagerCompat.from(this)
234-
val notifBody = if (crashreportingenabled) getString(R.string.crash_notification_body) else getString(
235-
R.string.crash_notification_body_noreport
236-
)
237-
val notification = NotificationCompat.Builder(this, "crash")
238-
.setSmallIcon(R.drawable.ic_baseline_error_24)
239-
.setContentTitle(getString(R.string.crash_notification_title))
240-
.setContentText(notifBody)
241-
.setPriority(NotificationCompat.PRIORITY_HIGH)
242-
.setCategory(NotificationCompat.CATEGORY_ERROR)
243-
.setContentIntent(pendingIntent)
244-
.setAutoCancel(true)
245-
.build()
246-
if (ActivityCompat.checkSelfPermission(
247-
this,
248-
Manifest.permission.POST_NOTIFICATIONS
249-
) == PackageManager.PERMISSION_GRANTED
250-
) {
251-
notificationManagerCompat.notify(0, notification)
252-
}
253-
}
202+
super.onCreate()
203+
CaocConfig.Builder.create()
204+
.backgroundMode(CaocConfig.BACKGROUND_MODE_SILENT) //default: CaocConfig.BACKGROUND_MODE_SHOW_CUSTOM
205+
.enabled(true) //default: true
206+
.trackActivities(true) //default: false
207+
.minTimeBetweenCrashesMs(2000)
208+
.restartActivity(MainActivity::class.java) //default: null (your app's launch activity)
209+
.errorActivity(CrashHandler::class.java) //default: null (default error activity)
210+
.apply()
254211
supportedLocales.addAll(
255212
listOf(
256213
"ar",
@@ -280,7 +237,6 @@ class MainApplication : Application(), Configuration.Provider, ActivityLifecycle
280237
)
281238
if (INSTANCE == null) INSTANCE = this
282239
relPackageName = this.packageName
283-
super.onCreate()
284240
var output = Shell.cmd("echo $(id -u)").exec().out[0]
285241
if (output != null) {
286242
output = output.trim { it <= ' ' }

app/src/main/kotlin/com/fox2code/mmm/installer/InstallerInitializer.kt

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -128,20 +128,20 @@ class InstallerInitializer {
128128
}
129129
}
130130
try {
131-
if (!Shell.cmd(
132-
"if grep ' / ' /proc/mounts | grep -q '/dev/root' &> /dev/null; " + "then echo true; else echo false; fi",
133-
"su -V",
131+
if (Shell.cmd(
132+
"if grep ' / ' /proc/mounts | grep -q '/dev/root' &> /dev/null; " + "then echo true; else echo false; fi"
134133
).to(output).exec().isSuccess
135134
) {
136-
if (MainApplication.forceDebugLogging) {
137-
Timber.i("Failed to search for ramdisk")
138-
}
139135
if (output.size != 0) {
140136
hsRmdsk = "false" == output[0] || "true".equals(
141137
System.getProperty("ro.build.ab_update"), ignoreCase = true
142138
)
143139
}
144140
Companion.hsRmdsk = hsRmdsk
141+
} else {
142+
if (MainApplication.forceDebugLogging) {
143+
Timber.e("Failed to check for ramdisk")
144+
}
145145
return null
146146
}
147147
if (MainApplication.forceDebugLogging) {
@@ -165,34 +165,24 @@ class InstallerInitializer {
165165
}
166166
} else if (Shell.cmd(
167167
"if [ -d /data/adb/ksu ]; then echo true; else echo false; fi",
168-
"su -V"
168+
"/data/adb/ksud -V"
169169
).to(
170170
output
171171
).exec().isSuccess && "true" == output[0]
172172
) {
173-
// check su -v for kernelsu
174-
val suVer: ArrayList<String> = ArrayList()
175-
Shell.cmd("su -v").to(suVer).exec()
176-
if (suVer.size > 0 && suVer[0].contains("ksu") || suVer[0].contains(
177-
"Kernelsu",
178-
true
179-
)
180-
) {
181-
if (MainApplication.forceDebugLogging) {
182-
Timber.i("Kernelsu detected")
183-
}
184-
mgskPth = "/data/adb"
185-
isKsu = true
186-
// if analytics enabled, set breadcrumb for countly
187-
if (MainApplication.analyticsAllowed()) {
188-
Countly.sharedInstance().crashes().addCrashBreadcrumb("ksu detected")
189-
}
190-
} else {
191-
if (MainApplication.forceDebugLogging) {
192-
Timber.e("[ANOMALY] Kernelsu not detected but /data/adb/ksu exists")
193-
}
194-
return null
173+
if (MainApplication.forceDebugLogging) {
174+
Timber.i("Kernelsu detected")
175+
}
176+
mgskPth = "/data/adb"
177+
isKsu = true
178+
// if analytics enabled, set breadcrumb for countly
179+
if (MainApplication.analyticsAllowed()) {
180+
Countly.sharedInstance().crashes().addCrashBreadcrumb("ksu detected")
181+
}
182+
if (MainApplication.forceDebugLogging) {
183+
Timber.e("[ANOMALY] Kernelsu not detected but /data/adb/ksu exists - maybe outdated?")
195184
}
185+
return mgskPth
196186
} else {
197187
if (MainApplication.forceDebugLogging) {
198188
Timber.e("Failed to get Magisk path")

0 commit comments

Comments
 (0)