diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 6988866..d1cde0c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -4,7 +4,7 @@ bcpkix-jdk18on = "1.77" binary-compatibility-validator = "0.15.1" core-ktx = "1.15.0" guava = "33.2.1-jre" -jadb = "1.2.1" +jadb = "1.2.1.1" kotlin = "2.0.20" kotlinx-coroutines = "1.8.1" kotlinx-serialization = "1.7.1" diff --git a/src/androidMain/kotlin/app/revanced/library/installation/installer/LocalInstaller.kt b/src/androidMain/kotlin/app/revanced/library/installation/installer/LocalInstaller.kt index cb3bf48..e5e0485 100644 --- a/src/androidMain/kotlin/app/revanced/library/installation/installer/LocalInstaller.kt +++ b/src/androidMain/kotlin/app/revanced/library/installation/installer/LocalInstaller.kt @@ -8,6 +8,7 @@ import android.content.Intent import android.content.IntentFilter import android.content.pm.PackageInstaller import android.content.pm.PackageManager +import android.os.Build import androidx.core.content.ContextCompat import app.revanced.library.installation.installer.Installer.Apk import java.io.Closeable @@ -85,10 +86,13 @@ class LocalInstaller( override fun close() = context.unregisterReceiver(broadcastReceiver) + @SuppressLint("MissingPermission") companion object { private val sessionParams = PackageInstaller.SessionParams( PackageInstaller.SessionParams.MODE_FULL_INSTALL, ).apply { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + setRequestUpdateOwnership(true) setInstallReason(PackageManager.INSTALL_REASON_USER) } diff --git a/src/commonMain/kotlin/app/revanced/library/installation/installer/AdbInstaller.kt b/src/commonMain/kotlin/app/revanced/library/installation/installer/AdbInstaller.kt index c8e389c..f781f04 100644 --- a/src/commonMain/kotlin/app/revanced/library/installation/installer/AdbInstaller.kt +++ b/src/commonMain/kotlin/app/revanced/library/installation/installer/AdbInstaller.kt @@ -1,11 +1,13 @@ package app.revanced.library.installation.installer import app.revanced.library.installation.command.AdbShellCommandRunner +import app.revanced.library.installation.command.ShellCommandRunner +import app.revanced.library.installation.installer.Constants.GET_SDK_VERSION import app.revanced.library.installation.installer.Constants.INSTALLED_APK_PATH -import app.revanced.library.installation.installer.Installer.Apk import se.vidstige.jadb.JadbException import se.vidstige.jadb.managers.Package import se.vidstige.jadb.managers.PackageManager +import se.vidstige.jadb.managers.PackageManager.UPDATE_OWNERSHIP /** * [AdbInstaller] for installing and uninstalling [Apk] files using ADB. @@ -17,18 +19,23 @@ import se.vidstige.jadb.managers.PackageManager class AdbInstaller( deviceSerial: String? = null, ) : Installer() { - private val device = getDevice(deviceSerial, logger) - private val adbShellCommandRunner = AdbShellCommandRunner(device) - private val packageManager = PackageManager(device) + private val shellCommandRunner: ShellCommandRunner + private val packageManager: PackageManager init { + val device = getDevice(deviceSerial, logger) + shellCommandRunner = AdbShellCommandRunner(device) + packageManager = PackageManager(device) + logger.fine("Connected to $deviceSerial") } override suspend fun install(apk: Apk): AdbInstallerResult { - logger.info("Installing ${apk.file.name}") - - return runPackageManager { install(apk.file) } + return runPackageManager { + val sdkVersion = shellCommandRunner(GET_SDK_VERSION).output.toInt() + if (sdkVersion < 34) install(apk.file) + else installWithOptions(apk.file, listOf(UPDATE_OWNERSHIP)) + } } override suspend fun uninstall(packageName: String): AdbInstallerResult { @@ -39,7 +46,7 @@ class AdbInstaller( override suspend fun getInstallation(packageName: String): Installation? = packageManager.packages.find { it.toString() == packageName - }?.let { Installation(adbShellCommandRunner(INSTALLED_APK_PATH).output) } + }?.let { Installation(shellCommandRunner(INSTALLED_APK_PATH).output) } private fun runPackageManager(block: PackageManager.() -> Unit) = try { packageManager.run(block) diff --git a/src/commonMain/kotlin/app/revanced/library/installation/installer/Constants.kt b/src/commonMain/kotlin/app/revanced/library/installation/installer/Constants.kt index 24d9da1..d9ca680 100644 --- a/src/commonMain/kotlin/app/revanced/library/installation/installer/Constants.kt +++ b/src/commonMain/kotlin/app/revanced/library/installation/installer/Constants.kt @@ -17,7 +17,8 @@ internal object Constants { const val KILL = "am force-stop $PLACEHOLDER" const val INSTALLED_APK_PATH = "pm path $PLACEHOLDER" const val CREATE_INSTALLATION_PATH = "$CREATE_DIR $MOUNT_PATH" - + const val GET_SDK_VERSION = "getprop ro.build.version.sdk" + const val MOUNT_APK = "base_path=\"$MOUNTED_APK_PATH\" && " + "mv $TMP_FILE_PATH \$base_path && " +