Skip to content

Commit 92d8c72

Browse files
committed
fix: detectHiddenMethod (#1200)
1 parent 9df4f1c commit 92d8c72

File tree

3 files changed

+39
-16
lines changed

3 files changed

+39
-16
lines changed

app/src/main/kotlin/li/songe/gkd/shizuku/ActivityTaskManager.kt

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import android.app.ActivityManager
44
import android.app.IActivityTaskManager
55
import android.view.Display
66
import li.songe.gkd.permission.shizukuGrantedState
7-
import li.songe.gkd.util.AndroidTarget
87
import li.songe.gkd.util.checkExistClass
98

109
object SafeTaskListener {
@@ -24,15 +23,28 @@ class SafeActivityTaskManager(private val value: IActivityTaskManager) {
2423
)?.let {
2524
SafeActivityTaskManager(IActivityTaskManager.Stub.asInterface(it))
2625
}
26+
27+
private val getTasksType by lazy {
28+
IActivityTaskManager::class.java.detectHiddenMethod(
29+
"getTasks",
30+
1 to listOf(Int::class.java),
31+
2 to listOf(Int::class.java, Boolean::class.java, Boolean::class.java),
32+
3 to listOf(
33+
Int::class.java,
34+
Boolean::class.java,
35+
Boolean::class.java,
36+
Int::class.java
37+
),
38+
)
39+
}
2740
}
2841

2942
fun getTasks(maxNum: Int): List<ActivityManager.RunningTaskInfo>? = safeInvokeMethod {
30-
if (AndroidTarget.TIRAMISU) {
31-
value.getTasks(maxNum, false, false, Display.INVALID_DISPLAY)
32-
} else if (AndroidTarget.S) {
33-
value.getTasks(maxNum, false, false)
34-
} else {
35-
value.getTasks(maxNum)
43+
when (getTasksType) {
44+
1 -> value.getTasks(maxNum)
45+
2 -> value.getTasks(maxNum, false, false)
46+
3 -> value.getTasks(maxNum, false, false, Display.INVALID_DISPLAY)
47+
else -> value.getTasks(maxNum)
3648
}
3749
}
3850

app/src/main/kotlin/li/songe/gkd/shizuku/ShizukuApi.kt

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,22 @@ fun getStubService(name: String, condition: Boolean): ShizukuBinderWrapper? {
4343
return ShizukuBinderWrapper(service)
4444
}
4545

46+
fun Class<*>.detectHiddenMethod(
47+
methodName: String,
48+
vararg args: Pair<Int, List<Class<*>>>,
49+
): Int {
50+
val method = declaredMethods.find {
51+
it.name == methodName
52+
} ?: throw NoSuchMethodException()
53+
val types = method.parameterTypes.toList()
54+
args.forEach { (value, argTypes) ->
55+
if (types == argTypes) {
56+
return value
57+
}
58+
}
59+
throw NoSuchMethodException()
60+
}
61+
4662
class ShizukuContext(
4763
val serviceWrapper: UserServiceWrapper?,
4864
val packageManager: SafePackageManager?,

hidden_api/src/main/java/android/app/IActivityTaskManager.java

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,29 @@
11
package android.app;
22

33
import android.os.Binder;
4-
import android.os.Build;
54
import android.os.IBinder;
65
import android.os.IInterface;
76

8-
import androidx.annotation.DeprecatedSinceApi;
9-
import androidx.annotation.RequiresApi;
10-
117
import java.util.List;
128

139
/**
1410
* @noinspection unused
1511
*/
16-
//@RequiresApi(api = Build.VERSION_CODES.Q)
1712
public interface IActivityTaskManager extends IInterface {
13+
// android10+
1814
abstract class Stub extends Binder implements IActivityTaskManager {
1915
public static IActivityTaskManager asInterface(IBinder obj) {
2016
throw new RuntimeException("Stub!");
2117
}
2218
}
2319

24-
@DeprecatedSinceApi(api = Build.VERSION_CODES.R, message = "NoSuchMethodError")
20+
// android10 - android11
2521
List<ActivityManager.RunningTaskInfo> getTasks(int maxNum);
2622

27-
@DeprecatedSinceApi(api = Build.VERSION_CODES.TIRAMISU, message = "NoSuchMethodError")
28-
@RequiresApi(Build.VERSION_CODES.S)
23+
// android12 - android-13.0.0_r15
2924
List<ActivityManager.RunningTaskInfo> getTasks(int maxNum, boolean filterOnlyVisibleRecents, boolean keepIntentExtra);
3025

31-
@RequiresApi(Build.VERSION_CODES.TIRAMISU)
26+
// android-13.0.0_r16+
3227
List<ActivityManager.RunningTaskInfo> getTasks(int maxNum, boolean filterOnlyVisibleRecents, boolean keepIntentExtra, int displayId);
3328

3429
void registerTaskStackListener(ITaskStackListener listener);

0 commit comments

Comments
 (0)