mirror of
https://github.com/mihonapp/mihon.git
synced 2025-12-10 07:22:25 +01:00
Fix shizuku installer not updating installed extensions (#2697)
Co-authored-by: AntsyLich <59261191+AntsyLich@users.noreply.github.com>
This commit is contained in:
@@ -13,6 +13,7 @@ The format is a modified version of [Keep a Changelog](https://keepachangelog.co
|
|||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
### Fixed
|
### Fixed
|
||||||
- Fix reader tap zones triggering after scrolling is stopped by tapping ([@NGB-Was-Taken](https://github.com/NGB-Was-Taken)) ([#2680](https://github.com/mihonapp/mihon/pull/2680))
|
- Fix reader tap zones triggering after scrolling is stopped by tapping ([@NGB-Was-Taken](https://github.com/NGB-Was-Taken)) ([#2680](https://github.com/mihonapp/mihon/pull/2680))
|
||||||
|
- Fix shizuku installer not updating installed extensions ([@NGB-Was-Taken](https://github.com/NGB-Was-Taken)) ([#2697](https://github.com/mihonapp/mihon/pull/2697))
|
||||||
|
|
||||||
## [v0.19.3] - 2025-11-07
|
## [v0.19.3] - 2025-11-07
|
||||||
### Improved
|
### Improved
|
||||||
|
|||||||
@@ -75,6 +75,12 @@ class ShellInterface : IShellInterface.Stub() {
|
|||||||
.invoke(pmInterface)
|
.invoke(pmInterface)
|
||||||
|
|
||||||
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL).apply {
|
val params = PackageInstaller.SessionParams(PackageInstaller.SessionParams.MODE_FULL_INSTALL).apply {
|
||||||
|
val installFlags = this::class.java.getField("installFlags")
|
||||||
|
installFlags.set(
|
||||||
|
this,
|
||||||
|
installFlags.getInt(this) or REPLACE_EXISTING_INSTALL_FLAG,
|
||||||
|
)
|
||||||
|
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
setPackageSource(PackageInstaller.PACKAGE_SOURCE_STORE)
|
setPackageSource(PackageInstaller.PACKAGE_SOURCE_STORE)
|
||||||
}
|
}
|
||||||
@@ -105,26 +111,27 @@ class ShellInterface : IShellInterface.Stub() {
|
|||||||
.getMethod("openSession", Int::class.java)
|
.getMethod("openSession", Int::class.java)
|
||||||
.invoke(packageInstaller, sessionId)
|
.invoke(packageInstaller, sessionId)
|
||||||
|
|
||||||
(
|
session::class.java.getMethod(
|
||||||
session::class.java.getMethod(
|
"openWrite",
|
||||||
"openWrite",
|
String::class.java,
|
||||||
String::class.java,
|
Long::class.java,
|
||||||
Long::class.java,
|
Long::class.java,
|
||||||
Long::class.java,
|
)
|
||||||
).invoke(session, "extension", 0L, apk.length) as ParcelFileDescriptor
|
.invoke(session, "extension", 0L, apk.length)
|
||||||
).let { fd ->
|
.let { it as ParcelFileDescriptor }
|
||||||
val revocable = Class.forName("android.os.SystemProperties")
|
.let { fd ->
|
||||||
.getMethod("getBoolean", String::class.java, Boolean::class.java)
|
val revocable = Class.forName("android.os.SystemProperties")
|
||||||
.invoke(null, "fw.revocable_fd", false) as Boolean
|
.getMethod("getBoolean", String::class.java, Boolean::class.java)
|
||||||
|
.invoke(null, "fw.revocable_fd", false) as Boolean
|
||||||
|
|
||||||
if (revocable) {
|
if (revocable) {
|
||||||
ParcelFileDescriptor.AutoCloseOutputStream(fd)
|
ParcelFileDescriptor.AutoCloseOutputStream(fd)
|
||||||
} else {
|
} else {
|
||||||
Class.forName($$"android.os.FileBridge$FileBridgeOutputStream")
|
Class.forName($$"android.os.FileBridge$FileBridgeOutputStream")
|
||||||
.getConstructor(ParcelFileDescriptor::class.java)
|
.getConstructor(ParcelFileDescriptor::class.java)
|
||||||
.newInstance(fd) as OutputStream
|
.newInstance(fd) as OutputStream
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
.use { output ->
|
.use { output ->
|
||||||
apk.createInputStream().use { input -> input.copyTo(output) }
|
apk.createInputStream().use { input -> input.copyTo(output) }
|
||||||
}
|
}
|
||||||
@@ -174,3 +181,7 @@ class ShellInterface : IShellInterface.Stub() {
|
|||||||
return shellContext.createPackageContext("com.android.shell", 0)
|
return shellContext.createPackageContext("com.android.shell", 0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Constant hidden from the SDK
|
||||||
|
// https://cs.android.com/android/platform/superproject/main/+/512046e84bcc51cc241bc6599f83ab345e93ab12:frameworks/base/core/java/android/content/pm/PackageManager.java;l=1682-1689
|
||||||
|
private const val REPLACE_EXISTING_INSTALL_FLAG = 0x00000002
|
||||||
|
|||||||
Reference in New Issue
Block a user