From d9224da71ad9a71b5d8d04eaf1eeda716787b36a Mon Sep 17 00:00:00 2001 From: jackyzy823 Date: Sat, 15 Aug 2026 01:02:02 +0800 Subject: [PATCH] Fix for return type of 'getInstalledPackages' changing in SDK 37 Reference: https://github.com/MuntashirAkon/AppManager/commit/836c7248eafe5d7b73e21d919eb31c34dd06a348 --- .../com/dergoogler/mmrl/compat/BuildCompat.kt | 3 +++ .../android/content/pm/IPackageManagerV37.java | 14 ++++++++++++++ .../android/content/pm/PackageInfoList.java | 18 ++++++++++++++++++ platform/build.gradle.kts | 4 +++- .../platform/hiddenApi/HiddenPackageManager.kt | 7 ++++++- 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 hidden-api/src/main/java/android/content/pm/IPackageManagerV37.java create mode 100644 hidden-api/src/main/java/android/content/pm/PackageInfoList.java diff --git a/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt b/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt index 042ba540e..007191682 100644 --- a/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt +++ b/compat/src/main/kotlin/com/dergoogler/mmrl/compat/BuildCompat.kt @@ -4,6 +4,9 @@ import android.os.Build import androidx.annotation.ChecksSdkIntAtLeast object BuildCompat { + @get:ChecksSdkIntAtLeast(api = 37) + val atLeastC get() = Build.VERSION.SDK_INT >= 37 + @get:ChecksSdkIntAtLeast(api = Build.VERSION_CODES.VANILLA_ICE_CREAM) val atLeastV get() = Build.VERSION.SDK_INT >= Build.VERSION_CODES.VANILLA_ICE_CREAM diff --git a/hidden-api/src/main/java/android/content/pm/IPackageManagerV37.java b/hidden-api/src/main/java/android/content/pm/IPackageManagerV37.java new file mode 100644 index 000000000..0e85f0556 --- /dev/null +++ b/hidden-api/src/main/java/android/content/pm/IPackageManagerV37.java @@ -0,0 +1,14 @@ +package android.content.pm; + +import android.os.IInterface; +import android.os.RemoteException; + +import androidx.annotation.RequiresApi; + +import dev.rikka.tools.refine.RefineAs; + +@RequiresApi(37) +@RefineAs(IPackageManager.class) +public interface IPackageManagerV37 extends IInterface { + PackageInfoList getInstalledPackages(long flags, int userId) throws RemoteException; +} diff --git a/hidden-api/src/main/java/android/content/pm/PackageInfoList.java b/hidden-api/src/main/java/android/content/pm/PackageInfoList.java new file mode 100644 index 000000000..7c615d218 --- /dev/null +++ b/hidden-api/src/main/java/android/content/pm/PackageInfoList.java @@ -0,0 +1,18 @@ +package android.content.pm; + +import android.content.pm.PackageInfo; +import java.util.List; + +import androidx.annotation.RequiresApi; + +@RequiresApi(37) +public final class PackageInfoList extends ParceledListSlice { + public static PackageInfoList emptyList() { + throw new RuntimeException("Stub!"); + } + + public PackageInfoList(List list) { + super(list); + throw new RuntimeException("Stub!"); + } +} diff --git a/platform/build.gradle.kts b/platform/build.gradle.kts index 345fbf288..9d83ea639 100644 --- a/platform/build.gradle.kts +++ b/platform/build.gradle.kts @@ -7,6 +7,7 @@ plugins { alias(libs.plugins.kotlin.parcelize) alias(libs.plugins.ksp) alias(libs.plugins.kotlin.serialization) + alias(libs.plugins.rikka.refine) } android { @@ -91,6 +92,7 @@ dependencies { implementation(libs.kotlinx.serialization.json) implementation(libs.kotlinx.serialization.protobuf) implementation(libs.square.moshi) + implementation(libs.rikka.refine.runtime) ksp(libs.square.moshi.kotlin) } @@ -104,4 +106,4 @@ fun generateRandomName( return (1..length) .map { chars[random.nextInt(chars.length)] } .joinToString("") -} \ No newline at end of file +} diff --git a/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt b/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt index b1a2d6b48..d5f2d3a65 100644 --- a/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt +++ b/platform/src/main/kotlin/com/dergoogler/mmrl/platform/hiddenApi/HiddenPackageManager.kt @@ -5,6 +5,7 @@ package com.dergoogler.mmrl.platform.hiddenApi import android.content.Intent import android.content.pm.ApplicationInfo import android.content.pm.IPackageManager +import android.content.pm.IPackageManagerV37 import android.content.pm.PackageInfo import android.content.pm.ResolveInfo import android.os.SystemProperties @@ -13,6 +14,8 @@ import com.dergoogler.mmrl.compat.BuildCompat import com.dergoogler.mmrl.platform.PlatformManager.getSystemService import com.dergoogler.mmrl.platform.stub.IServiceManager +import dev.rikka.tools.refine.Refine; + class HiddenPackageManager( private val service: IServiceManager, ) { @@ -59,7 +62,9 @@ class HiddenPackageManager( flags: Int, userId: Int, ): List = - if (BuildCompat.atLeastT) { + if (BuildCompat.atLeastC) { + Refine.unsafeCast(packageManager).getInstalledPackages(flags.toLong(), userId).list + } else if (BuildCompat.atLeastT) { packageManager.getInstalledPackages(flags.toLong(), userId) } else { packageManager.getInstalledPackages(flags, userId)