mirror of
https://github.com/ReVanced/revanced-library.git
synced 2026-01-11 22:06:18 +00:00
Compare commits
12 Commits
v3.0.2
...
dependabot
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c71fc671ae | ||
|
|
0673307204 | ||
|
|
5df2bb81bf | ||
|
|
be0f6bf247 | ||
|
|
9d060c188f | ||
|
|
254f36d03c | ||
|
|
4065c87d5f | ||
|
|
be8d7bf643 | ||
|
|
2328902b6b | ||
|
|
7ec6504619 | ||
|
|
e7a98b5795 | ||
|
|
649f06b19d |
40
CHANGELOG.md
40
CHANGELOG.md
@@ -1,3 +1,43 @@
|
||||
# [3.2.0-dev.1](https://github.com/ReVanced/revanced-library/compare/v3.1.1-dev.1...v3.2.0-dev.1) (2025-05-27)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Request the update ownership enforcement ([#71](https://github.com/ReVanced/revanced-library/issues/71)) ([be0f6bf](https://github.com/ReVanced/revanced-library/commit/be0f6bf247461d16fbf649a9f2dc6facbb5b0c93))
|
||||
|
||||
## [3.1.1-dev.1](https://github.com/ReVanced/revanced-library/compare/v3.1.0...v3.1.1-dev.1) (2025-05-02)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Interpret package name as a string instead of Regex when using grep ([#68](https://github.com/ReVanced/revanced-library/issues/68)) ([254f36d](https://github.com/ReVanced/revanced-library/commit/254f36d03cc8fd3e2508a5e8f69bb5c8e1eb9775))
|
||||
|
||||
# [3.1.0](https://github.com/ReVanced/revanced-library/compare/v3.0.2...v3.1.0) (2024-11-27)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Detect if app is installed by fixing inversion ([649f06b](https://github.com/ReVanced/revanced-library/commit/649f06b19dd4d2a3f3216a0b3ea947b9fe0d475f))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Warn when option could not be set because the option does not exist ([7ec6504](https://github.com/ReVanced/revanced-library/commit/7ec650461935faf2a8fbb667db3cf137157b70b5))
|
||||
|
||||
# [3.1.0-dev.1](https://github.com/ReVanced/revanced-library/compare/v3.0.3-dev.1...v3.1.0-dev.1) (2024-11-25)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Warn when option could not be set because the option does not exist ([7ec6504](https://github.com/ReVanced/revanced-library/commit/7ec650461935faf2a8fbb667db3cf137157b70b5))
|
||||
|
||||
## [3.0.3-dev.1](https://github.com/ReVanced/revanced-library/compare/v3.0.2...v3.0.3-dev.1) (2024-11-11)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Detect if app is installed by fixing inversion ([649f06b](https://github.com/ReVanced/revanced-library/commit/649f06b19dd4d2a3f3216a0b3ea947b9fe0d475f))
|
||||
|
||||
## [3.0.2](https://github.com/ReVanced/revanced-library/compare/v3.0.1...v3.0.2) (2024-11-05)
|
||||
|
||||
## [3.0.2-dev.1](https://github.com/ReVanced/revanced-library/compare/v3.0.1...v3.0.2-dev.1) (2024-11-05)
|
||||
|
||||
@@ -109,9 +109,9 @@ You can find the contribution guidelines [here](CONTRIBUTING.md).
|
||||
To build ReVanced Library,
|
||||
you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced-documentation).
|
||||
|
||||
## 📜 Licence
|
||||
## 📜 License
|
||||
|
||||
ReVanced Library is licensed under the GPLv3 license. Please see the [licence file](LICENSE) for more information.
|
||||
ReVanced Library is licensed under the GPLv3 license. Please see the [license file](LICENSE) for more information.
|
||||
[tl;dr](https://www.tldrlegal.com/license/gnu-general-public-license-v3-gpl-3) you may copy, distribute and modify ReVanced Library as long as you track changes/dates in source files.
|
||||
Any modifications to ReVanced Library must also be made available under the GPL,
|
||||
along with build & install instructions.
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
version = 3.0.2
|
||||
version = 3.2.0-dev.1
|
||||
#Gradle
|
||||
org.gradle.jvmargs = -Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options="-Xmx2048M"
|
||||
org.gradle.caching = true
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
[versions]
|
||||
android = "8.5.2"
|
||||
android = "8.13.2"
|
||||
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"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,11 +19,16 @@ private val logger = Logger.getLogger("Options")
|
||||
* @param options The options to set. The key is the patch name and the value is a map of option keys to option values.
|
||||
*/
|
||||
fun Set<Patch<*>>.setOptions(options: PatchesOptions) = filter { it.name != null }.forEach { patch ->
|
||||
val patchOptions = options[patch.name] ?: return@forEach
|
||||
options[patch.name]?.forEach setOption@{ (optionKey, optionValue) ->
|
||||
if (optionKey !in patch.options) {
|
||||
return@setOption logger.warning(
|
||||
"Could not set option for the \"${patch.name}\" patch because " +
|
||||
"option with key \"${optionKey}\" does not exist",
|
||||
)
|
||||
}
|
||||
|
||||
patch.options.forEach option@{ option ->
|
||||
try {
|
||||
patch.options[option.key] = patchOptions[option.key] ?: return@option
|
||||
patch.options[optionKey] = optionValue
|
||||
} catch (e: OptionException) {
|
||||
logger.warning("Could not set option value for the \"${patch.name}\" patch: ${e.message}")
|
||||
}
|
||||
|
||||
@@ -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<AdbInstallerResult, Installation>() {
|
||||
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)
|
||||
|
||||
@@ -4,26 +4,28 @@ package app.revanced.library.installation.installer
|
||||
internal object Constants {
|
||||
const val PLACEHOLDER = "PLACEHOLDER"
|
||||
|
||||
const val SELINUX_CONTEXT = "u:object_r:apk_data_file:s0"
|
||||
const val TMP_FILE_PATH = "/data/local/tmp/revanced.tmp"
|
||||
const val MOUNT_PATH = "/data/adb/revanced/"
|
||||
const val MOUNTED_APK_PATH = "$MOUNT_PATH$PLACEHOLDER.apk"
|
||||
const val MOUNT_SCRIPT_PATH = "/data/adb/service.d/mount_revanced_$PLACEHOLDER.sh"
|
||||
|
||||
const val EXISTS = "[[ -f $PLACEHOLDER ]] || exit 1"
|
||||
const val MOUNT_GREP = "grep $PLACEHOLDER /proc/mounts"
|
||||
const val MOUNT_GREP = "grep -F $PLACEHOLDER /proc/mounts"
|
||||
const val DELETE = "rm -rf $PLACEHOLDER"
|
||||
const val CREATE_DIR = "mkdir -p"
|
||||
const val RESTART = "am start -S $PLACEHOLDER"
|
||||
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 && " +
|
||||
"chmod 644 \$base_path && " +
|
||||
"chown system:system \$base_path && " +
|
||||
"chcon u:object_r:apk_data_file:s0 \$base_path"
|
||||
"chcon $SELINUX_CONTEXT \$base_path"
|
||||
|
||||
const val UMOUNT =
|
||||
"grep $PLACEHOLDER /proc/mounts | " +
|
||||
@@ -52,7 +54,7 @@ internal object Constants {
|
||||
|
||||
base_path="$MOUNTED_APK_PATH"
|
||||
|
||||
chcon u:object_r:apk_data_file:s0 ${'$'}base_path
|
||||
chcon $SELINUX_CONTEXT ${'$'}base_path
|
||||
|
||||
# Use Magisk mirror, if possible.
|
||||
if command -v magisk &> /dev/null; then
|
||||
|
||||
@@ -122,13 +122,12 @@ abstract class RootInstaller internal constructor(
|
||||
* @throws FailedToFindInstalledPackageException If the package is not installed.
|
||||
*/
|
||||
private fun String.assertInstalled() {
|
||||
if (INSTALLED_APK_PATH(this)().output.isNotEmpty()) {
|
||||
if (INSTALLED_APK_PATH(this)().output.isEmpty()) {
|
||||
throw FailedToFindInstalledPackageException(this)
|
||||
}
|
||||
}
|
||||
|
||||
internal class FailedToFindInstalledPackageException internal constructor(packageName: String) :
|
||||
Exception("Failed to find installed package \"$packageName\" because no activity was found")
|
||||
internal class FailedToFindInstalledPackageException internal constructor(packageName: String) : Exception("Failed to find installed package \"$packageName\" because no activity was found")
|
||||
|
||||
internal class PackageNameRequiredException internal constructor() : Exception("Package name is required")
|
||||
internal class NoRootPermissionException internal constructor() : Exception("No root permission")
|
||||
|
||||
Reference in New Issue
Block a user