mirror of
https://github.com/ReVanced/revanced-cli.git
synced 2026-01-11 22:06:20 +00:00
Compare commits
1 Commits
patcher22
...
chore/scri
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e87ee9c5b8 |
2
.github/workflows/build_pull_request.yml
vendored
2
.github/workflows/build_pull_request.yml
vendored
@@ -13,6 +13,8 @@ jobs:
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Cache Gradle
|
||||
uses: burrunan/gradle-cache-action@v1
|
||||
|
||||
17
.github/workflows/release.yml
vendored
17
.github/workflows/release.yml
vendored
@@ -12,12 +12,15 @@ jobs:
|
||||
name: Release
|
||||
permissions:
|
||||
contents: write
|
||||
id-token: write
|
||||
attestations: write
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v4
|
||||
with:
|
||||
# Make sure the release step uses its own credentials:
|
||||
# https://github.com/cycjimmy/semantic-release-action#private-packages
|
||||
persist-credentials: false
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Cache Gradle
|
||||
uses: burrunan/gradle-cache-action@v1
|
||||
@@ -44,14 +47,6 @@ jobs:
|
||||
fingerprint: ${{ vars.GPG_FINGERPRINT }}
|
||||
|
||||
- name: Release
|
||||
uses: cycjimmy/semantic-release-action@v4
|
||||
id: release
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
|
||||
- name: Attest
|
||||
if: steps.release.outputs.new_release_published == 'true'
|
||||
uses: actions/attest-build-provenance@v2
|
||||
with:
|
||||
subject-name: 'ReVanced CLI ${{ steps.release.outputs.new_release_git_tag }}'
|
||||
subject-path: build/libs/revanced-cli*.jar
|
||||
run: npm exec semantic-release
|
||||
|
||||
5
.gitignore
vendored
5
.gitignore
vendored
@@ -122,4 +122,7 @@ revanced-cache/
|
||||
options.toml
|
||||
|
||||
# Generated by Android projects
|
||||
local.properties
|
||||
local.properties
|
||||
|
||||
# Generated by scripts
|
||||
scripts/workspace
|
||||
76
CHANGELOG.md
76
CHANGELOG.md
@@ -1,79 +1,3 @@
|
||||
## [5.0.2-dev.2](https://github.com/ReVanced/revanced-cli/compare/v5.0.2-dev.1...v5.0.2-dev.2) (2025-04-25)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Do not print patch description if null ([bba90fe](https://github.com/ReVanced/revanced-cli/commit/bba90fede85e4632efb9509e5bcf9091a9435549))
|
||||
|
||||
## [5.0.2-dev.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.1...v5.0.2-dev.1) (2025-04-20)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Group `mount` and `install` options into an argument group ([#364](https://github.com/ReVanced/revanced-cli/issues/364)) ([0c53a2d](https://github.com/ReVanced/revanced-cli/commit/0c53a2d1d75d3d934d134594751fe6cd0b000d1a))
|
||||
|
||||
## [5.0.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.0...v5.0.1) (2025-04-14)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Make mounting work again by bumping dependencies ([#359](https://github.com/ReVanced/revanced-cli/issues/359)) ([68a4872](https://github.com/ReVanced/revanced-cli/commit/68a48724ebf01a0c8f8adc0fec63037bff672dc9))
|
||||
|
||||
## [5.0.1-dev.1](https://github.com/ReVanced/revanced-cli/compare/v5.0.0...v5.0.1-dev.1) (2025-02-26)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Make mounting work again by bumping dependencies ([#359](https://github.com/ReVanced/revanced-cli/issues/359)) ([68a4872](https://github.com/ReVanced/revanced-cli/commit/68a48724ebf01a0c8f8adc0fec63037bff672dc9))
|
||||
|
||||
# [5.0.0](https://github.com/ReVanced/revanced-cli/compare/v4.6.0...v5.0.0) (2024-11-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Check for null when no device serial was specified ([1da8ae9](https://github.com/ReVanced/revanced-cli/commit/1da8ae9e46000dd3c4eecd793c559e75012cf535))
|
||||
* List if patch option is required ([#346](https://github.com/ReVanced/revanced-cli/issues/346)) ([98ff0c3](https://github.com/ReVanced/revanced-cli/commit/98ff0c34fa71c3b3ecd96157d45a30ee2b8979c6))
|
||||
* Make CLI ArgGroup non-exclusive to be able to disable and enable patches at the same time ([1bb0d13](https://github.com/ReVanced/revanced-cli/commit/1bb0d13726fd5790c59cb6d28df3618c7606710d))
|
||||
* Make patches selectable by using a mutable collection for the selection option ([751fa1d](https://github.com/ReVanced/revanced-cli/commit/751fa1d889f40c51b291116029fd84f2b051f2f0))
|
||||
* Make the patch command work without specifying any selection ([ba159a3](https://github.com/ReVanced/revanced-cli/commit/ba159a35a9a99d18a4c1e04128b08ae336a49b3e))
|
||||
* Print in new line correctly ([c2dc9d7](https://github.com/ReVanced/revanced-cli/commit/c2dc9d76be33c98284741e23c406500483c47753))
|
||||
* Use the first connected device when no ADB device is specified ([5f952f3](https://github.com/ReVanced/revanced-cli/commit/5f952f35f5cb388b6509b2b4d905b8143ebc7996))
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* Set patch options via CLI ([#336](https://github.com/ReVanced/revanced-cli/issues/336)) ([2300243](https://github.com/ReVanced/revanced-cli/commit/23002434b2d51c2a3b30b33dd0526261432d90ce))
|
||||
* Show error about no installation device found at the beginning ([3300e6b](https://github.com/ReVanced/revanced-cli/commit/3300e6b4333ed1c4e6785cb82eca9016fc6d4a20))
|
||||
* Simplify command and option names and descriptions ([#338](https://github.com/ReVanced/revanced-cli/issues/338)) ([6e7797a](https://github.com/ReVanced/revanced-cli/commit/6e7797a3f0525a8f48af7182157da0d045600ac2))
|
||||
* Simplify option descriptions ([45c998b](https://github.com/ReVanced/revanced-cli/commit/45c998b335b65ac233fece8b804dc7410142691c))
|
||||
|
||||
|
||||
### BREAKING CHANGES
|
||||
|
||||
* Options have been renamed.
|
||||
* This commit changes various CLI options and removes the `options.json` file. Instead, patch options can now be passed via CLI options
|
||||
|
||||
# [5.0.0-dev.11](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.10...v5.0.0-dev.11) (2024-11-10)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* List if patch option is required ([#346](https://github.com/ReVanced/revanced-cli/issues/346)) ([98ff0c3](https://github.com/ReVanced/revanced-cli/commit/98ff0c34fa71c3b3ecd96157d45a30ee2b8979c6))
|
||||
|
||||
# [5.0.0-dev.10](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.9...v5.0.0-dev.10) (2024-11-05)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Make CLI ArgGroup non-exclusive to be able to disable and enable patches at the same time ([1bb0d13](https://github.com/ReVanced/revanced-cli/commit/1bb0d13726fd5790c59cb6d28df3618c7606710d))
|
||||
|
||||
# [5.0.0-dev.9](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.8...v5.0.0-dev.9) (2024-11-05)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* Print in new line correctly ([c2dc9d7](https://github.com/ReVanced/revanced-cli/commit/c2dc9d76be33c98284741e23c406500483c47753))
|
||||
|
||||
# [5.0.0-dev.8](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.7...v5.0.0-dev.8) (2024-10-17)
|
||||
|
||||
# [5.0.0-dev.7](https://github.com/ReVanced/revanced-cli/compare/v5.0.0-dev.6...v5.0.0-dev.7) (2024-10-16)
|
||||
|
||||
@@ -63,11 +63,11 @@
|
||||

|
||||

|
||||
|
||||
Command-line application to use ReVanced.
|
||||
Command line application to use ReVanced.
|
||||
|
||||
## ❓ About
|
||||
|
||||
ReVanced CLI is a command-line application that uses [ReVanced Patcher](https://github.com/revanced/revanced-patcher) to patch Android apps.
|
||||
ReVanced CLI is a command line application that uses [ReVanced Patcher](https://github.com/revanced/revanced-patcher) to patch Android apps.
|
||||
|
||||
## 💪 Features
|
||||
|
||||
@@ -75,7 +75,7 @@ Some of the features ReVanced CLI provides are:
|
||||
|
||||
- 💉 **Patch apps**: Harness ReVanced Patcher to patch Android apps
|
||||
- 💾 **Install and uninstall apps**: Install and uninstall Apps via ADB,
|
||||
using the Android package manager or by mounting using root permissions
|
||||
using the Android package manager, or by mounting using root permissions
|
||||
- 📃 **List patches from patch bundles**: List available patches, compatible packages, and versions
|
||||
- 💪 **Flexibility and functionality**: Apply any combination of patches to any version of Android apps
|
||||
|
||||
|
||||
@@ -15,7 +15,6 @@ application {
|
||||
}
|
||||
|
||||
repositories {
|
||||
mavenLocal()
|
||||
mavenCentral()
|
||||
google()
|
||||
maven {
|
||||
@@ -29,8 +28,6 @@ repositories {
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation(libs.bcpg.jdk18on)
|
||||
implementation(libs.sigstore.java)
|
||||
implementation(libs.revanced.patcher)
|
||||
implementation(libs.revanced.library)
|
||||
implementation(libs.kotlinx.coroutines.core)
|
||||
@@ -62,10 +59,10 @@ tasks {
|
||||
}
|
||||
|
||||
shadowJar {
|
||||
exclude("/prebuilt/linux/aapt", "/prebuilt/windows/aapt.exe", "/prebuilt/*/aapt_*")
|
||||
minimize {
|
||||
exclude(dependency("org.jetbrains.kotlin:.*"))
|
||||
exclude(dependency("org.bouncycastle:.*"))
|
||||
exclude(dependency("app.revanced:revanced-patcher"))
|
||||
exclude(dependency("app.revanced:.*"))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@ To use ReVanced CLI, you will need to fulfill specific requirements.
|
||||
|
||||
## 🤝 Requirements
|
||||
|
||||
- Java Runtime Environment 11 ([Azul Zulu JRE](https://www.azul.com/downloads/?version=java-11-lts&package=jre#zulu) or [OpenJDK](https://jdk.java.net/archive/))
|
||||
- Java Runtime Environment 11 or higher ([Eclipse Temurin JRE](https://adoptium.net/temurin/releases/?package=jre) or [OpenJDK](https://jdk.java.net/archive/))
|
||||
- [Android Debug Bridge (ADB)](https://developer.android.com/studio/command-line/adb) if you want to install the patched APK file on your device
|
||||
- x86 or x86-64 (For [other architectures](https://github.com/ReVanced/revanced-manager/tree/main/android/app/src/main/jniLibs) use the `--custom-aapt2-binary` option)
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
org.gradle.parallel = true
|
||||
org.gradle.caching = true
|
||||
kotlin.code.style = official
|
||||
version = 5.0.2-dev.2
|
||||
version = 5.0.0-dev.8
|
||||
|
||||
@@ -1,22 +1,18 @@
|
||||
[versions]
|
||||
bcpg-jdk18on = "1.82"
|
||||
shadow = "9.3.1"
|
||||
kotlin = "2.3.0"
|
||||
kotlinx = "1.10.2"
|
||||
picocli = "4.7.7"
|
||||
revanced-patcher = "22.0.0-local"
|
||||
revanced-library = "3.2.0-dev.2-local"
|
||||
sigstore = "2.0.0"
|
||||
shadow = "8.1.1"
|
||||
kotlin = "2.0.20"
|
||||
kotlinx = "1.8.1"
|
||||
picocli = "4.7.6"
|
||||
revanced-patcher = "20.0.2"
|
||||
revanced-library = "3.0.0"
|
||||
|
||||
[libraries]
|
||||
bcpg-jdk18on = { module = "org.bouncycastle:bcpg-jdk18on", version.ref = "bcpg-jdk18on" }
|
||||
kotlin-test = { module = "org.jetbrains.kotlin:kotlin-test", version.ref = "kotlin" }
|
||||
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx" }
|
||||
picocli = { module = "info.picocli:picocli", version.ref = "picocli" }
|
||||
revanced-patcher = { module = "app.revanced:revanced-patcher", version.ref = "revanced-patcher" }
|
||||
revanced-library = { module = "app.revanced:revanced-library-jvm", version.ref = "revanced-library" }
|
||||
sigstore-java = { module = "dev.sigstore:sigstore-java", version.ref = "sigstore" }
|
||||
|
||||
[plugins]
|
||||
shadow = { id = "com.gradleup.shadow", version.ref = "shadow" }
|
||||
shadow = { id = "com.github.johnrengelman.shadow", version.ref = "shadow" }
|
||||
kotlin = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
|
||||
|
||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
3
gradle/wrapper/gradle-wrapper.properties
vendored
3
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,7 @@
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip
|
||||
distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||
networkTimeout=10000
|
||||
validateDistributionUrl=true
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
|
||||
7
gradlew
vendored
7
gradlew
vendored
@@ -15,8 +15,6 @@
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
# SPDX-License-Identifier: Apache-2.0
|
||||
#
|
||||
|
||||
##############################################################################
|
||||
#
|
||||
@@ -57,7 +55,7 @@
|
||||
# Darwin, MinGW, and NonStop.
|
||||
#
|
||||
# (3) This script is generated from the Groovy template
|
||||
# https://github.com/gradle/gradle/blob/HEAD/platforms/jvm/plugins-application/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt
|
||||
# within the Gradle project.
|
||||
#
|
||||
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||
@@ -86,8 +84,7 @@ done
|
||||
# shellcheck disable=SC2034
|
||||
APP_BASE_NAME=${0##*/}
|
||||
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||
' "$PWD" ) || exit
|
||||
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
|
||||
|
||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||
MAX_FD=maximum
|
||||
|
||||
2
gradlew.bat
vendored
2
gradlew.bat
vendored
@@ -13,8 +13,6 @@
|
||||
@rem See the License for the specific language governing permissions and
|
||||
@rem limitations under the License.
|
||||
@rem
|
||||
@rem SPDX-License-Identifier: Apache-2.0
|
||||
@rem
|
||||
|
||||
@if "%DEBUG%"=="" @echo off
|
||||
@rem ##########################################################################
|
||||
|
||||
29
scripts/1-setup-environment.bat
Normal file
29
scripts/1-setup-environment.bat
Normal file
@@ -0,0 +1,29 @@
|
||||
@echo off
|
||||
|
||||
echo Check, if OpenJDK/ Eclipse Temurin 11 or newer is installed.
|
||||
pause
|
||||
echo:
|
||||
|
||||
cd modules
|
||||
call run java -version
|
||||
cd ..
|
||||
|
||||
echo:
|
||||
set /P INSTALLED_JAVA=Can you see OpenJDK/ Eclipse Temurin 11 or newer? (y/n)
|
||||
|
||||
if "%INSTALLED_JAVA%"=="y" (
|
||||
echo The environment is set up.
|
||||
pause
|
||||
exit
|
||||
)
|
||||
|
||||
cls
|
||||
echo Install Eclipse Temurin JRE 21.
|
||||
pause
|
||||
|
||||
cd modules
|
||||
call install-java
|
||||
cd ..
|
||||
|
||||
echo The environment is set up. Rerun this script to check your environment.
|
||||
pause
|
||||
11
scripts/2-download.bat
Normal file
11
scripts/2-download.bat
Normal file
@@ -0,0 +1,11 @@
|
||||
@echo off
|
||||
|
||||
echo Download necessary files from GitHub.
|
||||
pause
|
||||
|
||||
cd modules
|
||||
call composite download %~dp0\workspace
|
||||
cd ..
|
||||
|
||||
echo Files downloaded.
|
||||
pause
|
||||
14
scripts/3-patch.bat
Normal file
14
scripts/3-patch.bat
Normal file
@@ -0,0 +1,14 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
echo Patch an APK with the patches in the workspace.
|
||||
pause
|
||||
|
||||
cd modules
|
||||
call composite patch %~dp0\workspace
|
||||
cd ..
|
||||
|
||||
mv %~dp0\workspace\patched.apk %~dp0\patched.apk
|
||||
|
||||
echo Patched APK saved at %~dp0\patched.apk.
|
||||
pause
|
||||
11
scripts/4-cleanup.bat
Normal file
11
scripts/4-cleanup.bat
Normal file
@@ -0,0 +1,11 @@
|
||||
@echo off
|
||||
|
||||
echo Clean the workspace.
|
||||
pause
|
||||
|
||||
cd modules
|
||||
call composite clean %~dp0\workspace
|
||||
cd ..
|
||||
|
||||
echo Cleaned workspace.
|
||||
pause
|
||||
8
scripts/README.md
Normal file
8
scripts/README.md
Normal file
@@ -0,0 +1,8 @@
|
||||
# 📜 Scripts
|
||||
|
||||
This directory contain click-to-run scripts to use ReVanced CLI.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- [cURL](https://curl.haxx.se/)
|
||||
- [WinGet](https://aka.ms/getwinget), if you are on Windows
|
||||
1
scripts/customize.bat
Normal file
1
scripts/customize.bat
Normal file
@@ -0,0 +1 @@
|
||||
notepad modules\env.bat
|
||||
12
scripts/modules/check-java.bat
Normal file
12
scripts/modules/check-java.bat
Normal file
@@ -0,0 +1,12 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
for /f "tokens=8 delims=. " %%a in ('java --version 2^>nul ^| findstr /r "build"') do (
|
||||
set JAVA_VERSION_MAJOR=%%a
|
||||
goto :break
|
||||
)
|
||||
:break
|
||||
|
||||
if %JAVA_VERSION_MAJOR% LSS 11 (
|
||||
echo It looks like Java version is less than 11. Install OpenJDK/ Eclipse Temurin 11 or newer.
|
||||
)
|
||||
51
scripts/modules/composite.bat
Normal file
51
scripts/modules/composite.bat
Normal file
@@ -0,0 +1,51 @@
|
||||
@echo off
|
||||
setlocal EnableDelayedExpansion
|
||||
|
||||
if "%~1"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if "%~2"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if defined INVALID_ARGS (
|
||||
echo Runs curated compositions of scripts.
|
||||
echo:
|
||||
echo Usage: composite ^<script^> ^<workspace^>
|
||||
echo Example: composite patch C:/revanced
|
||||
echo:
|
||||
echo Available commands:
|
||||
echo: download - Download files
|
||||
echo: patch - Patches an application
|
||||
echo: clean - Cleans the workspace
|
||||
echo: env - Check for a valid environment setup
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
call env
|
||||
|
||||
set WORKSPACE=%2
|
||||
|
||||
if "%~1"=="download" (
|
||||
call create %WORKSPACE%
|
||||
|
||||
if not exist %WORKSPACE%/revanced-cli.jar (
|
||||
echo Downloading ReVanced CLI...
|
||||
call download %CLI_REPO% jar %WORKSPACE%/revanced-cli.jar
|
||||
)
|
||||
|
||||
if not exist %WORKSPACE%/patches.rvp (
|
||||
echo Downloading ReVanced patches...
|
||||
call download %PATCHES_REPO% jar %WORKSPACE%/patches.rvp
|
||||
)
|
||||
)
|
||||
if "%~1"=="patch" (
|
||||
set /p APK="Path to the APK file: "
|
||||
|
||||
call patch !APK! %WORKSPACE%
|
||||
)
|
||||
if "%~1"=="clean" (
|
||||
call delete %WORKSPACE%
|
||||
)
|
||||
if "%~1"=="env" (
|
||||
call check-java
|
||||
)
|
||||
19
scripts/modules/create.bat
Normal file
19
scripts/modules/create.bat
Normal file
@@ -0,0 +1,19 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if "%~1"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if defined INVALID_ARGS (
|
||||
echo Creates a directory using the mkdir command.
|
||||
echo:
|
||||
echo Usage: create ^<path^>
|
||||
echo Example: create C:/revanced
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
set DIRECTORY=%1
|
||||
|
||||
if not exist %DIRECTORY% (
|
||||
run "mkdir.exe" -p %DIRECTORY%
|
||||
)
|
||||
20
scripts/modules/delete.bat
Normal file
20
scripts/modules/delete.bat
Normal file
@@ -0,0 +1,20 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if "%~1"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if defined INVALID_ARGS (
|
||||
echo Deletes a directory relative to the current directory using the rmdir command.
|
||||
echo:
|
||||
echo Usage: delete ^<path^>
|
||||
echo Example: delete C:/revanced
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
set DIRECTORY=%1
|
||||
|
||||
if exist %DIRECTORY% (
|
||||
echo Confirm deletion of
|
||||
run rmdir /s %DIRECTORY%
|
||||
)
|
||||
30
scripts/modules/download.bat
Normal file
30
scripts/modules/download.bat
Normal file
@@ -0,0 +1,30 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if "%~1"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if "%~2"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if "%~3"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if defined INVALID_ARGS (
|
||||
echo Downloads a file from a GitHub repository release.
|
||||
echo:
|
||||
echo Usage: download ^<repo^> ^<asset-extension^> ^<out^>
|
||||
echo Example: download revanced/revanced-cli jar C:/revanced/revanced-cli.jar
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
set REPO=%1
|
||||
set ASSET_EXTENSION=%2
|
||||
set OUT=%3
|
||||
|
||||
set URL=https://api.github.com/repos/%REPO%/releases/latest
|
||||
for /f "delims=" %%i in ('curl -s %URL% ^| jq -r ".assets[] | select(.name | endswith(\"%ASSET_EXTENSION%\")) | .browser_download_url"') do (
|
||||
set JAR_URL=%%i
|
||||
)
|
||||
|
||||
run curl --silent --location --output %OUT% %JAR_URL%
|
||||
6
scripts/modules/env.bat
Normal file
6
scripts/modules/env.bat
Normal file
@@ -0,0 +1,6 @@
|
||||
@echo off
|
||||
|
||||
:: Customize your environment.
|
||||
|
||||
set CLI_REPO=revanced/revanced-cli
|
||||
set PATCHES_REPO=revanced/revanced-patches
|
||||
1
scripts/modules/install-java.bat
Normal file
1
scripts/modules/install-java.bat
Normal file
@@ -0,0 +1 @@
|
||||
run install EclipseAdoptium.Temurin.21.JRE
|
||||
1
scripts/modules/install-jq.bat
Normal file
1
scripts/modules/install-jq.bat
Normal file
@@ -0,0 +1 @@
|
||||
run install jqlang.jq
|
||||
14
scripts/modules/install.bat
Normal file
14
scripts/modules/install.bat
Normal file
@@ -0,0 +1,14 @@
|
||||
@echo off
|
||||
|
||||
if "%~1"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if defined INVALID_ARGS (
|
||||
echo Installs a package using winget.
|
||||
echo:
|
||||
echo Usage: install ^<id^>
|
||||
echo Example: install jqlang.jq
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
run winget install -e --id=%1
|
||||
28
scripts/modules/patch.bat
Normal file
28
scripts/modules/patch.bat
Normal file
@@ -0,0 +1,28 @@
|
||||
@echo off
|
||||
setlocal
|
||||
|
||||
if "%~1"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if "%~2"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if defined INVALID_ARGS (
|
||||
echo Patches an application using the specified patches.
|
||||
echo:
|
||||
echo Usage: patch ^<apk^> ^<workspace^>
|
||||
echo Example: patch C:/app.apk C:/workspace
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
set APK=%1
|
||||
set WORKSPACE=%2
|
||||
|
||||
call run java -jar %WORKSPACE%/revanced-cli.jar patch ^
|
||||
--patch-bundle %WORKSPACE%/patches.rvp ^
|
||||
--temporary-files-path %WORKSPACE%/temporary-files ^
|
||||
--out %WORKSPACE%/patched.apk ^
|
||||
--purge ^
|
||||
%APK%
|
||||
|
||||
mv %WORKSPACE%/patched.apk
|
||||
23
scripts/modules/run.bat
Normal file
23
scripts/modules/run.bat
Normal file
@@ -0,0 +1,23 @@
|
||||
@echo off
|
||||
|
||||
if "%~1"=="" (
|
||||
set INVALID_ARGS=true
|
||||
)
|
||||
if defined INVALID_ARGS (
|
||||
echo Run a command with arguments.
|
||||
echo:
|
||||
echo Usage: run.bat ^<command^> [arguments]
|
||||
echo Example: run.bat echo Hello, World!
|
||||
exit /b 1
|
||||
)
|
||||
|
||||
%*
|
||||
|
||||
if %ERRORLEVEL% NEQ 0 (
|
||||
echo:
|
||||
echo Failed to run command with exit code %ERRORLEVEL%.
|
||||
echo Failed command: %*
|
||||
echo:
|
||||
pause
|
||||
exit /b %ERRORLEVEL%
|
||||
)
|
||||
@@ -85,55 +85,57 @@ internal object ListPatchesCommand : Runnable {
|
||||
}
|
||||
}
|
||||
|
||||
fun PatchOption<*>.buildString() = buildString {
|
||||
appendLine("Title: $title")
|
||||
description?.let { appendLine("Description: $it") }
|
||||
appendLine("Required: $required")
|
||||
default?.let {
|
||||
appendLine("Key: $key")
|
||||
append("Default: $it")
|
||||
} ?: append("Key: $key")
|
||||
|
||||
values?.let { values ->
|
||||
appendLine("\nPossible values:")
|
||||
append(values.map { "${it.value} (${it.key})" }.joinToString("\n").prependIndent("\t"))
|
||||
}
|
||||
|
||||
append("\nType: $type")
|
||||
}
|
||||
|
||||
fun IndexedValue<Patch<*>>.buildString() = let { (index, patch) ->
|
||||
fun PatchOption<*>.buildString() =
|
||||
buildString {
|
||||
if (withIndex) appendLine("Index: $index")
|
||||
appendLine("Title: $title")
|
||||
description?.let { appendLine("Description: $it") }
|
||||
default?.let {
|
||||
appendLine("Key: $key")
|
||||
append("Default: $it")
|
||||
} ?: append("Key: $key")
|
||||
|
||||
append("Name: ${patch.name}")
|
||||
|
||||
if (withDescriptions) patch.description?.let { append("\nDescription: $it") }
|
||||
|
||||
append("\nEnabled: ${patch.use}")
|
||||
|
||||
if (withOptions && patch.options.isNotEmpty()) {
|
||||
appendLine("\nOptions:")
|
||||
append(
|
||||
patch.options.values.joinToString("\n\n") { option ->
|
||||
option.buildString()
|
||||
}.prependIndent("\t"),
|
||||
)
|
||||
values?.let { values ->
|
||||
appendLine("\nPossible values:")
|
||||
append(values.map { "${it.value} (${it.key})" }.joinToString("\n").prependIndent("\t"))
|
||||
}
|
||||
|
||||
if (withPackages && patch.compatiblePackages != null) {
|
||||
appendLine("\nCompatible packages:")
|
||||
append(
|
||||
patch.compatiblePackages!!.joinToString("\n") {
|
||||
it.buildString()
|
||||
}.prependIndent("\t"),
|
||||
)
|
||||
append("\nType: $type")
|
||||
}
|
||||
|
||||
fun IndexedValue<Patch<*>>.buildString() =
|
||||
let { (index, patch) ->
|
||||
buildString {
|
||||
if (withIndex) appendLine("Index: $index")
|
||||
|
||||
append("Name: ${patch.name}")
|
||||
|
||||
if (withDescriptions) append("\nDescription: ${patch.description}")
|
||||
|
||||
append("Enabled: ${patch.use}")
|
||||
|
||||
if (withOptions && patch.options.isNotEmpty()) {
|
||||
appendLine("\nOptions:")
|
||||
append(
|
||||
patch.options.values.joinToString("\n\n") { option ->
|
||||
option.buildString()
|
||||
}.prependIndent("\t"),
|
||||
)
|
||||
}
|
||||
|
||||
if (withPackages && patch.compatiblePackages != null) {
|
||||
appendLine("\nCompatible packages:")
|
||||
append(
|
||||
patch.compatiblePackages!!.joinToString("\n") {
|
||||
it.buildString()
|
||||
}.prependIndent("\t"),
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fun Patch<*>.filterCompatiblePackages(name: String) = compatiblePackages?.any { (compatiblePackageName, _) -> compatiblePackageName == name }
|
||||
?: withUniversalPatches
|
||||
fun Patch<*>.filterCompatiblePackages(name: String) =
|
||||
compatiblePackages?.any { (compatiblePackageName, _) -> compatiblePackageName == name }
|
||||
?: withUniversalPatches
|
||||
|
||||
val patches = loadPatchesFromJar(patchesFiles).withIndex().toList()
|
||||
|
||||
|
||||
@@ -29,11 +29,11 @@ internal object PatchCommand : Runnable {
|
||||
@Spec
|
||||
private lateinit var spec: CommandSpec
|
||||
|
||||
@ArgGroup(exclusive = false, multiplicity = "0..*")
|
||||
@ArgGroup(multiplicity = "0..*")
|
||||
private var selection = mutableSetOf<Selection>()
|
||||
|
||||
internal class Selection {
|
||||
@ArgGroup(exclusive = false)
|
||||
@ArgGroup(exclusive = false, multiplicity = "1")
|
||||
internal var enabled: EnableSelection? = null
|
||||
|
||||
internal class EnableSelection {
|
||||
@@ -65,7 +65,7 @@ internal object PatchCommand : Runnable {
|
||||
internal var options = mutableMapOf<String, Any?>()
|
||||
}
|
||||
|
||||
@ArgGroup(exclusive = false)
|
||||
@ArgGroup(exclusive = false, multiplicity = "1")
|
||||
internal var disable: DisableSelection? = null
|
||||
|
||||
internal class DisableSelection {
|
||||
@@ -115,27 +115,21 @@ internal object PatchCommand : Runnable {
|
||||
this.outputFilePath = outputFilePath?.absoluteFile
|
||||
}
|
||||
|
||||
@ArgGroup(exclusive = false, multiplicity = "0..1")
|
||||
internal var installation: Installation? = null
|
||||
@CommandLine.Option(
|
||||
names = ["-i", "--install"],
|
||||
description = ["Serial of the ADB device to install to. If not specified, the first connected device will be used."],
|
||||
// Empty string to indicate that the first connected device should be used.
|
||||
fallbackValue = "",
|
||||
arity = "0..1",
|
||||
)
|
||||
private var deviceSerial: String? = null
|
||||
|
||||
internal class Installation {
|
||||
@CommandLine.Option(
|
||||
names = ["-i", "--install"],
|
||||
required = true,
|
||||
description = ["Serial of the ADB device to install to. If not specified, the first connected device will be used."],
|
||||
fallbackValue = "", // Empty string is used to select the first of connected devices.
|
||||
arity = "0..1",
|
||||
)
|
||||
internal var deviceSerial: String? = null
|
||||
|
||||
@CommandLine.Option(
|
||||
names = ["--mount"],
|
||||
required = false,
|
||||
description = ["Install the patched APK file by mounting."],
|
||||
showDefaultValue = ALWAYS,
|
||||
)
|
||||
internal var mount: Boolean = false
|
||||
}
|
||||
@CommandLine.Option(
|
||||
names = ["--mount"],
|
||||
description = ["Install the patched APK file by mounting."],
|
||||
showDefaultValue = ALWAYS,
|
||||
)
|
||||
private var mount: Boolean = false
|
||||
|
||||
@CommandLine.Option(
|
||||
names = ["--keystore"],
|
||||
@@ -251,11 +245,11 @@ internal object PatchCommand : Runnable {
|
||||
keyStoreFilePath ?: outputFilePath.parentFile
|
||||
.resolve("${outputFilePath.nameWithoutExtension}.keystore")
|
||||
|
||||
val installer = if (installation?.deviceSerial != null) {
|
||||
val deviceSerial = installation?.deviceSerial!!.ifEmpty { null }
|
||||
val installer = if (deviceSerial != null) {
|
||||
val deviceSerial = deviceSerial!!.ifEmpty { null }
|
||||
|
||||
try {
|
||||
if (installation?.mount == true) {
|
||||
if (mount) {
|
||||
AdbRootInstaller(deviceSerial)
|
||||
} else {
|
||||
AdbInstaller(deviceSerial)
|
||||
@@ -297,6 +291,7 @@ internal object PatchCommand : Runnable {
|
||||
patcherTemporaryFilesPath,
|
||||
aaptBinaryPath?.path,
|
||||
patcherTemporaryFilesPath.absolutePath,
|
||||
true,
|
||||
),
|
||||
).use { patcher ->
|
||||
val packageName = patcher.context.packageMetadata.packageName
|
||||
@@ -338,7 +333,7 @@ internal object PatchCommand : Runnable {
|
||||
apk.copyTo(temporaryFilesPath.resolve(apk.name), overwrite = true).apply {
|
||||
patcherResult.applyTo(this)
|
||||
}.let { patchedApkFile ->
|
||||
if (installation?.mount != true) {
|
||||
if (!mount) {
|
||||
ApkUtils.signApk(
|
||||
patchedApkFile,
|
||||
outputFilePath,
|
||||
@@ -361,7 +356,9 @@ internal object PatchCommand : Runnable {
|
||||
|
||||
// region Install.
|
||||
|
||||
installation?.deviceSerial?.let {
|
||||
deviceSerial?.let {
|
||||
val deviceSerial = it.ifEmpty { null }
|
||||
|
||||
runBlocking {
|
||||
when (val result = installer!!.install(Installer.Apk(outputFilePath, packageName))) {
|
||||
RootInstallerResult.FAILURE -> logger.severe("Failed to mount the patched APK file")
|
||||
|
||||
Reference in New Issue
Block a user