Skip to content

Commit e4bd78d

Browse files
committed
fix: parameter type changed in Android 13
Android 13 changes the flag parameter of `generatePackageInfo(...)` from an `int` to a `long` Fixes #1
1 parent 070424f commit e4bd78d

File tree

2 files changed

+17
-8
lines changed

2 files changed

+17
-8
lines changed

app/build.gradle.kts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,6 @@ android {
4949
}
5050
}
5151

52-
tasks.withType<JavaCompile> {
53-
options.compilerArgs.add("-Xlint:-deprecation")
54-
}
55-
5652
dependencies {
5753
compileOnly("de.robv.android.xposed:api:82")
5854
}

app/src/main/java/dev/rushii/xspoofsignatures/Main.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import de.robv.android.xposed.*;
88
import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam;
99

10+
@SuppressWarnings("deprecation")
1011
public class Main implements IXposedHookLoadPackage {
1112
private static final String TAG = "XSpoofSignatures";
1213

@@ -51,20 +52,32 @@ public void handleLoadPackage(LoadPackageParam lpparam) {
5152
XC_MethodHook hook = new XC_MethodHook() {
5253
@Override
5354
protected void beforeHookedMethod(MethodHookParam param) {
54-
long flags = (long) param.args[1];
55+
// https://cs.android.com/android/platform/superproject/+/android-12.1.0_r5:frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java;l=3325;drc=32796cd24bf5b392d5e823d4c6abc4e2f1dfe4a2
56+
// https://cs.android.com/android/platform/superproject/+/android-13.0.0_r1:frameworks/base/services/core/java/com/android/server/pm/ComputerEngine.java;l=1594;drc=66acf93106a784172c39e6bbf5c22a1aa3563e0b
57+
long flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
58+
? (long) param.args[1]
59+
: (long) (int) param.args[1];
5560

5661
// Avoid getting metadata when not needed
5762
if (!isFetchingSignatures(flags)) return;
5863

59-
param.args[1] = flags | PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS;
64+
flags |= PackageManager.GET_META_DATA | PackageManager.GET_PERMISSIONS;
65+
66+
// Explicit cast to Object is needed, otherwise the compiler boxes the value into a Long for both branches??
67+
// I hate java
68+
param.args[1] = Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
69+
? (Object) flags
70+
: (Object) (int) flags;
6071
}
6172

6273
@Override
6374
protected void afterHookedMethod(MethodHookParam param) {
6475
PackageInfo pi = (PackageInfo) param.getResult();
6576
if (pi == null) return;
6677

67-
long flags = (long) param.args[1];
78+
long flags = param.args[1] instanceof Integer
79+
? (long) (int) param.args[1]
80+
: (long) param.args[1];
6881
if (!isFetchingSignatures(flags)) return;
6982

7083
// Get the declared fake signature from manifest meta-data
@@ -137,6 +150,6 @@ protected void afterHookedMethod(MethodHookParam param) {
137150
final String hookClassName = getHookClassName();
138151
final Class<?> hookClass = XposedHelpers.findClass(hookClassName, lpparam.classLoader);
139152
XposedBridge.hookAllMethods(hookClass, "generatePackageInfo", hook);
140-
Log.d(TAG, String.format("Hooking %s#generatePackageInfo(...)", hookClassName));
153+
Log.d(TAG, String.format("Hooking all %s#generatePackageInfo(...)", hookClassName));
141154
}
142155
}

0 commit comments

Comments
 (0)