Skip to content

Commit ffb074f

Browse files
coolzyd666Z User
andauthored
fix: resolve NoSuchMethodError for Application.getProcessName() on API 26-27 (#150)
Application.getProcessName() is only available from API 28 (Android P). On devices running API 26-27 (Android Oreo), calling this method directly causes NoSuchMethodError crash at app startup in SafeFileProvider. - SafeFileProvider.kt: Use getProcessNameCompat() with fallback to ActivityManager.getRunningAppProcesses() for API < 28 - APatchApp.kt: Same compatibility fix for process name detection Co-authored-by: Z User <z@container>
1 parent cea9271 commit ffb074f

2 files changed

Lines changed: 40 additions & 2 deletions

File tree

app/src/main/java/me/bmax/apatch/APatchApp.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
package me.bmax.apatch
22

3+
import android.app.ActivityManager
34
import android.app.Application
45
import android.content.Context
56
import android.content.Intent
67
import android.content.SharedPreferences
78
import android.os.Build
9+
import android.os.Process
810
import android.util.Log
911
import me.bmax.apatch.util.ui.showToast
1012
import androidx.core.content.edit
@@ -344,7 +346,8 @@ class APApplication : Application(), Thread.UncaughtExceptionHandler, ImageLoade
344346
apApp = this
345347
sharedPreferences = getSharedPreferences(SP_NAME, Context.MODE_PRIVATE)
346348
superKey = "su"
347-
if (Application.getProcessName().endsWith(":root") || Application.getProcessName().endsWith(":webui")) {
349+
val processName = getProcessNameCompat()
350+
if (processName.endsWith(":root") || processName.endsWith(":webui")) {
348351
return
349352
}
350353
bypassHiddenApiRestrictions()
@@ -431,6 +434,21 @@ class APApplication : Application(), Thread.UncaughtExceptionHandler, ImageLoade
431434
sharedPreferences.edit { putBoolean(SHOW_BACKUP_WARN, state) }
432435
}
433436

437+
/**
438+
* Compatibility helper to get the current process name.
439+
* Application.getProcessName() is only available from API 28 (Android P).
440+
* On API 26-27, fall back to ActivityManager.getRunningAppProcesses().
441+
*/
442+
private fun getProcessNameCompat(): String {
443+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
444+
return Application.getProcessName()
445+
}
446+
// Fallback for API 26-27
447+
val am = getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager ?: return packageName
448+
val pid = Process.myPid()
449+
return am.runningAppProcesses?.find { it.pid == pid }?.processName ?: packageName
450+
}
451+
434452
override fun uncaughtException(t: Thread, e: Throwable) {
435453
val exceptionMessage = Log.getStackTraceString(e)
436454
val threadName = t.name

app/src/main/java/me/bmax/apatch/util/SafeFileProvider.kt

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,21 @@
11
package me.bmax.apatch.util
22

3+
import android.app.ActivityManager
34
import android.app.Application
5+
import android.content.Context
46
import android.database.Cursor
57
import android.database.MatrixCursor
68
import android.net.Uri
9+
import android.os.Build
710
import android.os.ParcelFileDescriptor
11+
import android.os.Process
812
import androidx.core.content.FileProvider
913

1014
class SafeFileProvider : FileProvider() {
1115
private var shouldInit = false
1216

1317
override fun onCreate(): Boolean {
14-
val processName = Application.getProcessName()
18+
val processName = getProcessNameCompat()
1519
shouldInit = !processName.endsWith(":root") && !processName.endsWith(":webui")
1620
if (!shouldInit) return false
1721
return try {
@@ -49,4 +53,20 @@ class SafeFileProvider : FileProvider() {
4953
null
5054
}
5155
}
56+
57+
/**
58+
* Compatibility helper to get the current process name.
59+
* Application.getProcessName() is only available from API 28 (Android P).
60+
* On API 26-27, fall back to ActivityManager.getRunningAppProcesses().
61+
*/
62+
private fun getProcessNameCompat(): String {
63+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
64+
return Application.getProcessName()
65+
}
66+
// Fallback for API 26-27
67+
val context = context ?: return ""
68+
val am = context.getSystemService(Context.ACTIVITY_SERVICE) as? ActivityManager ?: return ""
69+
val pid = Process.myPid()
70+
return am.runningAppProcesses?.find { it.pid == pid }?.processName ?: context.packageName
71+
}
5272
}

0 commit comments

Comments
 (0)