mirror of
https://github.com/ReVanced/revanced-library.git
synced 2026-01-17 08:23:58 +00:00
Compare commits
37 Commits
v2.4.0-dev
...
dev
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0673307204 | ||
|
|
5df2bb81bf | ||
|
|
be0f6bf247 | ||
|
|
9d060c188f | ||
|
|
254f36d03c | ||
|
|
4065c87d5f | ||
|
|
be8d7bf643 | ||
|
|
2328902b6b | ||
|
|
7ec6504619 | ||
|
|
e7a98b5795 | ||
|
|
649f06b19d | ||
|
|
cace51700a | ||
|
|
91cefc8598 | ||
|
|
735c1e39cd | ||
|
|
84cc315541 | ||
|
|
4fe9304570 | ||
|
|
8bb41be8fc | ||
|
|
4b8ac026c3 | ||
|
|
557b6035f8 | ||
|
|
bfc5394b4e | ||
|
|
5b1cf1f190 | ||
|
|
dd5c37ddec | ||
|
|
9adccc04dd | ||
|
|
ed94d29461 | ||
|
|
efc72cdc55 | ||
|
|
737e272481 | ||
|
|
92ff93d6e6 | ||
|
|
d56126aa58 | ||
|
|
079776f241 | ||
|
|
7a554a85a8 | ||
|
|
b9bf3bc882 | ||
|
|
27b3359d66 | ||
|
|
893d22d793 | ||
|
|
7f5d6dad7b | ||
|
|
8aca650ebc | ||
|
|
db59d2cd0b | ||
|
|
fe3e1c9dc8 |
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
5
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
@@ -70,7 +70,8 @@ body:
|
|||||||
|
|
||||||
Before creating a new bug report, please keep the following in mind:
|
Before creating a new bug report, please keep the following in mind:
|
||||||
|
|
||||||
- **Do not submit a duplicate bug report**: You can review existing bug reports [here](https://github.com/ReVanced/revanced-library/labels/Bug%20report).
|
- **Do not submit a duplicate bug report**: Search for existing bug reports [here](https://github.com/ReVanced/revanced-library/issues?q=label%3A%22Bug+report%22).
|
||||||
|
- **Review the contribution guidelines**: Make sure your bug request adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-library/blob/main/CONTRIBUTING.md).
|
||||||
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
|
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
@@ -100,7 +101,7 @@ body:
|
|||||||
label: Acknowledgements
|
label: Acknowledgements
|
||||||
description: Your bug report will be closed if you don't follow the checklist below.
|
description: Your bug report will be closed if you don't follow the checklist below.
|
||||||
options:
|
options:
|
||||||
- label: This issue is not a duplicate of an existing bug report.
|
- label: I have checked all open and closed bug reports and this is not a duplicate.
|
||||||
required: true
|
required: true
|
||||||
- label: I have chosen an appropriate title.
|
- label: I have chosen an appropriate title.
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
6
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
6
.github/ISSUE_TEMPLATE/feature_request.yml
vendored
@@ -70,8 +70,8 @@ body:
|
|||||||
|
|
||||||
Before creating a new feature request, please keep the following in mind:
|
Before creating a new feature request, please keep the following in mind:
|
||||||
|
|
||||||
- **Do not submit a duplicate feature request**: You can review existing feature requests [here](https://github.com/ReVanced/revanced-library/labels/Feature%20request).
|
- **Do not submit a duplicate feature request**: Search for existing feature requests [here](https://github.com/ReVanced/revanced-library/issues?q=label%3A%22Feature+request%22).
|
||||||
- **Review the contribution guidelines**: Make sure your bug report adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-library/blob/main/CONTRIBUTING.md).
|
- **Review the contribution guidelines**: Make sure your feature request adheres to it. You can find the guidelines [here](https://github.com/ReVanced/revanced-library/blob/main/CONTRIBUTING.md).
|
||||||
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
|
- **Do not use the issue page for support**: If you need help or have questions, check out other platforms on [revanced.app](https://revanced.app).
|
||||||
- type: textarea
|
- type: textarea
|
||||||
attributes:
|
attributes:
|
||||||
@@ -98,7 +98,7 @@ body:
|
|||||||
label: Acknowledgements
|
label: Acknowledgements
|
||||||
description: Your feature request will be closed if you don't follow the checklist below.
|
description: Your feature request will be closed if you don't follow the checklist below.
|
||||||
options:
|
options:
|
||||||
- label: This issue is not a duplicate of an existing feature request.
|
- label: I have checked all open and closed feature requests and this is not a duplicate.
|
||||||
required: true
|
required: true
|
||||||
- label: I have chosen an appropriate title.
|
- label: I have chosen an appropriate title.
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
7
.github/workflows/release.yml
vendored
7
.github/workflows/release.yml
vendored
@@ -10,6 +10,9 @@ on:
|
|||||||
jobs:
|
jobs:
|
||||||
release:
|
release:
|
||||||
name: Release
|
name: Release
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
packages: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
@@ -45,9 +48,9 @@ jobs:
|
|||||||
with:
|
with:
|
||||||
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
gpg_private_key: ${{ secrets.GPG_PRIVATE_KEY }}
|
||||||
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
passphrase: ${{ secrets.GPG_PASSPHRASE }}
|
||||||
fingerprint: ${{ env.GPG_FINGERPRINT }}
|
fingerprint: ${{ vars.GPG_FINGERPRINT }}
|
||||||
|
|
||||||
- name: Release
|
- name: Release
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.REPOSITORY_PUSH_ACCESS }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
run: npm exec semantic-release
|
run: npm exec semantic-release
|
||||||
|
|||||||
@@ -23,7 +23,8 @@
|
|||||||
"assets": [
|
"assets": [
|
||||||
"CHANGELOG.md",
|
"CHANGELOG.md",
|
||||||
"gradle.properties"
|
"gradle.properties"
|
||||||
]
|
],
|
||||||
|
"message": "chore: Release v${nextRelease.version} [skip ci]\n\n${nextRelease.notes}"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|||||||
111
CHANGELOG.md
111
CHANGELOG.md
@@ -1,3 +1,114 @@
|
|||||||
|
# [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)
|
||||||
|
|
||||||
|
## [3.0.1](https://github.com/ReVanced/revanced-library/compare/v3.0.0...v3.0.1) (2024-10-13)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Serialize compatible packages as a map instead of a set of pairs. ([737e272](https://github.com/ReVanced/revanced-library/commit/737e272481fe3b0b4c89233d139b5e657a0c1de4))
|
||||||
|
|
||||||
|
## [3.0.1-dev.3](https://github.com/ReVanced/revanced-library/compare/v3.0.1-dev.2...v3.0.1-dev.3) (2024-10-06)
|
||||||
|
|
||||||
|
## [3.0.1-dev.2](https://github.com/ReVanced/revanced-library/compare/v3.0.1-dev.1...v3.0.1-dev.2) (2024-10-01)
|
||||||
|
|
||||||
|
## [3.0.1-dev.1](https://github.com/ReVanced/revanced-library/compare/v3.0.0...v3.0.1-dev.1) (2024-08-16)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Serialize compatible packages as a map instead of a set of pairs. ([737e272](https://github.com/ReVanced/revanced-library/commit/737e272481fe3b0b4c89233d139b5e657a0c1de4))
|
||||||
|
|
||||||
|
# [3.0.0](https://github.com/ReVanced/revanced-library/compare/v2.3.0...v3.0.0) (2024-08-06)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Make functions internal which are supposed to be internal ([893d22d](https://github.com/ReVanced/revanced-library/commit/893d22d7938fa1c7544795635ed2ffacdd0cbf0d))
|
||||||
|
|
||||||
|
|
||||||
|
### Build System
|
||||||
|
|
||||||
|
* Refactor to DSL to bump ReVanced Patcher ([7f5d6da](https://github.com/ReVanced/revanced-library/commit/7f5d6dad7ba73e2ee53010241ba3204d04860a22))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Add local Android installer ([#25](https://github.com/ReVanced/revanced-library/issues/25)) ([43d655a](https://github.com/ReVanced/revanced-library/commit/43d655aea5d86288ae9916630e0f30de219d5cfb))
|
||||||
|
* Remove deprecated functions ([b9bf3bc](https://github.com/ReVanced/revanced-library/commit/b9bf3bc88284c0381c7370c3606b662da2ef380d))
|
||||||
|
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* Some functions have been removed.
|
||||||
|
* Some functions are not available anymore.
|
||||||
|
* The signature of some functions has changed.
|
||||||
|
|
||||||
|
# [3.0.0-dev.1](https://github.com/ReVanced/revanced-library/compare/v2.4.0-dev.1...v3.0.0-dev.1) (2024-08-06)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* Make functions internal which are supposed to be internal ([893d22d](https://github.com/ReVanced/revanced-library/commit/893d22d7938fa1c7544795635ed2ffacdd0cbf0d))
|
||||||
|
|
||||||
|
|
||||||
|
### Build System
|
||||||
|
|
||||||
|
* Refactor to DSL to bump ReVanced Patcher ([7f5d6da](https://github.com/ReVanced/revanced-library/commit/7f5d6dad7ba73e2ee53010241ba3204d04860a22))
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* Remove deprecated functions ([b9bf3bc](https://github.com/ReVanced/revanced-library/commit/b9bf3bc88284c0381c7370c3606b662da2ef380d))
|
||||||
|
|
||||||
|
|
||||||
|
### BREAKING CHANGES
|
||||||
|
|
||||||
|
* Some functions have been removed.
|
||||||
|
* Some functions are not available anymore.
|
||||||
|
* The signature of some functions has changed.
|
||||||
|
|
||||||
# [2.4.0-dev.1](https://github.com/ReVanced/revanced-library/compare/v2.3.0...v2.4.0-dev.1) (2024-04-07)
|
# [2.4.0-dev.1](https://github.com/ReVanced/revanced-library/compare/v2.3.0...v2.4.0-dev.1) (2024-04-07)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -109,9 +109,9 @@ You can find the contribution guidelines [here](CONTRIBUTING.md).
|
|||||||
To build ReVanced Library,
|
To build ReVanced Library,
|
||||||
you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced-documentation).
|
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.
|
[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,
|
Any modifications to ReVanced Library must also be made available under the GPL,
|
||||||
along with build & install instructions.
|
along with build & install instructions.
|
||||||
|
|||||||
@@ -1,13 +1,8 @@
|
|||||||
public final class app/revanced/library/ApkSigner {
|
public final class app/revanced/library/ApkSigner {
|
||||||
public static final field INSTANCE Lapp/revanced/library/ApkSigner;
|
public static final field INSTANCE Lapp/revanced/library/ApkSigner;
|
||||||
public final fun newApkSigner (Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newApkSigner (Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
public final fun newApkSigner (Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
||||||
public final fun newApkSigner (Ljava/lang/String;Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newApkSigner (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newKeyStore (Ljava/io/OutputStream;Ljava/lang/String;Ljava/util/Set;)V
|
|
||||||
public final fun newKeyStore (Ljava/util/Set;)Ljava/security/KeyStore;
|
public final fun newKeyStore (Ljava/util/Set;)Ljava/security/KeyStore;
|
||||||
public final fun newPrivateKeyCertificatePair (Ljava/lang/String;Ljava/util/Date;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
public final fun newPrivateKeyCertificatePair (Ljava/lang/String;Ljava/util/Date;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
||||||
public final fun readKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun readKeyStore (Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/KeyStore;
|
public final fun readKeyStore (Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/KeyStore;
|
||||||
public final fun readPrivateKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
public final fun readPrivateKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
||||||
}
|
}
|
||||||
@@ -26,19 +21,12 @@ public final class app/revanced/library/ApkSigner$PrivateKeyCertificatePair {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/ApkSigner$Signer {
|
public final class app/revanced/library/ApkSigner$Signer {
|
||||||
public final fun signApk (Lcom/android/tools/build/apkzlib/zip/ZFile;)V
|
|
||||||
public final fun signApk (Ljava/io/File;)V
|
|
||||||
public final fun signApk (Ljava/io/File;Ljava/io/File;)V
|
public final fun signApk (Ljava/io/File;Ljava/io/File;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils {
|
public final class app/revanced/library/ApkUtils {
|
||||||
public static final field INSTANCE Lapp/revanced/library/ApkUtils;
|
public static final field INSTANCE Lapp/revanced/library/ApkUtils;
|
||||||
public final fun applyTo (Lapp/revanced/patcher/PatcherResult;Ljava/io/File;)V
|
public final fun applyTo (Lapp/revanced/patcher/PatcherResult;Ljava/io/File;)V
|
||||||
public final fun newPrivateKeyCertificatePair (Lapp/revanced/library/ApkUtils$PrivateKeyCertificatePairDetails;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun readPrivateKeyCertificatePairFromKeyStore (Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun sign (Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
|
|
||||||
public final fun sign (Ljava/io/File;Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
|
|
||||||
public final fun sign (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)V
|
|
||||||
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)V
|
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,80 +47,18 @@ public final class app/revanced/library/ApkUtils$PrivateKeyCertificatePairDetail
|
|||||||
public final fun getValidUntil ()Ljava/util/Date;
|
public final fun getValidUntil ()Ljava/util/Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils$SigningOptions {
|
public final class app/revanced/library/OptionsKt {
|
||||||
public fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
public static final fun setOptions (Ljava/util/Set;Ljava/util/Map;)V
|
||||||
public synthetic fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getAlias ()Ljava/lang/String;
|
|
||||||
public final fun getKeyStore ()Ljava/io/File;
|
|
||||||
public final fun getKeyStorePassword ()Ljava/lang/String;
|
|
||||||
public final fun getPassword ()Ljava/lang/String;
|
|
||||||
public final fun getSigner ()Ljava/lang/String;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/Options {
|
public final class app/revanced/library/PatchKt {
|
||||||
public static final field INSTANCE Lapp/revanced/library/Options;
|
public static final fun mostCommonCompatibleVersions (Ljava/util/Set;Ljava/util/Set;Z)Ljava/util/Map;
|
||||||
public final fun deserialize (Ljava/lang/String;)[Lapp/revanced/library/Options$Patch;
|
public static synthetic fun mostCommonCompatibleVersions$default (Ljava/util/Set;Ljava/util/Set;ZILjava/lang/Object;)Ljava/util/Map;
|
||||||
public final fun serialize (Ljava/util/Set;Z)Ljava/lang/String;
|
|
||||||
public static synthetic fun serialize$default (Lapp/revanced/library/Options;Ljava/util/Set;ZILjava/lang/Object;)Ljava/lang/String;
|
|
||||||
public final fun setOptions (Ljava/util/Set;Ljava/io/File;)V
|
|
||||||
public final fun setOptions (Ljava/util/Set;Ljava/lang/String;)V
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/Options$Patch {
|
public final class app/revanced/library/SerializationKt {
|
||||||
public final fun getOptions ()Ljava/util/List;
|
public static final fun serializeTo (Ljava/util/Set;Ljava/io/OutputStream;Z)V
|
||||||
public final fun getPatchName ()Ljava/lang/String;
|
public static synthetic fun serializeTo$default (Ljava/util/Set;Ljava/io/OutputStream;ZILjava/lang/Object;)V
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/Options$Patch$Option {
|
|
||||||
public final fun getKey ()Ljava/lang/String;
|
|
||||||
public final fun getValue ()Ljava/lang/Object;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/PatchUtils;
|
|
||||||
public final fun getMostCommonCompatibleVersions (Ljava/util/Set;Ljava/util/Set;Z)Ljava/util/Map;
|
|
||||||
public static synthetic fun getMostCommonCompatibleVersions$default (Lapp/revanced/library/PatchUtils;Ljava/util/Set;Ljava/util/Set;ZILjava/lang/Object;)Ljava/util/Map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/PatchUtils$Json;
|
|
||||||
public final fun deserialize (Ljava/io/InputStream;Ljava/lang/Class;)Ljava/util/Set;
|
|
||||||
public final fun serialize (Ljava/util/Set;Lkotlin/jvm/functions/Function1;ZLjava/io/OutputStream;)V
|
|
||||||
public static synthetic fun serialize$default (Lapp/revanced/library/PatchUtils$Json;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ZLjava/io/OutputStream;ILjava/lang/Object;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch : app/revanced/library/PatchUtils$Json$JsonPatch {
|
|
||||||
public static final field Companion Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$Companion;
|
|
||||||
public final fun getCompatiblePackages ()Ljava/util/Set;
|
|
||||||
public final fun getDependencies ()Ljava/util/Set;
|
|
||||||
public final fun getDescription ()Ljava/lang/String;
|
|
||||||
public final fun getName ()Ljava/lang/String;
|
|
||||||
public final fun getOptions ()Ljava/util/Map;
|
|
||||||
public final fun getRequiresIntegrations ()Z
|
|
||||||
public final fun getUse ()Z
|
|
||||||
public final fun setRequiresIntegrations (Z)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$Companion {
|
|
||||||
public final fun fromPatch (Lapp/revanced/patcher/patch/Patch;)Lapp/revanced/library/PatchUtils$Json$FullJsonPatch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption {
|
|
||||||
public static final field Companion Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption$Companion;
|
|
||||||
public final fun getDefault ()Ljava/lang/Object;
|
|
||||||
public final fun getDescription ()Ljava/lang/String;
|
|
||||||
public final fun getKey ()Ljava/lang/String;
|
|
||||||
public final fun getRequired ()Z
|
|
||||||
public final fun getTitle ()Ljava/lang/String;
|
|
||||||
public final fun getValueType ()Ljava/lang/String;
|
|
||||||
public final fun getValues ()Ljava/util/Map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption$Companion {
|
|
||||||
public final fun fromPatchOption (Lapp/revanced/patcher/patch/options/PatchOption;)Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract interface class app/revanced/library/PatchUtils$Json$JsonPatch {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/Utils {
|
public final class app/revanced/library/Utils {
|
||||||
@@ -140,52 +66,6 @@ public final class app/revanced/library/Utils {
|
|||||||
public final fun isAndroidEnvironment ()Z
|
public final fun isAndroidEnvironment ()Z
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class app/revanced/library/adb/AdbManager {
|
|
||||||
public static final field Companion Lapp/revanced/library/adb/AdbManager$Companion;
|
|
||||||
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
protected abstract fun getInstaller ()Lapp/revanced/library/installation/installer/Installer;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)Lkotlin/jvm/functions/Function1;
|
|
||||||
public fun uninstall (Ljava/lang/String;)Lkotlin/jvm/functions/Function1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$Apk {
|
|
||||||
public fun <init> (Ljava/io/File;Ljava/lang/String;)V
|
|
||||||
public synthetic fun <init> (Ljava/io/File;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getFile ()Ljava/io/File;
|
|
||||||
public final fun getPackageName ()Ljava/lang/String;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$Companion {
|
|
||||||
public final fun getAdbManager (Ljava/lang/String;Z)Lapp/revanced/library/adb/AdbManager;
|
|
||||||
public static synthetic fun getAdbManager$default (Lapp/revanced/library/adb/AdbManager$Companion;Ljava/lang/String;ZILjava/lang/Object;)Lapp/revanced/library/adb/AdbManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$DeviceNotFoundException : java/lang/Exception {
|
|
||||||
public fun <init> ()V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$FailedToFindInstalledPackageException : java/lang/Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$PackageNameRequiredException : java/lang/Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$RootAdbManager : app/revanced/library/adb/AdbManager {
|
|
||||||
public static final field Utils Lapp/revanced/library/adb/AdbManager$RootAdbManager$Utils;
|
|
||||||
public synthetic fun getInstaller ()Lapp/revanced/library/installation/installer/Installer;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)Lkotlin/jvm/functions/Function1;
|
|
||||||
public fun uninstall (Ljava/lang/String;)Lkotlin/jvm/functions/Function1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$RootAdbManager$Utils {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$UserAdbManager : app/revanced/library/adb/AdbManager {
|
|
||||||
public synthetic fun getInstaller ()Lapp/revanced/library/installation/installer/Installer;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)Lkotlin/jvm/functions/Function1;
|
|
||||||
public fun uninstall (Ljava/lang/String;)Lkotlin/jvm/functions/Function1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/installation/command/AdbShellCommandRunner : app/revanced/library/installation/command/ShellCommandRunner {
|
public final class app/revanced/library/installation/command/AdbShellCommandRunner : app/revanced/library/installation/command/ShellCommandRunner {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -255,6 +135,10 @@ public final class app/revanced/library/installation/installer/AdbRootInstaller
|
|||||||
public synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
public synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/library/installation/installer/DeviceNotFoundException : java/lang/Exception {
|
||||||
|
public fun <init> ()V
|
||||||
|
}
|
||||||
|
|
||||||
public class app/revanced/library/installation/installer/Installation {
|
public class app/revanced/library/installation/installer/Installation {
|
||||||
public final fun getApkFilePath ()Ljava/lang/String;
|
public final fun getApkFilePath ()Ljava/lang/String;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,8 @@
|
|||||||
public final class app/revanced/library/ApkSigner {
|
public final class app/revanced/library/ApkSigner {
|
||||||
public static final field INSTANCE Lapp/revanced/library/ApkSigner;
|
public static final field INSTANCE Lapp/revanced/library/ApkSigner;
|
||||||
public final fun newApkSigner (Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newApkSigner (Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
public final fun newApkSigner (Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
||||||
public final fun newApkSigner (Ljava/lang/String;Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newApkSigner (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newKeyStore (Ljava/io/OutputStream;Ljava/lang/String;Ljava/util/Set;)V
|
|
||||||
public final fun newKeyStore (Ljava/util/Set;)Ljava/security/KeyStore;
|
public final fun newKeyStore (Ljava/util/Set;)Ljava/security/KeyStore;
|
||||||
public final fun newPrivateKeyCertificatePair (Ljava/lang/String;Ljava/util/Date;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
public final fun newPrivateKeyCertificatePair (Ljava/lang/String;Ljava/util/Date;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
||||||
public final fun readKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun readKeyStore (Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/KeyStore;
|
public final fun readKeyStore (Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/KeyStore;
|
||||||
public final fun readPrivateKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
public final fun readPrivateKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
||||||
}
|
}
|
||||||
@@ -26,19 +21,12 @@ public final class app/revanced/library/ApkSigner$PrivateKeyCertificatePair {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/ApkSigner$Signer {
|
public final class app/revanced/library/ApkSigner$Signer {
|
||||||
public final fun signApk (Lcom/android/tools/build/apkzlib/zip/ZFile;)V
|
|
||||||
public final fun signApk (Ljava/io/File;)V
|
|
||||||
public final fun signApk (Ljava/io/File;Ljava/io/File;)V
|
public final fun signApk (Ljava/io/File;Ljava/io/File;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils {
|
public final class app/revanced/library/ApkUtils {
|
||||||
public static final field INSTANCE Lapp/revanced/library/ApkUtils;
|
public static final field INSTANCE Lapp/revanced/library/ApkUtils;
|
||||||
public final fun applyTo (Lapp/revanced/patcher/PatcherResult;Ljava/io/File;)V
|
public final fun applyTo (Lapp/revanced/patcher/PatcherResult;Ljava/io/File;)V
|
||||||
public final fun newPrivateKeyCertificatePair (Lapp/revanced/library/ApkUtils$PrivateKeyCertificatePairDetails;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun readPrivateKeyCertificatePairFromKeyStore (Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun sign (Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
|
|
||||||
public final fun sign (Ljava/io/File;Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
|
|
||||||
public final fun sign (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)V
|
|
||||||
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)V
|
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -59,80 +47,18 @@ public final class app/revanced/library/ApkUtils$PrivateKeyCertificatePairDetail
|
|||||||
public final fun getValidUntil ()Ljava/util/Date;
|
public final fun getValidUntil ()Ljava/util/Date;
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils$SigningOptions {
|
public final class app/revanced/library/OptionsKt {
|
||||||
public fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
public static final fun setOptions (Ljava/util/Set;Ljava/util/Map;)V
|
||||||
public synthetic fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getAlias ()Ljava/lang/String;
|
|
||||||
public final fun getKeyStore ()Ljava/io/File;
|
|
||||||
public final fun getKeyStorePassword ()Ljava/lang/String;
|
|
||||||
public final fun getPassword ()Ljava/lang/String;
|
|
||||||
public final fun getSigner ()Ljava/lang/String;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/Options {
|
public final class app/revanced/library/PatchKt {
|
||||||
public static final field INSTANCE Lapp/revanced/library/Options;
|
public static final fun mostCommonCompatibleVersions (Ljava/util/Set;Ljava/util/Set;Z)Ljava/util/Map;
|
||||||
public final fun deserialize (Ljava/lang/String;)[Lapp/revanced/library/Options$Patch;
|
public static synthetic fun mostCommonCompatibleVersions$default (Ljava/util/Set;Ljava/util/Set;ZILjava/lang/Object;)Ljava/util/Map;
|
||||||
public final fun serialize (Ljava/util/Set;Z)Ljava/lang/String;
|
|
||||||
public static synthetic fun serialize$default (Lapp/revanced/library/Options;Ljava/util/Set;ZILjava/lang/Object;)Ljava/lang/String;
|
|
||||||
public final fun setOptions (Ljava/util/Set;Ljava/io/File;)V
|
|
||||||
public final fun setOptions (Ljava/util/Set;Ljava/lang/String;)V
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/Options$Patch {
|
public final class app/revanced/library/SerializationKt {
|
||||||
public final fun getOptions ()Ljava/util/List;
|
public static final fun serializeTo (Ljava/util/Set;Ljava/io/OutputStream;Z)V
|
||||||
public final fun getPatchName ()Ljava/lang/String;
|
public static synthetic fun serializeTo$default (Ljava/util/Set;Ljava/io/OutputStream;ZILjava/lang/Object;)V
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/Options$Patch$Option {
|
|
||||||
public final fun getKey ()Ljava/lang/String;
|
|
||||||
public final fun getValue ()Ljava/lang/Object;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/PatchUtils;
|
|
||||||
public final fun getMostCommonCompatibleVersions (Ljava/util/Set;Ljava/util/Set;Z)Ljava/util/Map;
|
|
||||||
public static synthetic fun getMostCommonCompatibleVersions$default (Lapp/revanced/library/PatchUtils;Ljava/util/Set;Ljava/util/Set;ZILjava/lang/Object;)Ljava/util/Map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/PatchUtils$Json;
|
|
||||||
public final fun deserialize (Ljava/io/InputStream;Ljava/lang/Class;)Ljava/util/Set;
|
|
||||||
public final fun serialize (Ljava/util/Set;Lkotlin/jvm/functions/Function1;ZLjava/io/OutputStream;)V
|
|
||||||
public static synthetic fun serialize$default (Lapp/revanced/library/PatchUtils$Json;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ZLjava/io/OutputStream;ILjava/lang/Object;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch : app/revanced/library/PatchUtils$Json$JsonPatch {
|
|
||||||
public static final field Companion Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$Companion;
|
|
||||||
public final fun getCompatiblePackages ()Ljava/util/Set;
|
|
||||||
public final fun getDependencies ()Ljava/util/Set;
|
|
||||||
public final fun getDescription ()Ljava/lang/String;
|
|
||||||
public final fun getName ()Ljava/lang/String;
|
|
||||||
public final fun getOptions ()Ljava/util/Map;
|
|
||||||
public final fun getRequiresIntegrations ()Z
|
|
||||||
public final fun getUse ()Z
|
|
||||||
public final fun setRequiresIntegrations (Z)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$Companion {
|
|
||||||
public final fun fromPatch (Lapp/revanced/patcher/patch/Patch;)Lapp/revanced/library/PatchUtils$Json$FullJsonPatch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption {
|
|
||||||
public static final field Companion Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption$Companion;
|
|
||||||
public final fun getDefault ()Ljava/lang/Object;
|
|
||||||
public final fun getDescription ()Ljava/lang/String;
|
|
||||||
public final fun getKey ()Ljava/lang/String;
|
|
||||||
public final fun getRequired ()Z
|
|
||||||
public final fun getTitle ()Ljava/lang/String;
|
|
||||||
public final fun getValueType ()Ljava/lang/String;
|
|
||||||
public final fun getValues ()Ljava/util/Map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption$Companion {
|
|
||||||
public final fun fromPatchOption (Lapp/revanced/patcher/patch/options/PatchOption;)Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract interface class app/revanced/library/PatchUtils$Json$JsonPatch {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class app/revanced/library/Utils {
|
public final class app/revanced/library/Utils {
|
||||||
@@ -140,52 +66,6 @@ public final class app/revanced/library/Utils {
|
|||||||
public final fun isAndroidEnvironment ()Z
|
public final fun isAndroidEnvironment ()Z
|
||||||
}
|
}
|
||||||
|
|
||||||
public abstract class app/revanced/library/adb/AdbManager {
|
|
||||||
public static final field Companion Lapp/revanced/library/adb/AdbManager$Companion;
|
|
||||||
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
protected abstract fun getInstaller ()Lapp/revanced/library/installation/installer/Installer;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)Lkotlin/jvm/functions/Function1;
|
|
||||||
public fun uninstall (Ljava/lang/String;)Lkotlin/jvm/functions/Function1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$Apk {
|
|
||||||
public fun <init> (Ljava/io/File;Ljava/lang/String;)V
|
|
||||||
public synthetic fun <init> (Ljava/io/File;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getFile ()Ljava/io/File;
|
|
||||||
public final fun getPackageName ()Ljava/lang/String;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$Companion {
|
|
||||||
public final fun getAdbManager (Ljava/lang/String;Z)Lapp/revanced/library/adb/AdbManager;
|
|
||||||
public static synthetic fun getAdbManager$default (Lapp/revanced/library/adb/AdbManager$Companion;Ljava/lang/String;ZILjava/lang/Object;)Lapp/revanced/library/adb/AdbManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$DeviceNotFoundException : java/lang/Exception {
|
|
||||||
public fun <init> ()V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$FailedToFindInstalledPackageException : java/lang/Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$PackageNameRequiredException : java/lang/Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$RootAdbManager : app/revanced/library/adb/AdbManager {
|
|
||||||
public static final field Utils Lapp/revanced/library/adb/AdbManager$RootAdbManager$Utils;
|
|
||||||
public synthetic fun getInstaller ()Lapp/revanced/library/installation/installer/Installer;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)Lkotlin/jvm/functions/Function1;
|
|
||||||
public fun uninstall (Ljava/lang/String;)Lkotlin/jvm/functions/Function1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$RootAdbManager$Utils {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$UserAdbManager : app/revanced/library/adb/AdbManager {
|
|
||||||
public synthetic fun getInstaller ()Lapp/revanced/library/installation/installer/Installer;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)Lkotlin/jvm/functions/Function1;
|
|
||||||
public fun uninstall (Ljava/lang/String;)Lkotlin/jvm/functions/Function1;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/installation/command/AdbShellCommandRunner : app/revanced/library/installation/command/ShellCommandRunner {
|
public final class app/revanced/library/installation/command/AdbShellCommandRunner : app/revanced/library/installation/command/ShellCommandRunner {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -231,6 +111,10 @@ public final class app/revanced/library/installation/installer/AdbRootInstaller
|
|||||||
public synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
public synthetic fun <init> (Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public final class app/revanced/library/installation/installer/DeviceNotFoundException : java/lang/Exception {
|
||||||
|
public fun <init> ()V
|
||||||
|
}
|
||||||
|
|
||||||
public class app/revanced/library/installation/installer/Installation {
|
public class app/revanced/library/installation/installer/Installation {
|
||||||
public final fun getApkFilePath ()Ljava/lang/String;
|
public final fun getApkFilePath ()Ljava/lang/String;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,191 +0,0 @@
|
|||||||
public final class app/revanced/library/ApkSigner {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/ApkSigner;
|
|
||||||
public final fun newApkSigner (Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newApkSigner (Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newApkSigner (Ljava/lang/String;Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newApkSigner (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$Signer;
|
|
||||||
public final fun newKeyStore (Ljava/io/OutputStream;Ljava/lang/String;Ljava/util/Set;)V
|
|
||||||
public final fun newKeyStore (Ljava/util/Set;)Ljava/security/KeyStore;
|
|
||||||
public final fun newPrivateKeyCertificatePair (Ljava/lang/String;Ljava/util/Date;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun readKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun readKeyStore (Ljava/io/InputStream;Ljava/lang/String;)Ljava/security/KeyStore;
|
|
||||||
public final fun readPrivateKeyCertificatePair (Ljava/security/KeyStore;Ljava/lang/String;Ljava/lang/String;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/ApkSigner$KeyStoreEntry {
|
|
||||||
public fun <init> (Ljava/lang/String;Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)V
|
|
||||||
public final fun getAlias ()Ljava/lang/String;
|
|
||||||
public final fun getPassword ()Ljava/lang/String;
|
|
||||||
public final fun getPrivateKeyCertificatePair ()Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/ApkSigner$PrivateKeyCertificatePair {
|
|
||||||
public fun <init> (Ljava/security/PrivateKey;Ljava/security/cert/X509Certificate;)V
|
|
||||||
public final fun getCertificate ()Ljava/security/cert/X509Certificate;
|
|
||||||
public final fun getPrivateKey ()Ljava/security/PrivateKey;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/ApkSigner$Signer {
|
|
||||||
public final fun signApk (Lcom/android/tools/build/apkzlib/zip/ZFile;)V
|
|
||||||
public final fun signApk (Ljava/io/File;)V
|
|
||||||
public final fun signApk (Ljava/io/File;Ljava/io/File;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/ApkUtils;
|
|
||||||
public final fun applyTo (Lapp/revanced/patcher/PatcherResult;Ljava/io/File;)V
|
|
||||||
public final fun newPrivateKeyCertificatePair (Lapp/revanced/library/ApkUtils$PrivateKeyCertificatePairDetails;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun readPrivateKeyCertificatePairFromKeyStore (Lapp/revanced/library/ApkUtils$KeyStoreDetails;)Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;
|
|
||||||
public final fun sign (Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
|
|
||||||
public final fun sign (Ljava/io/File;Ljava/io/File;Lapp/revanced/library/ApkUtils$SigningOptions;)V
|
|
||||||
public final fun sign (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkSigner$PrivateKeyCertificatePair;)V
|
|
||||||
public final fun signApk (Ljava/io/File;Ljava/io/File;Ljava/lang/String;Lapp/revanced/library/ApkUtils$KeyStoreDetails;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils$KeyStoreDetails {
|
|
||||||
public fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
|
||||||
public synthetic fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getAlias ()Ljava/lang/String;
|
|
||||||
public final fun getKeyStore ()Ljava/io/File;
|
|
||||||
public final fun getKeyStorePassword ()Ljava/lang/String;
|
|
||||||
public final fun getPassword ()Ljava/lang/String;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils$PrivateKeyCertificatePairDetails {
|
|
||||||
public fun <init> ()V
|
|
||||||
public fun <init> (Ljava/lang/String;Ljava/util/Date;)V
|
|
||||||
public synthetic fun <init> (Ljava/lang/String;Ljava/util/Date;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getCommonName ()Ljava/lang/String;
|
|
||||||
public final fun getValidUntil ()Ljava/util/Date;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/ApkUtils$SigningOptions {
|
|
||||||
public fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;)V
|
|
||||||
public synthetic fun <init> (Ljava/io/File;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getAlias ()Ljava/lang/String;
|
|
||||||
public final fun getKeyStore ()Ljava/io/File;
|
|
||||||
public final fun getKeyStorePassword ()Ljava/lang/String;
|
|
||||||
public final fun getPassword ()Ljava/lang/String;
|
|
||||||
public final fun getSigner ()Ljava/lang/String;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/Options {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/Options;
|
|
||||||
public final fun deserialize (Ljava/lang/String;)[Lapp/revanced/library/Options$Patch;
|
|
||||||
public final fun serialize (Ljava/util/Set;Z)Ljava/lang/String;
|
|
||||||
public static synthetic fun serialize$default (Lapp/revanced/library/Options;Ljava/util/Set;ZILjava/lang/Object;)Ljava/lang/String;
|
|
||||||
public final fun setOptions (Ljava/util/Set;Ljava/io/File;)V
|
|
||||||
public final fun setOptions (Ljava/util/Set;Ljava/lang/String;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/Options$Patch {
|
|
||||||
public final fun getOptions ()Ljava/util/List;
|
|
||||||
public final fun getPatchName ()Ljava/lang/String;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/Options$Patch$Option {
|
|
||||||
public final fun getKey ()Ljava/lang/String;
|
|
||||||
public final fun getValue ()Ljava/lang/Object;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/PatchUtils;
|
|
||||||
public final fun getMostCommonCompatibleVersions (Ljava/util/Set;Ljava/util/Set;Z)Ljava/util/Map;
|
|
||||||
public static synthetic fun getMostCommonCompatibleVersions$default (Lapp/revanced/library/PatchUtils;Ljava/util/Set;Ljava/util/Set;ZILjava/lang/Object;)Ljava/util/Map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/PatchUtils$Json;
|
|
||||||
public final fun deserialize (Ljava/io/InputStream;Ljava/lang/Class;)Ljava/util/Set;
|
|
||||||
public final fun serialize (Ljava/util/Set;Lkotlin/jvm/functions/Function1;ZLjava/io/OutputStream;)V
|
|
||||||
public static synthetic fun serialize$default (Lapp/revanced/library/PatchUtils$Json;Ljava/util/Set;Lkotlin/jvm/functions/Function1;ZLjava/io/OutputStream;ILjava/lang/Object;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch : app/revanced/library/PatchUtils$Json$JsonPatch {
|
|
||||||
public static final field Companion Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$Companion;
|
|
||||||
public final fun getCompatiblePackages ()Ljava/util/Set;
|
|
||||||
public final fun getDependencies ()Ljava/util/Set;
|
|
||||||
public final fun getDescription ()Ljava/lang/String;
|
|
||||||
public final fun getName ()Ljava/lang/String;
|
|
||||||
public final fun getOptions ()Ljava/util/Map;
|
|
||||||
public final fun getRequiresIntegrations ()Z
|
|
||||||
public final fun getUse ()Z
|
|
||||||
public final fun setRequiresIntegrations (Z)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$Companion {
|
|
||||||
public final fun fromPatch (Lapp/revanced/patcher/patch/Patch;)Lapp/revanced/library/PatchUtils$Json$FullJsonPatch;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption {
|
|
||||||
public static final field Companion Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption$Companion;
|
|
||||||
public final fun getDefault ()Ljava/lang/Object;
|
|
||||||
public final fun getDescription ()Ljava/lang/String;
|
|
||||||
public final fun getKey ()Ljava/lang/String;
|
|
||||||
public final fun getRequired ()Z
|
|
||||||
public final fun getTitle ()Ljava/lang/String;
|
|
||||||
public final fun getValueType ()Ljava/lang/String;
|
|
||||||
public final fun getValues ()Ljava/util/Map;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption$Companion {
|
|
||||||
public final fun fromPatchOption (Lapp/revanced/patcher/patch/options/PatchOption;)Lapp/revanced/library/PatchUtils$Json$FullJsonPatch$FullJsonPatchOption;
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract interface class app/revanced/library/PatchUtils$Json$JsonPatch {
|
|
||||||
}
|
|
||||||
|
|
||||||
public abstract class app/revanced/library/adb/AdbManager {
|
|
||||||
public static final field Companion Lapp/revanced/library/adb/AdbManager$Companion;
|
|
||||||
public synthetic fun <init> (Ljava/lang/String;Lkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
protected final fun getDevice ()Lse/vidstige/jadb/JadbDevice;
|
|
||||||
protected final fun getLogger ()Ljava/util/logging/Logger;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)V
|
|
||||||
public fun uninstall (Ljava/lang/String;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$Apk {
|
|
||||||
public fun <init> (Ljava/io/File;Ljava/lang/String;)V
|
|
||||||
public synthetic fun <init> (Ljava/io/File;Ljava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
|
|
||||||
public final fun getFile ()Ljava/io/File;
|
|
||||||
public final fun getPackageName ()Ljava/lang/String;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$Companion {
|
|
||||||
public final fun getAdbManager (Ljava/lang/String;Z)Lapp/revanced/library/adb/AdbManager;
|
|
||||||
public static synthetic fun getAdbManager$default (Lapp/revanced/library/adb/AdbManager$Companion;Ljava/lang/String;ZILjava/lang/Object;)Lapp/revanced/library/adb/AdbManager;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$DeviceNotFoundException : java/lang/Exception {
|
|
||||||
public fun <init> ()V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$FailedToFindInstalledPackageException : java/lang/Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$PackageNameRequiredException : java/lang/Exception {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$RootAdbManager : app/revanced/library/adb/AdbManager {
|
|
||||||
public static final field Utils Lapp/revanced/library/adb/AdbManager$RootAdbManager$Utils;
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)V
|
|
||||||
public fun uninstall (Ljava/lang/String;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$RootAdbManager$Utils {
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/adb/AdbManager$UserAdbManager : app/revanced/library/adb/AdbManager {
|
|
||||||
public fun install (Lapp/revanced/library/adb/AdbManager$Apk;)V
|
|
||||||
public fun uninstall (Ljava/lang/String;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class app/revanced/library/logging/Logger {
|
|
||||||
public static final field INSTANCE Lapp/revanced/library/logging/Logger;
|
|
||||||
public final fun addHandler (Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function0;Lkotlin/jvm/functions/Function0;)V
|
|
||||||
public final fun removeAllHandlers ()V
|
|
||||||
public final fun setDefault ()V
|
|
||||||
public final fun setFormat (Ljava/lang/String;)V
|
|
||||||
public static synthetic fun setFormat$default (Lapp/revanced/library/logging/Logger;Ljava/lang/String;ILjava/lang/Object;)V
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -1,7 +1,10 @@
|
|||||||
|
import org.jetbrains.kotlin.gradle.dsl.JvmTarget
|
||||||
|
|
||||||
plugins {
|
plugins {
|
||||||
alias(libs.plugins.kotlin.multiplatform)
|
|
||||||
alias(libs.plugins.android.library)
|
alias(libs.plugins.android.library)
|
||||||
alias(libs.plugins.binary.compatibility.validator)
|
alias(libs.plugins.binary.compatibility.validator)
|
||||||
|
alias(libs.plugins.kotlin.multiplatform)
|
||||||
|
alias(libs.plugins.kotlin.serialization)
|
||||||
`maven-publish`
|
`maven-publish`
|
||||||
signing
|
signing
|
||||||
}
|
}
|
||||||
@@ -28,18 +31,14 @@ repositories {
|
|||||||
|
|
||||||
kotlin {
|
kotlin {
|
||||||
jvm {
|
jvm {
|
||||||
compilations.all {
|
compilerOptions {
|
||||||
kotlinOptions {
|
jvmTarget = JvmTarget.JVM_11
|
||||||
jvmTarget = JavaVersion.VERSION_11.toString()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
androidTarget {
|
androidTarget {
|
||||||
compilations.all {
|
compilerOptions {
|
||||||
kotlinOptions {
|
jvmTarget = JvmTarget.JVM_11
|
||||||
jvmTarget = JavaVersion.VERSION_11.toString()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
publishLibraryVariants("release")
|
publishLibraryVariants("release")
|
||||||
@@ -47,25 +46,25 @@ kotlin {
|
|||||||
|
|
||||||
sourceSets {
|
sourceSets {
|
||||||
androidMain.dependencies {
|
androidMain.dependencies {
|
||||||
|
implementation(libs.core.ktx)
|
||||||
implementation(libs.libsu.nio)
|
implementation(libs.libsu.nio)
|
||||||
implementation(libs.libsu.service)
|
implementation(libs.libsu.service)
|
||||||
implementation(libs.core.ktx)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
commonMain.dependencies {
|
commonMain.dependencies {
|
||||||
implementation(libs.revanced.patcher)
|
|
||||||
implementation(libs.kotlin.reflect)
|
|
||||||
implementation(libs.jadb) // Fork with Shell v2 support.
|
|
||||||
implementation(libs.bcpkix.jdk15on)
|
|
||||||
implementation(libs.jackson.module.kotlin)
|
|
||||||
implementation(libs.apkzlib)
|
|
||||||
implementation(libs.apksig)
|
implementation(libs.apksig)
|
||||||
|
implementation(libs.apkzlib)
|
||||||
|
implementation(libs.bcpkix.jdk18on)
|
||||||
implementation(libs.guava)
|
implementation(libs.guava)
|
||||||
|
implementation(libs.jadb)
|
||||||
|
implementation(libs.kotlin.reflect)
|
||||||
|
implementation(libs.kotlinx.serialization.json)
|
||||||
|
implementation(libs.revanced.patcher)
|
||||||
}
|
}
|
||||||
|
|
||||||
commonTest.dependencies {
|
commonTest.dependencies {
|
||||||
implementation(libs.revanced.patcher)
|
|
||||||
implementation(libs.kotlin.test.junit)
|
implementation(libs.kotlin.test.junit)
|
||||||
|
implementation(libs.revanced.patcher)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -97,41 +96,40 @@ publishing {
|
|||||||
name = "GitHubPackages"
|
name = "GitHubPackages"
|
||||||
url = uri("https://maven.pkg.github.com/revanced/revanced-library")
|
url = uri("https://maven.pkg.github.com/revanced/revanced-library")
|
||||||
credentials {
|
credentials {
|
||||||
username = System.getenv("GITHUB_ACTOR")
|
username = project.findProperty("gpr.user") as String? ?: System.getenv("GITHUB_ACTOR")
|
||||||
password = System.getenv("GITHUB_TOKEN")
|
password = project.findProperty("gpr.key") as String? ?: System.getenv("GITHUB_TOKEN")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
publications {
|
// KMP plugin creates a publication already, so just configure the POM.
|
||||||
create<MavenPublication>("revanced-library-publication") {
|
publications.all {
|
||||||
version = project.version.toString()
|
if (this !is MavenPublication) return@all
|
||||||
|
|
||||||
pom {
|
pom {
|
||||||
name = "ReVanced Library"
|
name = "ReVanced Library"
|
||||||
description = "Library containing common utilities for ReVanced"
|
description = "Library containing common utilities for ReVanced"
|
||||||
url = "https://revanced.app"
|
url = "https://revanced.app"
|
||||||
|
|
||||||
licenses {
|
licenses {
|
||||||
license {
|
license {
|
||||||
name = "GNU General Public License v3.0"
|
name = "GNU General Public License v3.0"
|
||||||
url = "https://www.gnu.org/licenses/gpl-3.0.en.html"
|
url = "https://www.gnu.org/licenses/gpl-3.0.en.html"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
developers {
|
developers {
|
||||||
developer {
|
developer {
|
||||||
id = "ReVanced"
|
id = "ReVanced"
|
||||||
name = "ReVanced"
|
name = "ReVanced"
|
||||||
email = "contact@revanced.app"
|
email = "contact@revanced.app"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
scm {
|
scm {
|
||||||
connection = "scm:git:git://github.com/revanced/revanced-library.git"
|
connection = "scm:git:git://github.com/revanced/revanced-library.git"
|
||||||
developerConnection = "scm:git:git@github.com:revanced/revanced-library.git"
|
developerConnection = "scm:git:git@github.com:revanced/revanced-library.git"
|
||||||
url = "https://github.com/revanced/revanced-library"
|
url = "https://github.com/revanced/revanced-library"
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -139,5 +137,5 @@ publishing {
|
|||||||
|
|
||||||
signing {
|
signing {
|
||||||
useGpgCmd()
|
useGpgCmd()
|
||||||
sign(publishing.publications["revanced-library-publication"])
|
sign(publishing.publications)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
version = 2.4.0-dev.1
|
version = 3.2.0-dev.1
|
||||||
#Gradle
|
#Gradle
|
||||||
org.gradle.jvmargs = -Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options="-Xmx2048M"
|
org.gradle.jvmargs = -Xmx2048M -Dfile.encoding=UTF-8 -Dkotlin.daemon.jvm.options="-Xmx2048M"
|
||||||
org.gradle.caching = true
|
org.gradle.caching = true
|
||||||
|
|||||||
@@ -1,32 +1,35 @@
|
|||||||
[versions]
|
[versions]
|
||||||
jackson-module-kotlin = "2.15.0"
|
android = "8.5.2"
|
||||||
jadb = "1.2.1"
|
bcpkix-jdk18on = "1.77"
|
||||||
kotlin = "1.9.22"
|
binary-compatibility-validator = "0.15.1"
|
||||||
revanced-patcher = "19.3.1"
|
core-ktx = "1.15.0"
|
||||||
binary-compatibility-validator = "0.14.0"
|
guava = "33.2.1-jre"
|
||||||
android = "8.3.0"
|
jadb = "1.2.1.1"
|
||||||
bcpkix-jdk15on = "1.70"
|
kotlin = "2.0.20"
|
||||||
guava = "33.0.0-jre"
|
kotlinx-coroutines = "1.8.1"
|
||||||
|
kotlinx-serialization = "1.7.1"
|
||||||
libsu = "5.2.2"
|
libsu = "5.2.2"
|
||||||
core-ktx = "1.12.0"
|
revanced-patcher = "21.0.0"
|
||||||
|
|
||||||
[libraries]
|
[libraries]
|
||||||
jackson-module-kotlin = { module = "com.fasterxml.jackson.module:jackson-module-kotlin", version.ref = "jackson-module-kotlin" }
|
|
||||||
jadb = { module = "app.revanced:jadb", version.ref = "jadb" }
|
|
||||||
kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
|
|
||||||
kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
|
|
||||||
revanced-patcher = { module = "app.revanced:revanced-patcher", version.ref = "revanced-patcher" }
|
|
||||||
apkzlib = { module = "com.android.tools.build:apkzlib", version.ref = "android" }
|
apkzlib = { module = "com.android.tools.build:apkzlib", version.ref = "android" }
|
||||||
apksig = { module = "com.android.tools.build:apksig", version.ref = "android" }
|
apksig = { module = "com.android.tools.build:apksig", version.ref = "android" }
|
||||||
bcpkix-jdk15on = { module = "org.bouncycastle:bcpkix-jdk15on", version.ref = "bcpkix-jdk15on" }
|
bcpkix-jdk18on = { module = "org.bouncycastle:bcpkix-jdk18on", version.ref = "bcpkix-jdk18on" }
|
||||||
|
core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" }
|
||||||
guava = { module = "com.google.guava:guava", version.ref = "guava" }
|
guava = { module = "com.google.guava:guava", version.ref = "guava" }
|
||||||
|
jadb = { module = "app.revanced:jadb", version.ref = "jadb" } # Fork with Shell v2 support.
|
||||||
|
kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
|
||||||
|
kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" }
|
||||||
|
kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kotlinx-coroutines" }
|
||||||
|
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization" }
|
||||||
libsu-core = { module = "com.github.topjohnwu.libsu:core", version.ref = "libsu" }
|
libsu-core = { module = "com.github.topjohnwu.libsu:core", version.ref = "libsu" }
|
||||||
libsu-nio = { module = "com.github.topjohnwu.libsu:nio", version.ref = "libsu" }
|
libsu-nio = { module = "com.github.topjohnwu.libsu:nio", version.ref = "libsu" }
|
||||||
libsu-service = { module = "com.github.topjohnwu.libsu:service", version.ref = "libsu" }
|
libsu-service = { module = "com.github.topjohnwu.libsu:service", version.ref = "libsu" }
|
||||||
core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "core-ktx" }
|
revanced-patcher = { module = "app.revanced:revanced-patcher", version.ref = "revanced-patcher" }
|
||||||
|
|
||||||
[plugins]
|
[plugins]
|
||||||
binary-compatibility-validator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "binary-compatibility-validator" }
|
|
||||||
android-library = { id = "com.android.library", version.ref = "android" }
|
android-library = { id = "com.android.library", version.ref = "android" }
|
||||||
|
binary-compatibility-validator = { id = "org.jetbrains.kotlinx.binary-compatibility-validator", version.ref = "binary-compatibility-validator" }
|
||||||
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
|
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
|
||||||
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
|
kotlin-multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" }
|
||||||
|
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
|
||||||
|
|||||||
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
BIN
gradle/wrapper/gradle-wrapper.jar
vendored
Binary file not shown.
8
gradle/wrapper/gradle-wrapper.properties
vendored
8
gradle/wrapper/gradle-wrapper.properties
vendored
@@ -1,6 +1,8 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.6-bin.zip
|
distributionSha256Sum=d725d707bfabd4dfdc958c624003b3c80accc03f7037b5122c4b1d0ef15cecab
|
||||||
distributionSha256Sum=9631d53cf3e74bfa726893aee1f8994fee4e060c401335946dba2156f440f24c
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.9-bin.zip
|
||||||
|
networkTimeout=10000
|
||||||
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
zipStorePath=wrapper/dist
|
zipStorePath=wrapper/dists
|
||||||
|
|||||||
297
gradlew
vendored
297
gradlew
vendored
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/env sh
|
#!/bin/sh
|
||||||
|
|
||||||
#
|
#
|
||||||
# Copyright 2015 the original author or authors.
|
# Copyright © 2015-2021 the original authors.
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
# you may not use this file except in compliance with the License.
|
# you may not use this file except in compliance with the License.
|
||||||
@@ -15,69 +15,104 @@
|
|||||||
# See the License for the specific language governing permissions and
|
# See the License for the specific language governing permissions and
|
||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
#
|
#
|
||||||
|
# SPDX-License-Identifier: Apache-2.0
|
||||||
|
#
|
||||||
|
|
||||||
##############################################################################
|
##############################################################################
|
||||||
##
|
#
|
||||||
## Gradle start up script for UN*X
|
# Gradle start up script for POSIX generated by Gradle.
|
||||||
##
|
#
|
||||||
|
# Important for running:
|
||||||
|
#
|
||||||
|
# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is
|
||||||
|
# noncompliant, but you have some other compliant shell such as ksh or
|
||||||
|
# bash, then to run this script, type that shell name before the whole
|
||||||
|
# command line, like:
|
||||||
|
#
|
||||||
|
# ksh Gradle
|
||||||
|
#
|
||||||
|
# Busybox and similar reduced shells will NOT work, because this script
|
||||||
|
# requires all of these POSIX shell features:
|
||||||
|
# * functions;
|
||||||
|
# * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,
|
||||||
|
# «${var#prefix}», «${var%suffix}», and «$( cmd )»;
|
||||||
|
# * compound commands having a testable exit status, especially «case»;
|
||||||
|
# * various built-in commands including «command», «set», and «ulimit».
|
||||||
|
#
|
||||||
|
# Important for patching:
|
||||||
|
#
|
||||||
|
# (2) This script targets any POSIX shell, so it avoids extensions provided
|
||||||
|
# by Bash, Ksh, etc; in particular arrays are avoided.
|
||||||
|
#
|
||||||
|
# The "traditional" practice of packing multiple parameters into a
|
||||||
|
# space-separated string is a well documented source of bugs and security
|
||||||
|
# problems, so this is (mostly) avoided, by progressively accumulating
|
||||||
|
# options in "$@", and eventually passing that to Java.
|
||||||
|
#
|
||||||
|
# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,
|
||||||
|
# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;
|
||||||
|
# see the in-line comments for details.
|
||||||
|
#
|
||||||
|
# There are tweaks for specific operating systems such as AIX, CygWin,
|
||||||
|
# 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
|
||||||
|
# within the Gradle project.
|
||||||
|
#
|
||||||
|
# You can find Gradle at https://github.com/gradle/gradle/.
|
||||||
|
#
|
||||||
##############################################################################
|
##############################################################################
|
||||||
|
|
||||||
# Attempt to set APP_HOME
|
# Attempt to set APP_HOME
|
||||||
|
|
||||||
# Resolve links: $0 may be a link
|
# Resolve links: $0 may be a link
|
||||||
PRG="$0"
|
app_path=$0
|
||||||
# Need this for relative symlinks.
|
|
||||||
while [ -h "$PRG" ] ; do
|
# Need this for daisy-chained symlinks.
|
||||||
ls=`ls -ld "$PRG"`
|
while
|
||||||
link=`expr "$ls" : '.*-> \(.*\)$'`
|
APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path
|
||||||
if expr "$link" : '/.*' > /dev/null; then
|
[ -h "$app_path" ]
|
||||||
PRG="$link"
|
do
|
||||||
else
|
ls=$( ls -ld "$app_path" )
|
||||||
PRG=`dirname "$PRG"`"/$link"
|
link=${ls#*' -> '}
|
||||||
fi
|
case $link in #(
|
||||||
|
/*) app_path=$link ;; #(
|
||||||
|
*) app_path=$APP_HOME$link ;;
|
||||||
|
esac
|
||||||
done
|
done
|
||||||
SAVED="`pwd`"
|
|
||||||
cd "`dirname \"$PRG\"`/" >/dev/null
|
|
||||||
APP_HOME="`pwd -P`"
|
|
||||||
cd "$SAVED" >/dev/null
|
|
||||||
|
|
||||||
APP_NAME="Gradle"
|
# This is normally unused
|
||||||
APP_BASE_NAME=`basename "$0"`
|
# shellcheck disable=SC2034
|
||||||
|
APP_BASE_NAME=${0##*/}
|
||||||
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
|
||||||
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s
|
||||||
|
' "$PWD" ) || exit
|
||||||
|
|
||||||
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
# Use the maximum available, or set MAX_FD != -1 to use that value.
|
||||||
MAX_FD="maximum"
|
MAX_FD=maximum
|
||||||
|
|
||||||
warn () {
|
warn () {
|
||||||
echo "$*"
|
echo "$*"
|
||||||
}
|
} >&2
|
||||||
|
|
||||||
die () {
|
die () {
|
||||||
echo
|
echo
|
||||||
echo "$*"
|
echo "$*"
|
||||||
echo
|
echo
|
||||||
exit 1
|
exit 1
|
||||||
}
|
} >&2
|
||||||
|
|
||||||
# OS specific support (must be 'true' or 'false').
|
# OS specific support (must be 'true' or 'false').
|
||||||
cygwin=false
|
cygwin=false
|
||||||
msys=false
|
msys=false
|
||||||
darwin=false
|
darwin=false
|
||||||
nonstop=false
|
nonstop=false
|
||||||
case "`uname`" in
|
case "$( uname )" in #(
|
||||||
CYGWIN* )
|
CYGWIN* ) cygwin=true ;; #(
|
||||||
cygwin=true
|
Darwin* ) darwin=true ;; #(
|
||||||
;;
|
MSYS* | MINGW* ) msys=true ;; #(
|
||||||
Darwin* )
|
NONSTOP* ) nonstop=true ;;
|
||||||
darwin=true
|
|
||||||
;;
|
|
||||||
MINGW* )
|
|
||||||
msys=true
|
|
||||||
;;
|
|
||||||
NONSTOP* )
|
|
||||||
nonstop=true
|
|
||||||
;;
|
|
||||||
esac
|
esac
|
||||||
|
|
||||||
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
||||||
@@ -87,9 +122,9 @@ CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
|
|||||||
if [ -n "$JAVA_HOME" ] ; then
|
if [ -n "$JAVA_HOME" ] ; then
|
||||||
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
|
||||||
# IBM's JDK on AIX uses strange locations for the executables
|
# IBM's JDK on AIX uses strange locations for the executables
|
||||||
JAVACMD="$JAVA_HOME/jre/sh/java"
|
JAVACMD=$JAVA_HOME/jre/sh/java
|
||||||
else
|
else
|
||||||
JAVACMD="$JAVA_HOME/bin/java"
|
JAVACMD=$JAVA_HOME/bin/java
|
||||||
fi
|
fi
|
||||||
if [ ! -x "$JAVACMD" ] ; then
|
if [ ! -x "$JAVACMD" ] ; then
|
||||||
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
|
||||||
@@ -98,88 +133,120 @@ Please set the JAVA_HOME variable in your environment to match the
|
|||||||
location of your Java installation."
|
location of your Java installation."
|
||||||
fi
|
fi
|
||||||
else
|
else
|
||||||
JAVACMD="java"
|
JAVACMD=java
|
||||||
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
if ! command -v java >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
||||||
|
|
||||||
Please set the JAVA_HOME variable in your environment to match the
|
Please set the JAVA_HOME variable in your environment to match the
|
||||||
location of your Java installation."
|
location of your Java installation."
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Increase the maximum file descriptors if we can.
|
# Increase the maximum file descriptors if we can.
|
||||||
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
|
if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then
|
||||||
MAX_FD_LIMIT=`ulimit -H -n`
|
case $MAX_FD in #(
|
||||||
if [ $? -eq 0 ] ; then
|
max*)
|
||||||
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
|
# In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.
|
||||||
MAX_FD="$MAX_FD_LIMIT"
|
# shellcheck disable=SC2039,SC3045
|
||||||
fi
|
MAX_FD=$( ulimit -H -n ) ||
|
||||||
ulimit -n $MAX_FD
|
warn "Could not query maximum file descriptor limit"
|
||||||
if [ $? -ne 0 ] ; then
|
esac
|
||||||
warn "Could not set maximum file descriptor limit: $MAX_FD"
|
case $MAX_FD in #(
|
||||||
fi
|
'' | soft) :;; #(
|
||||||
else
|
*)
|
||||||
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
|
# In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.
|
||||||
fi
|
# shellcheck disable=SC2039,SC3045
|
||||||
fi
|
ulimit -n "$MAX_FD" ||
|
||||||
|
warn "Could not set maximum file descriptor limit to $MAX_FD"
|
||||||
# For Darwin, add options to specify how the application appears in the dock
|
|
||||||
if $darwin; then
|
|
||||||
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
|
|
||||||
fi
|
|
||||||
|
|
||||||
# For Cygwin or MSYS, switch paths to Windows format before running java
|
|
||||||
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
|
|
||||||
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
|
|
||||||
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
|
|
||||||
|
|
||||||
JAVACMD=`cygpath --unix "$JAVACMD"`
|
|
||||||
|
|
||||||
# We build the pattern for arguments to be converted via cygpath
|
|
||||||
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
|
|
||||||
SEP=""
|
|
||||||
for dir in $ROOTDIRSRAW ; do
|
|
||||||
ROOTDIRS="$ROOTDIRS$SEP$dir"
|
|
||||||
SEP="|"
|
|
||||||
done
|
|
||||||
OURCYGPATTERN="(^($ROOTDIRS))"
|
|
||||||
# Add a user-defined pattern to the cygpath arguments
|
|
||||||
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
|
|
||||||
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
|
|
||||||
fi
|
|
||||||
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
|
||||||
i=0
|
|
||||||
for arg in "$@" ; do
|
|
||||||
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
|
|
||||||
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
|
|
||||||
|
|
||||||
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
|
|
||||||
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
|
|
||||||
else
|
|
||||||
eval `echo args$i`="\"$arg\""
|
|
||||||
fi
|
|
||||||
i=`expr $i + 1`
|
|
||||||
done
|
|
||||||
case $i in
|
|
||||||
0) set -- ;;
|
|
||||||
1) set -- "$args0" ;;
|
|
||||||
2) set -- "$args0" "$args1" ;;
|
|
||||||
3) set -- "$args0" "$args1" "$args2" ;;
|
|
||||||
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
|
|
||||||
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
|
|
||||||
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
|
|
||||||
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
|
|
||||||
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
|
|
||||||
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
|
|
||||||
esac
|
esac
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Escape application args
|
# Collect all arguments for the java command, stacking in reverse order:
|
||||||
save () {
|
# * args from the command line
|
||||||
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
|
# * the main class name
|
||||||
echo " "
|
# * -classpath
|
||||||
}
|
# * -D...appname settings
|
||||||
APP_ARGS=`save "$@"`
|
# * --module-path (only if needed)
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.
|
||||||
|
|
||||||
# Collect all arguments for the java command, following the shell quoting and substitution rules
|
# For Cygwin or MSYS, switch paths to Windows format before running java
|
||||||
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
|
if "$cygwin" || "$msys" ; then
|
||||||
|
APP_HOME=$( cygpath --path --mixed "$APP_HOME" )
|
||||||
|
CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" )
|
||||||
|
|
||||||
|
JAVACMD=$( cygpath --unix "$JAVACMD" )
|
||||||
|
|
||||||
|
# Now convert the arguments - kludge to limit ourselves to /bin/sh
|
||||||
|
for arg do
|
||||||
|
if
|
||||||
|
case $arg in #(
|
||||||
|
-*) false ;; # don't mess with options #(
|
||||||
|
/?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath
|
||||||
|
[ -e "$t" ] ;; #(
|
||||||
|
*) false ;;
|
||||||
|
esac
|
||||||
|
then
|
||||||
|
arg=$( cygpath --path --ignore --mixed "$arg" )
|
||||||
|
fi
|
||||||
|
# Roll the args list around exactly as many times as the number of
|
||||||
|
# args, so each arg winds up back in the position where it started, but
|
||||||
|
# possibly modified.
|
||||||
|
#
|
||||||
|
# NB: a `for` loop captures its iteration list before it begins, so
|
||||||
|
# changing the positional parameters here affects neither the number of
|
||||||
|
# iterations, nor the values presented in `arg`.
|
||||||
|
shift # remove old arg
|
||||||
|
set -- "$@" "$arg" # push replacement arg
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
|
||||||
|
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
|
||||||
|
|
||||||
|
# Collect all arguments for the java command:
|
||||||
|
# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments,
|
||||||
|
# and any embedded shellness will be escaped.
|
||||||
|
# * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be
|
||||||
|
# treated as '${Hostname}' itself on the command line.
|
||||||
|
|
||||||
|
set -- \
|
||||||
|
"-Dorg.gradle.appname=$APP_BASE_NAME" \
|
||||||
|
-classpath "$CLASSPATH" \
|
||||||
|
org.gradle.wrapper.GradleWrapperMain \
|
||||||
|
"$@"
|
||||||
|
|
||||||
|
# Stop when "xargs" is not available.
|
||||||
|
if ! command -v xargs >/dev/null 2>&1
|
||||||
|
then
|
||||||
|
die "xargs is not available"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Use "xargs" to parse quoted args.
|
||||||
|
#
|
||||||
|
# With -n1 it outputs one arg per line, with the quotes and backslashes removed.
|
||||||
|
#
|
||||||
|
# In Bash we could simply go:
|
||||||
|
#
|
||||||
|
# readarray ARGS < <( xargs -n1 <<<"$var" ) &&
|
||||||
|
# set -- "${ARGS[@]}" "$@"
|
||||||
|
#
|
||||||
|
# but POSIX shell has neither arrays nor command substitution, so instead we
|
||||||
|
# post-process each arg (as a line of input to sed) to backslash-escape any
|
||||||
|
# character that might be a shell metacharacter, then use eval to reverse
|
||||||
|
# that process (while maintaining the separation between arguments), and wrap
|
||||||
|
# the whole thing up as a single "set" statement.
|
||||||
|
#
|
||||||
|
# This will of course break if any of these variables contains a newline or
|
||||||
|
# an unmatched quote.
|
||||||
|
#
|
||||||
|
|
||||||
|
eval "set -- $(
|
||||||
|
printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" |
|
||||||
|
xargs -n1 |
|
||||||
|
sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' |
|
||||||
|
tr '\n' ' '
|
||||||
|
)" '"$@"'
|
||||||
|
|
||||||
exec "$JAVACMD" "$@"
|
exec "$JAVACMD" "$@"
|
||||||
|
|||||||
37
gradlew.bat
vendored
37
gradlew.bat
vendored
@@ -13,8 +13,10 @@
|
|||||||
@rem See the License for the specific language governing permissions and
|
@rem See the License for the specific language governing permissions and
|
||||||
@rem limitations under the License.
|
@rem limitations under the License.
|
||||||
@rem
|
@rem
|
||||||
|
@rem SPDX-License-Identifier: Apache-2.0
|
||||||
|
@rem
|
||||||
|
|
||||||
@if "%DEBUG%" == "" @echo off
|
@if "%DEBUG%"=="" @echo off
|
||||||
@rem ##########################################################################
|
@rem ##########################################################################
|
||||||
@rem
|
@rem
|
||||||
@rem Gradle startup script for Windows
|
@rem Gradle startup script for Windows
|
||||||
@@ -25,7 +27,8 @@
|
|||||||
if "%OS%"=="Windows_NT" setlocal
|
if "%OS%"=="Windows_NT" setlocal
|
||||||
|
|
||||||
set DIRNAME=%~dp0
|
set DIRNAME=%~dp0
|
||||||
if "%DIRNAME%" == "" set DIRNAME=.
|
if "%DIRNAME%"=="" set DIRNAME=.
|
||||||
|
@rem This is normally unused
|
||||||
set APP_BASE_NAME=%~n0
|
set APP_BASE_NAME=%~n0
|
||||||
set APP_HOME=%DIRNAME%
|
set APP_HOME=%DIRNAME%
|
||||||
|
|
||||||
@@ -40,13 +43,13 @@ if defined JAVA_HOME goto findJavaFromJavaHome
|
|||||||
|
|
||||||
set JAVA_EXE=java.exe
|
set JAVA_EXE=java.exe
|
||||||
%JAVA_EXE% -version >NUL 2>&1
|
%JAVA_EXE% -version >NUL 2>&1
|
||||||
if "%ERRORLEVEL%" == "0" goto execute
|
if %ERRORLEVEL% equ 0 goto execute
|
||||||
|
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
|
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
echo location of your Java installation.
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
goto fail
|
goto fail
|
||||||
|
|
||||||
@@ -56,11 +59,11 @@ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
|
|||||||
|
|
||||||
if exist "%JAVA_EXE%" goto execute
|
if exist "%JAVA_EXE%" goto execute
|
||||||
|
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
|
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2
|
||||||
echo.
|
echo. 1>&2
|
||||||
echo Please set the JAVA_HOME variable in your environment to match the
|
echo Please set the JAVA_HOME variable in your environment to match the 1>&2
|
||||||
echo location of your Java installation.
|
echo location of your Java installation. 1>&2
|
||||||
|
|
||||||
goto fail
|
goto fail
|
||||||
|
|
||||||
@@ -75,13 +78,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
|
|||||||
|
|
||||||
:end
|
:end
|
||||||
@rem End local scope for the variables with windows NT shell
|
@rem End local scope for the variables with windows NT shell
|
||||||
if "%ERRORLEVEL%"=="0" goto mainEnd
|
if %ERRORLEVEL% equ 0 goto mainEnd
|
||||||
|
|
||||||
:fail
|
:fail
|
||||||
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
|
||||||
rem the _cmd.exe /c_ return code!
|
rem the _cmd.exe /c_ return code!
|
||||||
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
|
set EXIT_CODE=%ERRORLEVEL%
|
||||||
exit /b 1
|
if %EXIT_CODE% equ 0 set EXIT_CODE=1
|
||||||
|
if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE%
|
||||||
|
exit /b %EXIT_CODE%
|
||||||
|
|
||||||
:mainEnd
|
:mainEnd
|
||||||
if "%OS%"=="Windows_NT" endlocal
|
if "%OS%"=="Windows_NT" endlocal
|
||||||
|
|||||||
3002
package-lock.json
generated
3002
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@
|
|||||||
"@saithodev/semantic-release-backmerge": "^4.0.1",
|
"@saithodev/semantic-release-backmerge": "^4.0.1",
|
||||||
"@semantic-release/changelog": "^6.0.3",
|
"@semantic-release/changelog": "^6.0.3",
|
||||||
"@semantic-release/git": "^10.0.1",
|
"@semantic-release/git": "^10.0.1",
|
||||||
"gradle-semantic-release-plugin": "^1.9.1",
|
"gradle-semantic-release-plugin": "^1.10.1",
|
||||||
"semantic-release": "^23.0.2"
|
"semantic-release": "^24.1.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import android.content.Intent
|
|||||||
import android.content.IntentFilter
|
import android.content.IntentFilter
|
||||||
import android.content.pm.PackageInstaller
|
import android.content.pm.PackageInstaller
|
||||||
import android.content.pm.PackageManager
|
import android.content.pm.PackageManager
|
||||||
|
import android.os.Build
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import app.revanced.library.installation.installer.Installer.Apk
|
import app.revanced.library.installation.installer.Installer.Apk
|
||||||
import java.io.Closeable
|
import java.io.Closeable
|
||||||
@@ -85,10 +86,13 @@ class LocalInstaller(
|
|||||||
|
|
||||||
override fun close() = context.unregisterReceiver(broadcastReceiver)
|
override fun close() = context.unregisterReceiver(broadcastReceiver)
|
||||||
|
|
||||||
|
@SuppressLint("MissingPermission")
|
||||||
companion object {
|
companion object {
|
||||||
private val sessionParams = PackageInstaller.SessionParams(
|
private val sessionParams = PackageInstaller.SessionParams(
|
||||||
PackageInstaller.SessionParams.MODE_FULL_INSTALL,
|
PackageInstaller.SessionParams.MODE_FULL_INSTALL,
|
||||||
).apply {
|
).apply {
|
||||||
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE)
|
||||||
|
setRequestUpdateOwnership(true)
|
||||||
setInstallReason(PackageManager.INSTALL_REASON_USER)
|
setInstallReason(PackageManager.INSTALL_REASON_USER)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,6 @@
|
|||||||
package app.revanced.library
|
package app.revanced.library
|
||||||
|
|
||||||
import com.android.apksig.ApkSigner.SignerConfig
|
import com.android.apksig.ApkSigner.SignerConfig
|
||||||
import com.android.tools.build.apkzlib.sign.SigningExtension
|
|
||||||
import com.android.tools.build.apkzlib.sign.SigningOptions
|
|
||||||
import com.android.tools.build.apkzlib.zip.ZFile
|
|
||||||
import org.bouncycastle.asn1.x500.X500Name
|
import org.bouncycastle.asn1.x500.X500Name
|
||||||
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
|
import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo
|
||||||
import org.bouncycastle.cert.X509v3CertificateBuilder
|
import org.bouncycastle.cert.X509v3CertificateBuilder
|
||||||
@@ -13,7 +10,6 @@ import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder
|
|||||||
import java.io.File
|
import java.io.File
|
||||||
import java.io.IOException
|
import java.io.IOException
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
import java.io.OutputStream
|
|
||||||
import java.math.BigInteger
|
import java.math.BigInteger
|
||||||
import java.security.*
|
import java.security.*
|
||||||
import java.security.cert.X509Certificate
|
import java.security.cert.X509Certificate
|
||||||
@@ -197,105 +193,6 @@ object ApkSigner {
|
|||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
/**
|
|
||||||
* Read a [PrivateKeyCertificatePair] from a keystore entry.
|
|
||||||
*
|
|
||||||
* @param keyStore The keystore to read the entry from.
|
|
||||||
* @param keyStoreEntryAlias The alias of the key store entry to read.
|
|
||||||
* @param keyStoreEntryPassword The password for recovering the signing key.
|
|
||||||
*
|
|
||||||
* @return The read [PrivateKeyCertificatePair].
|
|
||||||
*
|
|
||||||
* @throws IllegalArgumentException If the keystore does not contain the given alias or the password is invalid.
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun readKeyCertificatePair(
|
|
||||||
keyStore: KeyStore,
|
|
||||||
keyStoreEntryAlias: String,
|
|
||||||
keyStoreEntryPassword: String,
|
|
||||||
) = readPrivateKeyCertificatePair(keyStore, keyStoreEntryAlias, keyStoreEntryPassword)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new keystore with a new keypair and saves it to the given [keyStoreOutputStream].
|
|
||||||
*
|
|
||||||
* @param keyStoreOutputStream The stream to write the keystore to.
|
|
||||||
* @param keyStorePassword The password for the keystore.
|
|
||||||
* @param entries The entries to add to the keystore.
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun newKeyStore(
|
|
||||||
keyStoreOutputStream: OutputStream,
|
|
||||||
keyStorePassword: String?,
|
|
||||||
entries: Set<KeyStoreEntry>,
|
|
||||||
) = newKeyStore(entries).store(
|
|
||||||
keyStoreOutputStream,
|
|
||||||
keyStorePassword?.toCharArray(),
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new [Signer].
|
|
||||||
*
|
|
||||||
* @param privateKeyCertificatePair The private key and certificate pair to use for signing.
|
|
||||||
*
|
|
||||||
* @return The new [Signer].
|
|
||||||
*
|
|
||||||
* @see PrivateKeyCertificatePair
|
|
||||||
* @see Signer
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun newApkSigner(privateKeyCertificatePair: PrivateKeyCertificatePair) =
|
|
||||||
Signer(
|
|
||||||
SigningExtension(
|
|
||||||
SigningOptions.builder()
|
|
||||||
.setMinSdkVersion(21) // TODO: Extracting from the target APK would be ideal.
|
|
||||||
.setV1SigningEnabled(true)
|
|
||||||
.setV2SigningEnabled(true)
|
|
||||||
.setCertificates(privateKeyCertificatePair.certificate)
|
|
||||||
.setKey(privateKeyCertificatePair.privateKey)
|
|
||||||
.build(),
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new [Signer].
|
|
||||||
*
|
|
||||||
* @param signer The name of the signer.
|
|
||||||
* @param keyStore The keystore to use for signing.
|
|
||||||
* @param keyStoreEntryAlias The alias of the key store entry to use for signing.
|
|
||||||
* @param keyStoreEntryPassword The password for recovering the signing key.
|
|
||||||
*
|
|
||||||
* @return The new [Signer].
|
|
||||||
*
|
|
||||||
* @see KeyStore
|
|
||||||
* @see Signer
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun newApkSigner(
|
|
||||||
signer: String,
|
|
||||||
keyStore: KeyStore,
|
|
||||||
keyStoreEntryAlias: String,
|
|
||||||
keyStoreEntryPassword: String,
|
|
||||||
) = newApkSigner(signer, readKeyCertificatePair(keyStore, keyStoreEntryAlias, keyStoreEntryPassword))
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new [Signer].
|
|
||||||
*
|
|
||||||
* @param keyStore The keystore to use for signing.
|
|
||||||
* @param keyStoreEntryAlias The alias of the key store entry to use for signing.
|
|
||||||
* @param keyStoreEntryPassword The password for recovering the signing key.
|
|
||||||
*
|
|
||||||
* @return The new [Signer].
|
|
||||||
*
|
|
||||||
* @see KeyStore
|
|
||||||
* @see Signer
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun newApkSigner(
|
|
||||||
keyStore: KeyStore,
|
|
||||||
keyStoreEntryAlias: String,
|
|
||||||
keyStoreEntryPassword: String,
|
|
||||||
) = newApkSigner("ReVanced", readKeyCertificatePair(keyStore, keyStoreEntryAlias, keyStoreEntryPassword))
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An entry in a keystore.
|
* An entry in a keystore.
|
||||||
*
|
*
|
||||||
@@ -322,48 +219,11 @@ object ApkSigner {
|
|||||||
val certificate: X509Certificate,
|
val certificate: X509Certificate,
|
||||||
)
|
)
|
||||||
|
|
||||||
class Signer {
|
class Signer internal constructor(private val signerBuilder: com.android.apksig.ApkSigner.Builder) {
|
||||||
private val signerBuilder: com.android.apksig.ApkSigner.Builder?
|
|
||||||
private val signingExtension: SigningExtension?
|
|
||||||
|
|
||||||
internal constructor(signerBuilder: com.android.apksig.ApkSigner.Builder) {
|
|
||||||
this.signerBuilder = signerBuilder
|
|
||||||
signingExtension = null
|
|
||||||
}
|
|
||||||
|
|
||||||
fun signApk(inputApkFile: File, outputApkFile: File) {
|
fun signApk(inputApkFile: File, outputApkFile: File) {
|
||||||
logger.info("Signing APK")
|
logger.info("Signing APK")
|
||||||
|
|
||||||
signerBuilder?.setInputApk(inputApkFile)?.setOutputApk(outputApkFile)?.build()?.sign()
|
signerBuilder.setInputApk(inputApkFile)?.setOutputApk(outputApkFile)?.build()?.sign()
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("This constructor will be removed in the future.")
|
|
||||||
internal constructor(signingExtension: SigningExtension) {
|
|
||||||
signerBuilder = null
|
|
||||||
this.signingExtension = signingExtension
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sign an APK file.
|
|
||||||
*
|
|
||||||
* @param apkFile The APK file to sign.
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun signApk(apkFile: File) = ZFile.openReadWrite(apkFile).use {
|
|
||||||
@Suppress("DEPRECATION")
|
|
||||||
signApk(it)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sign an APK file.
|
|
||||||
*
|
|
||||||
* @param apkZFile The APK [ZFile] to sign.
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun signApk(apkZFile: ZFile) {
|
|
||||||
logger.info("Signing ${apkZFile.file.name}")
|
|
||||||
|
|
||||||
signingExtension?.register(apkZFile)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,7 +82,7 @@ object ApkUtils {
|
|||||||
// Delete resources that were staged for deletion.
|
// Delete resources that were staged for deletion.
|
||||||
if (resources.deleteResources.isNotEmpty()) {
|
if (resources.deleteResources.isNotEmpty()) {
|
||||||
targetApkZFile.entries().filter { entry ->
|
targetApkZFile.entries().filter { entry ->
|
||||||
resources.deleteResources.any { shouldDelete -> shouldDelete(entry.centralDirectoryHeader.name) }
|
entry.centralDirectoryHeader.name in resources.deleteResources
|
||||||
}.forEach(StoredEntry::delete)
|
}.forEach(StoredEntry::delete)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -103,8 +103,7 @@ object ApkUtils {
|
|||||||
*
|
*
|
||||||
* @return The newly created private key and certificate pair.
|
* @return The newly created private key and certificate pair.
|
||||||
*/
|
*/
|
||||||
@Deprecated("This method will be removed in the future.")
|
private fun newPrivateKeyCertificatePair(
|
||||||
fun newPrivateKeyCertificatePair(
|
|
||||||
privateKeyCertificatePairDetails: PrivateKeyCertificatePairDetails,
|
privateKeyCertificatePairDetails: PrivateKeyCertificatePairDetails,
|
||||||
keyStoreDetails: KeyStoreDetails,
|
keyStoreDetails: KeyStoreDetails,
|
||||||
) = newPrivateKeyCertificatePair(
|
) = newPrivateKeyCertificatePair(
|
||||||
@@ -132,8 +131,7 @@ object ApkUtils {
|
|||||||
*
|
*
|
||||||
* @return The private key and certificate pair.
|
* @return The private key and certificate pair.
|
||||||
*/
|
*/
|
||||||
@Deprecated("This method will be removed in the future.")
|
private fun readPrivateKeyCertificatePairFromKeyStore(
|
||||||
fun readPrivateKeyCertificatePairFromKeyStore(
|
|
||||||
keyStoreDetails: KeyStoreDetails,
|
keyStoreDetails: KeyStoreDetails,
|
||||||
) = ApkSigner.readPrivateKeyCertificatePair(
|
) = ApkSigner.readPrivateKeyCertificatePair(
|
||||||
ApkSigner.readKeyStore(
|
ApkSigner.readKeyStore(
|
||||||
@@ -168,91 +166,6 @@ object ApkUtils {
|
|||||||
},
|
},
|
||||||
).signApk(inputApkFile, outputApkFile)
|
).signApk(inputApkFile, outputApkFile)
|
||||||
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
private fun readOrNewPrivateKeyCertificatePair(
|
|
||||||
signingOptions: SigningOptions,
|
|
||||||
): ApkSigner.PrivateKeyCertificatePair {
|
|
||||||
val privateKeyCertificatePairDetails = PrivateKeyCertificatePairDetails(
|
|
||||||
signingOptions.alias,
|
|
||||||
PrivateKeyCertificatePairDetails().validUntil,
|
|
||||||
)
|
|
||||||
val keyStoreDetails = KeyStoreDetails(
|
|
||||||
signingOptions.keyStore,
|
|
||||||
signingOptions.keyStorePassword,
|
|
||||||
signingOptions.alias,
|
|
||||||
signingOptions.password,
|
|
||||||
)
|
|
||||||
|
|
||||||
return if (keyStoreDetails.keyStore.exists()) {
|
|
||||||
readPrivateKeyCertificatePairFromKeyStore(keyStoreDetails)
|
|
||||||
} else {
|
|
||||||
newPrivateKeyCertificatePair(privateKeyCertificatePairDetails, keyStoreDetails)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Signs [inputApkFile] with the given options and saves the signed apk to [outputApkFile].
|
|
||||||
*
|
|
||||||
* @param inputApkFile The apk file to sign.
|
|
||||||
* @param outputApkFile The file to save the signed apk to.
|
|
||||||
* @param signer The name of the signer.
|
|
||||||
* @param privateKeyCertificatePair The private key and certificate pair to use for signing.
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun sign(
|
|
||||||
inputApkFile: File,
|
|
||||||
outputApkFile: File,
|
|
||||||
signer: String,
|
|
||||||
privateKeyCertificatePair: ApkSigner.PrivateKeyCertificatePair,
|
|
||||||
) = ApkSigner.newApkSigner(
|
|
||||||
signer,
|
|
||||||
privateKeyCertificatePair,
|
|
||||||
).signApk(inputApkFile, outputApkFile)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Signs the apk file with the given options.
|
|
||||||
*
|
|
||||||
* @param signingOptions The options to use for signing.
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun File.sign(signingOptions: SigningOptions) = ApkSigner.newApkSigner(
|
|
||||||
signingOptions.signer,
|
|
||||||
readOrNewPrivateKeyCertificatePair(signingOptions),
|
|
||||||
).signApk(this)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Signs [inputApkFile] with the given options and saves the signed apk to [outputApkFile].
|
|
||||||
*
|
|
||||||
* @param inputApkFile The apk file to sign.
|
|
||||||
* @param outputApkFile The file to save the signed apk to.
|
|
||||||
* @param signingOptions The options to use for signing.
|
|
||||||
*/
|
|
||||||
@Deprecated("This method will be removed in the future.")
|
|
||||||
fun sign(inputApkFile: File, outputApkFile: File, signingOptions: SigningOptions) = sign(
|
|
||||||
inputApkFile,
|
|
||||||
outputApkFile,
|
|
||||||
signingOptions.signer,
|
|
||||||
readOrNewPrivateKeyCertificatePair(signingOptions),
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Options for signing an apk.
|
|
||||||
*
|
|
||||||
* @param keyStore The keystore to use for signing.
|
|
||||||
* @param keyStorePassword The password for the keystore.
|
|
||||||
* @param alias The alias of the key store entry to use for signing.
|
|
||||||
* @param password The password for recovering the signing key.
|
|
||||||
* @param signer The name of the signer.
|
|
||||||
*/
|
|
||||||
@Deprecated("This class will be removed in the future.")
|
|
||||||
class SigningOptions(
|
|
||||||
val keyStore: File,
|
|
||||||
val keyStorePassword: String?,
|
|
||||||
val alias: String = "ReVanced Key",
|
|
||||||
val password: String = "",
|
|
||||||
val signer: String = "ReVanced",
|
|
||||||
)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Details for a keystore.
|
* Details for a keystore.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,43 +0,0 @@
|
|||||||
@file:Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
|
|
||||||
package app.revanced.library
|
|
||||||
|
|
||||||
import app.revanced.library.installation.command.AdbShellCommandRunner
|
|
||||||
import se.vidstige.jadb.JadbDevice
|
|
||||||
import se.vidstige.jadb.ShellProcessBuilder
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
@Deprecated("Do not use this anymore. Instead use AdbCommandRunner.")
|
|
||||||
internal fun JadbDevice.buildCommand(
|
|
||||||
command: String,
|
|
||||||
su: Boolean = true,
|
|
||||||
): ShellProcessBuilder {
|
|
||||||
if (su) return shellProcessBuilder("su -c \'$command\'")
|
|
||||||
|
|
||||||
val args = command.split(" ") as ArrayList<String>
|
|
||||||
val cmd = args.removeFirst()
|
|
||||||
|
|
||||||
return shellProcessBuilder(cmd, *args.toTypedArray())
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("DEPRECATION")
|
|
||||||
@Deprecated("Use AdbShellCommandRunner instead.")
|
|
||||||
internal fun JadbDevice.run(
|
|
||||||
command: String,
|
|
||||||
su: Boolean = true,
|
|
||||||
) = buildCommand(command, su).start()
|
|
||||||
|
|
||||||
@Deprecated("Use AdbShellCommandRunner instead.")
|
|
||||||
internal fun JadbDevice.hasSu() = AdbShellCommandRunner(this).hasRootPermission()
|
|
||||||
|
|
||||||
@Deprecated("Use AdbShellCommandRunner instead.")
|
|
||||||
internal fun JadbDevice.push(
|
|
||||||
file: File,
|
|
||||||
targetFilePath: String,
|
|
||||||
) = AdbShellCommandRunner(this).move(file, targetFilePath)
|
|
||||||
|
|
||||||
@Deprecated("Use AdbShellCommandRunner instead.")
|
|
||||||
internal fun JadbDevice.createFile(
|
|
||||||
targetFile: String,
|
|
||||||
content: String,
|
|
||||||
) = AdbShellCommandRunner(this).write(content.byteInputStream(), targetFile)
|
|
||||||
@@ -2,119 +2,35 @@
|
|||||||
|
|
||||||
package app.revanced.library
|
package app.revanced.library
|
||||||
|
|
||||||
import app.revanced.library.Options.Patch.Option
|
import app.revanced.patcher.patch.OptionException
|
||||||
import app.revanced.patcher.PatchSet
|
import app.revanced.patcher.patch.Patch
|
||||||
import app.revanced.patcher.patch.options.PatchOptionException
|
|
||||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
|
||||||
import java.io.File
|
|
||||||
import java.util.logging.Logger
|
import java.util.logging.Logger
|
||||||
|
|
||||||
@Suppress("unused")
|
typealias PatchName = String
|
||||||
object Options {
|
typealias OptionKey = String
|
||||||
private val logger = Logger.getLogger(Options::class.java.name)
|
typealias OptionValue = Any?
|
||||||
|
typealias PatchesOptions = Map<PatchName, Map<OptionKey, OptionValue>>
|
||||||
|
|
||||||
private val mapper = jacksonObjectMapper()
|
private val logger = Logger.getLogger("Options")
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Serializes the options for a set of patches.
|
* Set the options for a set of patches that have a name.
|
||||||
*
|
*
|
||||||
* @param patches The set of patches to serialize.
|
* @param options The options to set. The key is the patch name and the value is a map of option keys to option values.
|
||||||
* @param prettyPrint Whether to pretty print the JSON.
|
*/
|
||||||
* @return The JSON string containing the options.
|
fun Set<Patch<*>>.setOptions(options: PatchesOptions) = filter { it.name != null }.forEach { patch ->
|
||||||
*/
|
options[patch.name]?.forEach setOption@{ (optionKey, optionValue) ->
|
||||||
fun serialize(
|
if (optionKey !in patch.options) {
|
||||||
patches: PatchSet,
|
return@setOption logger.warning(
|
||||||
prettyPrint: Boolean = false,
|
"Could not set option for the \"${patch.name}\" patch because " +
|
||||||
): String =
|
"option with key \"${optionKey}\" does not exist",
|
||||||
patches
|
)
|
||||||
.filter { it.options.any() }
|
}
|
||||||
.map { patch ->
|
|
||||||
Patch(
|
|
||||||
patch.name!!,
|
|
||||||
patch.options.values.map { option ->
|
|
||||||
val optionValue =
|
|
||||||
try {
|
|
||||||
option.value
|
|
||||||
} catch (e: PatchOptionException) {
|
|
||||||
logger.warning("Using default option value for the ${patch.name} patch: ${e.message}")
|
|
||||||
option.default
|
|
||||||
}
|
|
||||||
|
|
||||||
Option(option.key, optionValue)
|
try {
|
||||||
},
|
patch.options[optionKey] = optionValue
|
||||||
)
|
} catch (e: OptionException) {
|
||||||
}
|
logger.warning("Could not set option value for the \"${patch.name}\" patch: ${e.message}")
|
||||||
// See https://github.com/revanced/revanced-patches/pull/2434/commits/60e550550b7641705e81aa72acfc4faaebb225e7.
|
|
||||||
.distinctBy { it.patchName }
|
|
||||||
.let {
|
|
||||||
if (prettyPrint) {
|
|
||||||
mapper.writerWithDefaultPrettyPrinter().writeValueAsString(it)
|
|
||||||
} else {
|
|
||||||
mapper.writeValueAsString(it)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserializes the options to a set of patches.
|
|
||||||
*
|
|
||||||
* @param json The JSON string containing the options.
|
|
||||||
* @return A set of [Patch]s.
|
|
||||||
* @see Patch
|
|
||||||
*/
|
|
||||||
fun deserialize(json: String): Array<Patch> = mapper.readValue(json, Array<Patch>::class.java)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the options for a set of patches.
|
|
||||||
*
|
|
||||||
* @param json The JSON string containing the options.
|
|
||||||
*/
|
|
||||||
fun PatchSet.setOptions(json: String) {
|
|
||||||
filter { it.options.any() }.let { patches ->
|
|
||||||
if (patches.isEmpty()) return
|
|
||||||
|
|
||||||
val jsonPatches =
|
|
||||||
deserialize(json).associate {
|
|
||||||
it.patchName to it.options.associate { option -> option.key to option.value }
|
|
||||||
}
|
|
||||||
|
|
||||||
patches.forEach { patch ->
|
|
||||||
jsonPatches[patch.name]?.let { jsonPatchOptions ->
|
|
||||||
jsonPatchOptions.forEach { (option, value) ->
|
|
||||||
try {
|
|
||||||
patch.options[option] = value
|
|
||||||
} catch (e: PatchOptionException) {
|
|
||||||
logger.warning("Could not set option value for the ${patch.name} patch: ${e.message}")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the options for a set of patches.
|
|
||||||
*
|
|
||||||
* @param file The file containing the JSON string containing the options.
|
|
||||||
* @see setOptions
|
|
||||||
*/
|
|
||||||
fun PatchSet.setOptions(file: File) = setOptions(file.readText())
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Data class for a patch and its [Option]s.
|
|
||||||
*
|
|
||||||
* @property patchName The name of the patch.
|
|
||||||
* @property options The [Option]s for the patch.
|
|
||||||
*/
|
|
||||||
class Patch internal constructor(
|
|
||||||
val patchName: String,
|
|
||||||
val options: List<Option>,
|
|
||||||
) {
|
|
||||||
/**
|
|
||||||
* Data class for patch option.
|
|
||||||
*
|
|
||||||
* @property key The name of the option.
|
|
||||||
* @property value The value of the option.
|
|
||||||
*/
|
|
||||||
class Option internal constructor(val key: String, val value: Any?)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
52
src/commonMain/kotlin/app/revanced/library/Patch.kt
Normal file
52
src/commonMain/kotlin/app/revanced/library/Patch.kt
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
package app.revanced.library
|
||||||
|
|
||||||
|
import app.revanced.patcher.patch.Package
|
||||||
|
import app.revanced.patcher.patch.Patch
|
||||||
|
|
||||||
|
typealias PackageName = String
|
||||||
|
typealias Version = String
|
||||||
|
typealias Count = Int
|
||||||
|
|
||||||
|
typealias VersionMap = LinkedHashMap<Version, Count>
|
||||||
|
typealias PackageNameMap = Map<PackageName, VersionMap>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the count of versions for each compatible package from the set of [Patch] ordered by the most common version.
|
||||||
|
*
|
||||||
|
* @param packageNames The names of the compatible packages to include. If null, all packages will be included.
|
||||||
|
* @param countUnusedPatches Whether to count patches that are not used.
|
||||||
|
* @return A map of package names to a map of versions to their count.
|
||||||
|
*/
|
||||||
|
fun Set<Patch<*>>.mostCommonCompatibleVersions(
|
||||||
|
packageNames: Set<String>? = null,
|
||||||
|
countUnusedPatches: Boolean = false,
|
||||||
|
): PackageNameMap = buildMap {
|
||||||
|
fun filterWantedPackages(compatiblePackages: List<Package>): List<Package> {
|
||||||
|
val wantedPackages = packageNames?.toHashSet() ?: return compatiblePackages
|
||||||
|
return compatiblePackages.filter { (name, _) -> name in wantedPackages }
|
||||||
|
}
|
||||||
|
|
||||||
|
this@mostCommonCompatibleVersions.filter { it.use || countUnusedPatches }
|
||||||
|
.flatMap { it.compatiblePackages ?: emptyList() }
|
||||||
|
.let(::filterWantedPackages)
|
||||||
|
.forEach { (name, versions) ->
|
||||||
|
if (versions?.isEmpty() == true) {
|
||||||
|
return@forEach
|
||||||
|
}
|
||||||
|
|
||||||
|
val versionMap = getOrPut(name) { linkedMapOf() }
|
||||||
|
|
||||||
|
versions?.forEach { version ->
|
||||||
|
versionMap[version] = versionMap.getOrDefault(version, 0) + 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sort the version maps by the most common version.
|
||||||
|
forEach { (packageName, versionMap) ->
|
||||||
|
this[packageName] =
|
||||||
|
versionMap
|
||||||
|
.asIterable()
|
||||||
|
.sortedWith(compareByDescending { it.value })
|
||||||
|
.associate { it.key to it.value } as VersionMap
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,169 +0,0 @@
|
|||||||
package app.revanced.library
|
|
||||||
|
|
||||||
import app.revanced.patcher.PatchSet
|
|
||||||
import app.revanced.patcher.patch.Patch
|
|
||||||
import app.revanced.patcher.patch.options.PatchOption
|
|
||||||
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
|
|
||||||
import java.io.InputStream
|
|
||||||
import java.io.OutputStream
|
|
||||||
import kotlin.reflect.jvm.jvmName
|
|
||||||
|
|
||||||
typealias PackageName = String
|
|
||||||
typealias Version = String
|
|
||||||
typealias Count = Int
|
|
||||||
|
|
||||||
typealias VersionMap = LinkedHashMap<Version, Count>
|
|
||||||
typealias PackageNameMap = Map<PackageName, VersionMap>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Utility functions for working with patches.
|
|
||||||
*/
|
|
||||||
@Suppress("MemberVisibilityCanBePrivate", "unused")
|
|
||||||
object PatchUtils {
|
|
||||||
/**
|
|
||||||
* Get the count of versions for each compatible package from a supplied set of [patches] ordered by the most common version.
|
|
||||||
*
|
|
||||||
* @param patches The set of patches to check.
|
|
||||||
* @param packageNames The names of the compatible packages to include. If null, all packages will be included.
|
|
||||||
* @param countUnusedPatches Whether to count patches that are not used.
|
|
||||||
* @return A map of package names to a map of versions to their count.
|
|
||||||
*/
|
|
||||||
fun getMostCommonCompatibleVersions(
|
|
||||||
patches: PatchSet,
|
|
||||||
packageNames: Set<String>? = null,
|
|
||||||
countUnusedPatches: Boolean = false,
|
|
||||||
): PackageNameMap =
|
|
||||||
buildMap {
|
|
||||||
fun filterWantedPackages(compatiblePackages: Iterable<Patch.CompatiblePackage>): Iterable<Patch.CompatiblePackage> {
|
|
||||||
val wantedPackages = packageNames?.toHashSet() ?: return compatiblePackages
|
|
||||||
return compatiblePackages.filter { it.name in wantedPackages }
|
|
||||||
}
|
|
||||||
|
|
||||||
patches
|
|
||||||
.filter { it.use || countUnusedPatches }
|
|
||||||
.flatMap { it.compatiblePackages ?: emptyList() }
|
|
||||||
.let(::filterWantedPackages)
|
|
||||||
.forEach { compatiblePackage ->
|
|
||||||
if (compatiblePackage.versions?.isEmpty() == true) {
|
|
||||||
return@forEach
|
|
||||||
}
|
|
||||||
|
|
||||||
val versionMap = getOrPut(compatiblePackage.name) { linkedMapOf() }
|
|
||||||
|
|
||||||
compatiblePackage.versions?.let { versions ->
|
|
||||||
versions.forEach { version ->
|
|
||||||
versionMap[version] = versionMap.getOrDefault(version, 0) + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sort the version maps by the most common version.
|
|
||||||
forEach { (packageName, versionMap) ->
|
|
||||||
this[packageName] =
|
|
||||||
versionMap
|
|
||||||
.asIterable()
|
|
||||||
.sortedWith(compareByDescending { it.value })
|
|
||||||
.associate { it.key to it.value } as VersionMap
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
object Json {
|
|
||||||
private val mapper = jacksonObjectMapper()
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Serializes a set of [Patch]es to a JSON string and writes it to an output stream.
|
|
||||||
*
|
|
||||||
* @param patches The set of [Patch]es to serialize.
|
|
||||||
* @param transform A function to transform the [Patch]es to [JsonPatch]es.
|
|
||||||
* @param prettyPrint Whether to pretty print the JSON.
|
|
||||||
* @param outputStream The output stream to write the JSON to.
|
|
||||||
*/
|
|
||||||
fun serialize(
|
|
||||||
patches: PatchSet,
|
|
||||||
transform: (Patch<*>) -> JsonPatch = { patch -> FullJsonPatch.fromPatch(patch) },
|
|
||||||
prettyPrint: Boolean = false,
|
|
||||||
outputStream: OutputStream,
|
|
||||||
) {
|
|
||||||
patches.map(transform).let { transformed ->
|
|
||||||
if (prettyPrint) {
|
|
||||||
mapper.writerWithDefaultPrettyPrinter().writeValue(outputStream, transformed)
|
|
||||||
} else {
|
|
||||||
mapper.writeValue(outputStream, transformed)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Deserializes a JSON string to a set of [FullJsonPatch]es from an input stream.
|
|
||||||
*
|
|
||||||
* @param inputStream The input stream to read the JSON from.
|
|
||||||
* @param jsonPatchElementClass The class of the [JsonPatch]es to deserialize.
|
|
||||||
* @return A set of [JsonPatch]es.
|
|
||||||
* @see FullJsonPatch
|
|
||||||
*/
|
|
||||||
fun <T : JsonPatch> deserialize(
|
|
||||||
inputStream: InputStream,
|
|
||||||
jsonPatchElementClass: Class<T>,
|
|
||||||
): Set<T> =
|
|
||||||
mapper.readValue(
|
|
||||||
inputStream,
|
|
||||||
mapper.typeFactory.constructCollectionType(Set::class.java, jsonPatchElementClass),
|
|
||||||
)
|
|
||||||
|
|
||||||
interface JsonPatch
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A JSON representation of a [Patch].
|
|
||||||
* @see Patch
|
|
||||||
*/
|
|
||||||
class FullJsonPatch internal constructor(
|
|
||||||
val name: String?,
|
|
||||||
val description: String?,
|
|
||||||
val compatiblePackages: Set<Patch.CompatiblePackage>?,
|
|
||||||
val dependencies: Set<String>?,
|
|
||||||
val use: Boolean,
|
|
||||||
var requiresIntegrations: Boolean,
|
|
||||||
val options: Map<String, FullJsonPatchOption<*>>,
|
|
||||||
) : JsonPatch {
|
|
||||||
companion object {
|
|
||||||
fun fromPatch(patch: Patch<*>) =
|
|
||||||
FullJsonPatch(
|
|
||||||
patch.name,
|
|
||||||
patch.description,
|
|
||||||
patch.compatiblePackages,
|
|
||||||
buildSet { patch.dependencies?.forEach { add(it.jvmName) } },
|
|
||||||
patch.use,
|
|
||||||
patch.requiresIntegrations,
|
|
||||||
patch.options.mapValues { FullJsonPatchOption.fromPatchOption(it.value) },
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A JSON representation of a [PatchOption].
|
|
||||||
* @see PatchOption
|
|
||||||
*/
|
|
||||||
class FullJsonPatchOption<T> internal constructor(
|
|
||||||
val key: String,
|
|
||||||
val default: T?,
|
|
||||||
val values: Map<String, T?>?,
|
|
||||||
val title: String?,
|
|
||||||
val description: String?,
|
|
||||||
val required: Boolean,
|
|
||||||
val valueType: String,
|
|
||||||
) {
|
|
||||||
companion object {
|
|
||||||
fun fromPatchOption(option: PatchOption<*>) =
|
|
||||||
FullJsonPatchOption(
|
|
||||||
option.key,
|
|
||||||
option.default,
|
|
||||||
option.values,
|
|
||||||
option.title,
|
|
||||||
option.description,
|
|
||||||
option.required,
|
|
||||||
option.valueType,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
119
src/commonMain/kotlin/app/revanced/library/Serialization.kt
Normal file
119
src/commonMain/kotlin/app/revanced/library/Serialization.kt
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
package app.revanced.library
|
||||||
|
|
||||||
|
import app.revanced.patcher.patch.Option
|
||||||
|
import app.revanced.patcher.patch.Patch
|
||||||
|
import app.revanced.patcher.patch.VersionName
|
||||||
|
import kotlinx.serialization.ExperimentalSerializationApi
|
||||||
|
import kotlinx.serialization.KSerializer
|
||||||
|
import kotlinx.serialization.builtins.*
|
||||||
|
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
|
||||||
|
import kotlinx.serialization.descriptors.element
|
||||||
|
import kotlinx.serialization.encoding.Decoder
|
||||||
|
import kotlinx.serialization.encoding.Encoder
|
||||||
|
import kotlinx.serialization.encoding.encodeStructure
|
||||||
|
import kotlinx.serialization.json.Json
|
||||||
|
import kotlinx.serialization.json.encodeToStream
|
||||||
|
import kotlinx.serialization.serializer
|
||||||
|
import java.io.OutputStream
|
||||||
|
|
||||||
|
private class PatchSerializer : KSerializer<Patch<*>> {
|
||||||
|
override val descriptor = buildClassSerialDescriptor("Patch") {
|
||||||
|
element<String?>("name")
|
||||||
|
element<String?>("description")
|
||||||
|
element<Boolean>("use")
|
||||||
|
element<List<String>>("dependencies")
|
||||||
|
element<Map<PackageName, Set<VersionName>?>?>("compatiblePackages")
|
||||||
|
element("options", OptionSerializer.descriptor)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder) = throw NotImplementedError("Deserialization is unsupported")
|
||||||
|
|
||||||
|
@OptIn(ExperimentalSerializationApi::class)
|
||||||
|
override fun serialize(encoder: Encoder, value: Patch<*>) {
|
||||||
|
encoder.encodeStructure(descriptor) {
|
||||||
|
encodeNullableSerializableElement(
|
||||||
|
descriptor,
|
||||||
|
0,
|
||||||
|
String.serializer(),
|
||||||
|
value.name,
|
||||||
|
)
|
||||||
|
encodeNullableSerializableElement(
|
||||||
|
descriptor,
|
||||||
|
1,
|
||||||
|
String.serializer(),
|
||||||
|
value.description,
|
||||||
|
)
|
||||||
|
encodeBooleanElement(
|
||||||
|
descriptor,
|
||||||
|
2,
|
||||||
|
value.use,
|
||||||
|
)
|
||||||
|
encodeSerializableElement(
|
||||||
|
descriptor,
|
||||||
|
3,
|
||||||
|
ListSerializer(String.serializer()),
|
||||||
|
value.dependencies.map { it.name ?: it.toString() },
|
||||||
|
)
|
||||||
|
encodeNullableSerializableElement(
|
||||||
|
descriptor,
|
||||||
|
4,
|
||||||
|
MapSerializer(String.serializer(), SetSerializer(String.serializer()).nullable),
|
||||||
|
value.compatiblePackages?.associate { (packageName, versions) -> packageName to versions },
|
||||||
|
)
|
||||||
|
encodeSerializableElement(
|
||||||
|
descriptor,
|
||||||
|
5,
|
||||||
|
SetSerializer(OptionSerializer),
|
||||||
|
value.options.values.toSet(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private object OptionSerializer : KSerializer<Option<*>> {
|
||||||
|
override val descriptor = buildClassSerialDescriptor("Option") {
|
||||||
|
element<String>("key")
|
||||||
|
element<String?>("title")
|
||||||
|
element<String?>("description")
|
||||||
|
element<Boolean>("required")
|
||||||
|
// Type does not matter for serialization. Using String.
|
||||||
|
element<String>("type")
|
||||||
|
element<String?>("default")
|
||||||
|
// Map value type does not matter for serialization. Using String.
|
||||||
|
element<Map<String, String?>?>("values")
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun deserialize(decoder: Decoder) = throw NotImplementedError("Deserialization is unsupported")
|
||||||
|
|
||||||
|
@OptIn(ExperimentalSerializationApi::class)
|
||||||
|
override fun serialize(encoder: Encoder, value: Option<*>) {
|
||||||
|
encoder.encodeStructure(descriptor) {
|
||||||
|
encodeStringElement(descriptor, 0, value.key)
|
||||||
|
encodeNullableSerializableElement(descriptor, 1, String.serializer(), value.title)
|
||||||
|
encodeNullableSerializableElement(descriptor, 2, String.serializer(), value.description)
|
||||||
|
encodeBooleanElement(descriptor, 3, value.required)
|
||||||
|
encodeSerializableElement(descriptor, 4, String.serializer(), value.type.toString())
|
||||||
|
encodeNullableSerializableElement(descriptor, 5, serializer(value.type), value.default)
|
||||||
|
encodeNullableSerializableElement(descriptor, 6, MapSerializer(String.serializer(), serializer(value.type)), value.values)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private val patchPrettySerializer by lazy { Json { prettyPrint = true } }
|
||||||
|
private val patchSerializer by lazy { Json }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Serialize this set of [Patch] to JSON and write it to the given [outputStream].
|
||||||
|
*
|
||||||
|
* @param outputStream The output stream to write the JSON to.
|
||||||
|
* @param prettyPrint Whether to pretty print the JSON.
|
||||||
|
*/
|
||||||
|
@OptIn(ExperimentalSerializationApi::class)
|
||||||
|
fun Set<Patch<*>>.serializeTo(
|
||||||
|
outputStream: OutputStream,
|
||||||
|
prettyPrint: Boolean = true,
|
||||||
|
) = if (prettyPrint) {
|
||||||
|
patchPrettySerializer
|
||||||
|
} else {
|
||||||
|
patchSerializer
|
||||||
|
}.encodeToStream(SetSerializer(PatchSerializer()), this, outputStream)
|
||||||
@@ -1,144 +0,0 @@
|
|||||||
@file:Suppress("DEPRECATION")
|
|
||||||
|
|
||||||
package app.revanced.library.adb
|
|
||||||
|
|
||||||
import app.revanced.library.adb.AdbManager.Apk
|
|
||||||
import app.revanced.library.installation.installer.AdbInstaller
|
|
||||||
import app.revanced.library.installation.installer.AdbRootInstaller
|
|
||||||
import app.revanced.library.installation.installer.Constants.PLACEHOLDER
|
|
||||||
import app.revanced.library.installation.installer.Installer
|
|
||||||
import app.revanced.library.run
|
|
||||||
import se.vidstige.jadb.JadbDevice
|
|
||||||
import java.io.File
|
|
||||||
|
|
||||||
/**
|
|
||||||
* [AdbManager] to install and uninstall [Apk] files.
|
|
||||||
*
|
|
||||||
* @param deviceSerial The serial of the device. If null, the first connected device will be used.
|
|
||||||
*/
|
|
||||||
@Deprecated("Use an implementation of Installer instead.")
|
|
||||||
@Suppress("unused")
|
|
||||||
sealed class AdbManager private constructor(
|
|
||||||
@Suppress("UNUSED_PARAMETER") deviceSerial: String?,
|
|
||||||
) {
|
|
||||||
protected abstract val installer: Installer<*, *>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Installs the [Apk] file.
|
|
||||||
*
|
|
||||||
* @param apk The [Apk] file.
|
|
||||||
*/
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
@Deprecated("Use Installer.install instead.")
|
|
||||||
open fun install(apk: Apk) = suspend {
|
|
||||||
installer.install(Installer.Apk(apk.file, apk.packageName))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Uninstalls the package.
|
|
||||||
*
|
|
||||||
* @param packageName The package name.
|
|
||||||
*/
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
@Deprecated("Use Installer.uninstall instead.")
|
|
||||||
open fun uninstall(packageName: String) = suspend {
|
|
||||||
installer.uninstall(packageName)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("Use Installer instead.")
|
|
||||||
companion object {
|
|
||||||
/**
|
|
||||||
* Gets an [AdbManager] for the supplied device serial.
|
|
||||||
*
|
|
||||||
* @param deviceSerial The device serial. If null, the first connected device will be used.
|
|
||||||
* @param root Whether to use root or not.
|
|
||||||
* @return The [AdbManager].
|
|
||||||
* @throws DeviceNotFoundException If the device can not be found.
|
|
||||||
*/
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
@Deprecated("This is deprecated.")
|
|
||||||
fun getAdbManager(
|
|
||||||
deviceSerial: String? = null,
|
|
||||||
root: Boolean = false,
|
|
||||||
): AdbManager = if (root) RootAdbManager(deviceSerial) else UserAdbManager(deviceSerial)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adb manager for rooted devices.
|
|
||||||
*
|
|
||||||
* @param deviceSerial The device serial. If null, the first connected device will be used.
|
|
||||||
*/
|
|
||||||
@Deprecated("Use AdbRootInstaller instead.", ReplaceWith("AdbRootInstaller(deviceSerial)"))
|
|
||||||
class RootAdbManager internal constructor(deviceSerial: String?) : AdbManager(deviceSerial) {
|
|
||||||
override val installer = AdbRootInstaller(deviceSerial)
|
|
||||||
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
@Deprecated("Use AdbRootInstaller.install instead.")
|
|
||||||
override fun install(apk: Apk) = suspend {
|
|
||||||
installer.install(Installer.Apk(apk.file, apk.packageName))
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
@Deprecated("Use AdbRootInstaller.uninstall instead.")
|
|
||||||
override fun uninstall(packageName: String) = suspend {
|
|
||||||
installer.uninstall(packageName)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated("This is deprecated.")
|
|
||||||
companion object Utils {
|
|
||||||
private fun JadbDevice.run(
|
|
||||||
command: String,
|
|
||||||
with: String,
|
|
||||||
) = run(command.applyReplacement(with))
|
|
||||||
|
|
||||||
private fun String.applyReplacement(with: String) = replace(PLACEHOLDER, with)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Adb manager for non-rooted devices.
|
|
||||||
*
|
|
||||||
* @param deviceSerial The device serial. If null, the first connected device will be used.
|
|
||||||
*/
|
|
||||||
@Deprecated("Use AdbInstaller instead.")
|
|
||||||
class UserAdbManager internal constructor(deviceSerial: String?) : AdbManager(deviceSerial) {
|
|
||||||
override val installer = AdbInstaller(deviceSerial)
|
|
||||||
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
@Deprecated("Use AdbInstaller.install instead.")
|
|
||||||
override fun install(apk: Apk) = suspend {
|
|
||||||
installer.install(Installer.Apk(apk.file, apk.packageName))
|
|
||||||
}
|
|
||||||
|
|
||||||
@Suppress("DeprecatedCallableAddReplaceWith")
|
|
||||||
@Deprecated("Use AdbInstaller.uninstall instead.")
|
|
||||||
override fun uninstall(packageName: String) = suspend {
|
|
||||||
installer.uninstall(packageName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Apk file for [AdbManager].
|
|
||||||
*
|
|
||||||
* @param file The [Apk] file.
|
|
||||||
* @param packageName The package name of the [Apk] file.
|
|
||||||
*/
|
|
||||||
@Deprecated("Use Installer.Apk instead.")
|
|
||||||
class Apk(val file: File, val packageName: String? = null)
|
|
||||||
|
|
||||||
@Deprecated("Use AdbCommandRunner.DeviceNotFoundException instead.")
|
|
||||||
class DeviceNotFoundException internal constructor(deviceSerial: String? = null) :
|
|
||||||
Exception(
|
|
||||||
deviceSerial?.let {
|
|
||||||
"The device with the ADB device serial \"$deviceSerial\" can not be found"
|
|
||||||
} ?: "No ADB device found",
|
|
||||||
)
|
|
||||||
|
|
||||||
@Deprecated("Use RootInstaller.FailedToFindInstalledPackageException instead.")
|
|
||||||
class FailedToFindInstalledPackageException internal constructor(packageName: String) :
|
|
||||||
Exception("Failed to find installed package \"$packageName\" because no activity was found")
|
|
||||||
|
|
||||||
@Deprecated("Use RootInstaller.PackageNameRequiredException instead.")
|
|
||||||
class PackageNameRequiredException internal constructor() :
|
|
||||||
Exception("Package name is required")
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package app.revanced.library.installation.command
|
package app.revanced.library.installation.command
|
||||||
|
|
||||||
import app.revanced.library.installation.installer.Utils
|
import app.revanced.library.installation.installer.getDevice
|
||||||
import se.vidstige.jadb.JadbDevice
|
import se.vidstige.jadb.JadbDevice
|
||||||
import se.vidstige.jadb.RemoteFile
|
import se.vidstige.jadb.RemoteFile
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -29,7 +29,7 @@ class AdbShellCommandRunner : ShellCommandRunner {
|
|||||||
* @param deviceSerial deviceSerial The device serial. If null, the first connected device will be used.
|
* @param deviceSerial deviceSerial The device serial. If null, the first connected device will be used.
|
||||||
*/
|
*/
|
||||||
internal constructor(deviceSerial: String?) {
|
internal constructor(deviceSerial: String?) {
|
||||||
device = Utils.getDevice(deviceSerial, logger)
|
device = getDevice(deviceSerial, logger)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun runCommand(command: String) = device.shellProcessBuilder(command).start().let { process ->
|
override fun runCommand(command: String) = device.shellProcessBuilder(command).start().let { process ->
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package app.revanced.library.installation.installer
|
package app.revanced.library.installation.installer
|
||||||
|
|
||||||
import app.revanced.library.installation.command.AdbShellCommandRunner
|
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.Constants.INSTALLED_APK_PATH
|
||||||
import app.revanced.library.installation.installer.Installer.Apk
|
|
||||||
import se.vidstige.jadb.JadbException
|
import se.vidstige.jadb.JadbException
|
||||||
import se.vidstige.jadb.managers.Package
|
import se.vidstige.jadb.managers.Package
|
||||||
import se.vidstige.jadb.managers.PackageManager
|
import se.vidstige.jadb.managers.PackageManager
|
||||||
|
import se.vidstige.jadb.managers.PackageManager.UPDATE_OWNERSHIP
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [AdbInstaller] for installing and uninstalling [Apk] files using ADB.
|
* [AdbInstaller] for installing and uninstalling [Apk] files using ADB.
|
||||||
@@ -17,18 +19,23 @@ import se.vidstige.jadb.managers.PackageManager
|
|||||||
class AdbInstaller(
|
class AdbInstaller(
|
||||||
deviceSerial: String? = null,
|
deviceSerial: String? = null,
|
||||||
) : Installer<AdbInstallerResult, Installation>() {
|
) : Installer<AdbInstallerResult, Installation>() {
|
||||||
private val device = Utils.getDevice(deviceSerial, logger)
|
private val shellCommandRunner: ShellCommandRunner
|
||||||
private val adbShellCommandRunner = AdbShellCommandRunner(device)
|
private val packageManager: PackageManager
|
||||||
private val packageManager = PackageManager(device)
|
|
||||||
|
|
||||||
init {
|
init {
|
||||||
|
val device = getDevice(deviceSerial, logger)
|
||||||
|
shellCommandRunner = AdbShellCommandRunner(device)
|
||||||
|
packageManager = PackageManager(device)
|
||||||
|
|
||||||
logger.fine("Connected to $deviceSerial")
|
logger.fine("Connected to $deviceSerial")
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun install(apk: Apk): AdbInstallerResult {
|
override suspend fun install(apk: Apk): AdbInstallerResult {
|
||||||
logger.info("Installing ${apk.file.name}")
|
return runPackageManager {
|
||||||
|
val sdkVersion = shellCommandRunner(GET_SDK_VERSION).output.toInt()
|
||||||
return runPackageManager { install(apk.file) }
|
if (sdkVersion < 34) install(apk.file)
|
||||||
|
else installWithOptions(apk.file, listOf(UPDATE_OWNERSHIP))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun uninstall(packageName: String): AdbInstallerResult {
|
override suspend fun uninstall(packageName: String): AdbInstallerResult {
|
||||||
@@ -39,7 +46,7 @@ class AdbInstaller(
|
|||||||
|
|
||||||
override suspend fun getInstallation(packageName: String): Installation? = packageManager.packages.find {
|
override suspend fun getInstallation(packageName: String): Installation? = packageManager.packages.find {
|
||||||
it.toString() == packageName
|
it.toString() == packageName
|
||||||
}?.let { Installation(adbShellCommandRunner(INSTALLED_APK_PATH).output) }
|
}?.let { Installation(shellCommandRunner(INSTALLED_APK_PATH).output) }
|
||||||
|
|
||||||
private fun runPackageManager(block: PackageManager.() -> Unit) = try {
|
private fun runPackageManager(block: PackageManager.() -> Unit) = try {
|
||||||
packageManager.run(block)
|
packageManager.run(block)
|
||||||
|
|||||||
@@ -4,26 +4,28 @@ package app.revanced.library.installation.installer
|
|||||||
internal object Constants {
|
internal object Constants {
|
||||||
const val PLACEHOLDER = "PLACEHOLDER"
|
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 TMP_FILE_PATH = "/data/local/tmp/revanced.tmp"
|
||||||
const val MOUNT_PATH = "/data/adb/revanced/"
|
const val MOUNT_PATH = "/data/adb/revanced/"
|
||||||
const val MOUNTED_APK_PATH = "$MOUNT_PATH$PLACEHOLDER.apk"
|
const val MOUNTED_APK_PATH = "$MOUNT_PATH$PLACEHOLDER.apk"
|
||||||
const val MOUNT_SCRIPT_PATH = "/data/adb/service.d/mount_revanced_$PLACEHOLDER.sh"
|
const val MOUNT_SCRIPT_PATH = "/data/adb/service.d/mount_revanced_$PLACEHOLDER.sh"
|
||||||
|
|
||||||
const val EXISTS = "[[ -f $PLACEHOLDER ]] || exit 1"
|
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 DELETE = "rm -rf $PLACEHOLDER"
|
||||||
const val CREATE_DIR = "mkdir -p"
|
const val CREATE_DIR = "mkdir -p"
|
||||||
const val RESTART = "am start -S $PLACEHOLDER"
|
const val RESTART = "am start -S $PLACEHOLDER"
|
||||||
const val KILL = "am force-stop $PLACEHOLDER"
|
const val KILL = "am force-stop $PLACEHOLDER"
|
||||||
const val INSTALLED_APK_PATH = "pm path $PLACEHOLDER"
|
const val INSTALLED_APK_PATH = "pm path $PLACEHOLDER"
|
||||||
const val CREATE_INSTALLATION_PATH = "$CREATE_DIR $MOUNT_PATH"
|
const val CREATE_INSTALLATION_PATH = "$CREATE_DIR $MOUNT_PATH"
|
||||||
|
const val GET_SDK_VERSION = "getprop ro.build.version.sdk"
|
||||||
|
|
||||||
const val MOUNT_APK =
|
const val MOUNT_APK =
|
||||||
"base_path=\"$MOUNTED_APK_PATH\" && " +
|
"base_path=\"$MOUNTED_APK_PATH\" && " +
|
||||||
"mv $TMP_FILE_PATH \$base_path && " +
|
"mv $TMP_FILE_PATH \$base_path && " +
|
||||||
"chmod 644 \$base_path && " +
|
"chmod 644 \$base_path && " +
|
||||||
"chown system:system \$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 =
|
const val UMOUNT =
|
||||||
"grep $PLACEHOLDER /proc/mounts | " +
|
"grep $PLACEHOLDER /proc/mounts | " +
|
||||||
@@ -52,7 +54,7 @@ internal object Constants {
|
|||||||
|
|
||||||
base_path="$MOUNTED_APK_PATH"
|
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.
|
# Use Magisk mirror, if possible.
|
||||||
if command -v magisk &> /dev/null; then
|
if command -v magisk &> /dev/null; then
|
||||||
|
|||||||
@@ -122,13 +122,12 @@ abstract class RootInstaller internal constructor(
|
|||||||
* @throws FailedToFindInstalledPackageException If the package is not installed.
|
* @throws FailedToFindInstalledPackageException If the package is not installed.
|
||||||
*/
|
*/
|
||||||
private fun String.assertInstalled() {
|
private fun String.assertInstalled() {
|
||||||
if (INSTALLED_APK_PATH(this)().output.isNotEmpty()) {
|
if (INSTALLED_APK_PATH(this)().output.isEmpty()) {
|
||||||
throw FailedToFindInstalledPackageException(this)
|
throw FailedToFindInstalledPackageException(this)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
internal class FailedToFindInstalledPackageException internal constructor(packageName: String) :
|
internal class FailedToFindInstalledPackageException internal constructor(packageName: String) : Exception("Failed to find installed package \"$packageName\" because no activity was found")
|
||||||
Exception("Failed to find installed package \"$packageName\" because no activity was found")
|
|
||||||
|
|
||||||
internal class PackageNameRequiredException internal constructor() : Exception("Package name is required")
|
internal class PackageNameRequiredException internal constructor() : Exception("Package name is required")
|
||||||
internal class NoRootPermissionException internal constructor() : Exception("No root permission")
|
internal class NoRootPermissionException internal constructor() : Exception("No root permission")
|
||||||
|
|||||||
@@ -4,37 +4,31 @@ import se.vidstige.jadb.JadbConnection
|
|||||||
import java.util.logging.Logger
|
import java.util.logging.Logger
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility functions for [Installer].
|
* Gets the device with the given serial.
|
||||||
*
|
*
|
||||||
* @see Installer
|
* @param deviceSerial The device serial. If null, the first connected device will be used.
|
||||||
|
* @param logger The logger.
|
||||||
|
* @return The device.
|
||||||
|
* @throws DeviceNotFoundException If no device with the given serial is found.
|
||||||
*/
|
*/
|
||||||
internal object Utils {
|
internal fun getDevice(
|
||||||
/**
|
deviceSerial: String? = null,
|
||||||
* Gets the device with the given serial.
|
logger: Logger,
|
||||||
*
|
) = with(JadbConnection().devices) {
|
||||||
* @param deviceSerial The device serial. If null, the first connected device will be used.
|
if (isEmpty()) throw DeviceNotFoundException()
|
||||||
* @param logger The logger.
|
|
||||||
* @return The device.
|
|
||||||
* @throws DeviceNotFoundException If no device with the given serial is found.
|
|
||||||
*/
|
|
||||||
internal fun getDevice(
|
|
||||||
deviceSerial: String? = null,
|
|
||||||
logger: Logger,
|
|
||||||
) = with(JadbConnection().devices) {
|
|
||||||
if (isEmpty()) throw DeviceNotFoundException()
|
|
||||||
|
|
||||||
deviceSerial?.let {
|
deviceSerial?.let {
|
||||||
firstOrNull { it.serial == deviceSerial } ?: throw DeviceNotFoundException(
|
firstOrNull { it.serial == deviceSerial } ?: throw DeviceNotFoundException(
|
||||||
deviceSerial,
|
deviceSerial,
|
||||||
)
|
)
|
||||||
} ?: first().also {
|
} ?: first().also {
|
||||||
logger.warning("No device serial supplied. Using device with serial ${it.serial}")
|
logger.warning("No device serial supplied. Using device with serial ${it.serial}")
|
||||||
}
|
}
|
||||||
}!!
|
}!!
|
||||||
|
|
||||||
class DeviceNotFoundException internal constructor(deviceSerial: String? = null) : Exception(
|
class DeviceNotFoundException internal constructor(deviceSerial: String? = null) :
|
||||||
|
Exception(
|
||||||
deviceSerial?.let {
|
deviceSerial?.let {
|
||||||
"The device with the ADB device serial \"$deviceSerial\" can not be found"
|
"The device with the ADB device serial \"$deviceSerial\" can not be found"
|
||||||
} ?: "No ADB device found",
|
} ?: "No ADB device found",
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,27 +1,19 @@
|
|||||||
package app.revanced.library
|
package app.revanced.library
|
||||||
|
|
||||||
import app.revanced.patcher.PatchSet
|
import app.revanced.patcher.patch.*
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
|
||||||
import app.revanced.patcher.patch.Patch
|
|
||||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption
|
|
||||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.intArrayPatchOption
|
|
||||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption
|
|
||||||
import java.io.ByteArrayInputStream
|
|
||||||
import java.io.ByteArrayOutputStream
|
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertEquals
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
internal class PatchUtilsTest {
|
internal class MostCommonCompatibleVersionsTest {
|
||||||
private val patches =
|
private val patches =
|
||||||
arrayOf(
|
arrayOf(
|
||||||
newPatch("some.package", setOf("a")) { stringPatchOption("string", "value") },
|
newPatch("some.package", setOf("a")) { stringOption("string", "value") },
|
||||||
newPatch("some.package", setOf("a", "b"), use = false),
|
newPatch("some.package", setOf("a", "b"), use = false),
|
||||||
newPatch("some.package", setOf("a", "b", "c"), use = false),
|
newPatch("some.package", setOf("a", "b", "c"), use = false),
|
||||||
newPatch("some.other.package", setOf("b"), use = false),
|
newPatch("some.other.package", setOf("b"), use = false),
|
||||||
newPatch("some.other.package", setOf("b", "c")) { booleanPatchOption("bool", true) },
|
newPatch("some.other.package", setOf("b", "c")) { booleanOption("bool", true) },
|
||||||
newPatch("some.other.package", setOf("b", "c", "d")),
|
newPatch("some.other.package", setOf("b", "c", "d")),
|
||||||
newPatch("some.other.other.package") { intArrayPatchOption("intArray", arrayOf(1, 2, 3)) },
|
newPatch("some.other.other.package") { intsOption("intArray", listOf(1, 2, 3)) },
|
||||||
newPatch("some.other.other.package", setOf("a")),
|
newPatch("some.other.other.package", setOf("a")),
|
||||||
newPatch("some.other.other.package", setOf("b")),
|
newPatch("some.other.other.package", setOf("b")),
|
||||||
newPatch("some.other.other.other.package", use = false),
|
newPatch("some.other.other.other.package", use = false),
|
||||||
@@ -141,38 +133,24 @@ internal class PatchUtilsTest {
|
|||||||
assertEqualsVersion(null, patches, "other.package")
|
assertEqualsVersion(null, patches, "other.package")
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `serializes to and deserializes from JSON string correctly`() {
|
|
||||||
val out = ByteArrayOutputStream()
|
|
||||||
PatchUtils.Json.serialize(patches, outputStream = out)
|
|
||||||
|
|
||||||
val deserialized =
|
|
||||||
PatchUtils.Json.deserialize(
|
|
||||||
ByteArrayInputStream(out.toByteArray()),
|
|
||||||
PatchUtils.Json.FullJsonPatch::class.java,
|
|
||||||
)
|
|
||||||
|
|
||||||
assert(patches.size == deserialized.size)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun assertEqualsVersions(
|
private fun assertEqualsVersions(
|
||||||
expected: PackageNameMap,
|
expected: PackageNameMap,
|
||||||
patches: PatchSet,
|
patches: Set<Patch<*>>,
|
||||||
compatiblePackageNames: Set<String>?,
|
compatiblePackageNames: Set<String>?,
|
||||||
countUnusedPatches: Boolean = false,
|
countUnusedPatches: Boolean = false,
|
||||||
) = assertEquals(
|
) = assertEquals(
|
||||||
expected,
|
expected,
|
||||||
PatchUtils.getMostCommonCompatibleVersions(patches, compatiblePackageNames, countUnusedPatches),
|
patches.mostCommonCompatibleVersions(compatiblePackageNames, countUnusedPatches),
|
||||||
)
|
)
|
||||||
|
|
||||||
private fun assertEqualsVersion(
|
private fun assertEqualsVersion(
|
||||||
expected: String?,
|
expected: String?,
|
||||||
patches: PatchSet,
|
patches: Set<Patch<*>>,
|
||||||
compatiblePackageName: String,
|
compatiblePackageName: String,
|
||||||
) {
|
) {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
expected,
|
expected,
|
||||||
PatchUtils.getMostCommonCompatibleVersions(patches, setOf(compatiblePackageName))
|
patches.mostCommonCompatibleVersions(setOf(compatiblePackageName))
|
||||||
.entries.firstOrNull()?.value?.keys?.firstOrNull(),
|
.entries.firstOrNull()?.value?.keys?.firstOrNull(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
@@ -181,19 +159,23 @@ internal class PatchUtilsTest {
|
|||||||
packageName: String,
|
packageName: String,
|
||||||
versions: Set<String>? = null,
|
versions: Set<String>? = null,
|
||||||
use: Boolean = true,
|
use: Boolean = true,
|
||||||
options: Patch<*>.() -> Unit = {},
|
options: PatchBuilder<*>.() -> Unit = {},
|
||||||
) = object : BytecodePatch(
|
) = bytecodePatch(
|
||||||
name = "test",
|
name = "test",
|
||||||
compatiblePackages = setOf(CompatiblePackage(packageName, versions?.toSet())),
|
|
||||||
use = use,
|
use = use,
|
||||||
) {
|
) {
|
||||||
init {
|
if (versions == null) {
|
||||||
options()
|
compatibleWith(packageName)
|
||||||
|
} else {
|
||||||
|
compatibleWith(
|
||||||
|
if (versions.isEmpty()) {
|
||||||
|
packageName()
|
||||||
|
} else {
|
||||||
|
packageName(*versions.toTypedArray())
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun execute(context: BytecodeContext) {}
|
options()
|
||||||
|
|
||||||
// Needed to make the patches unique.
|
|
||||||
override fun equals(other: Any?) = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
36
src/commonTest/kotlin/app/revanced/library/OptionsTest.kt
Normal file
36
src/commonTest/kotlin/app/revanced/library/OptionsTest.kt
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
package app.revanced.library
|
||||||
|
|
||||||
|
import app.revanced.patcher.patch.booleanOption
|
||||||
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
|
import app.revanced.patcher.patch.stringOption
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertEquals
|
||||||
|
|
||||||
|
class OptionsTest {
|
||||||
|
@Test
|
||||||
|
fun `serializes and deserializes`() {
|
||||||
|
val options = mapOf(
|
||||||
|
"Test patch" to mapOf("key1" to "test", "key2" to false),
|
||||||
|
)
|
||||||
|
|
||||||
|
val patch = bytecodePatch("Test patch") {
|
||||||
|
stringOption("key1")
|
||||||
|
booleanOption("key2", true)
|
||||||
|
}
|
||||||
|
val duplicatePatch = bytecodePatch("Test patch") {
|
||||||
|
stringOption("key1")
|
||||||
|
}
|
||||||
|
val unnamedPatch = bytecodePatch {
|
||||||
|
booleanOption("key1")
|
||||||
|
}
|
||||||
|
|
||||||
|
setOf(patch, duplicatePatch, unnamedPatch).setOptions(options)
|
||||||
|
|
||||||
|
assert(patch.options["key1"].value == "test")
|
||||||
|
assert(patch.options["key2"].value == false)
|
||||||
|
|
||||||
|
assertEquals(patch.options["key1"].value, duplicatePatch.options["key1"].value)
|
||||||
|
|
||||||
|
assert(unnamedPatch.options["key1"].value == null)
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,41 +0,0 @@
|
|||||||
package app.revanced.library
|
|
||||||
|
|
||||||
import app.revanced.library.Options.setOptions
|
|
||||||
import app.revanced.patcher.data.BytecodeContext
|
|
||||||
import app.revanced.patcher.patch.BytecodePatch
|
|
||||||
import app.revanced.patcher.patch.annotation.Patch
|
|
||||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.booleanPatchOption
|
|
||||||
import app.revanced.patcher.patch.options.PatchOption.PatchExtensions.stringPatchOption
|
|
||||||
import kotlin.test.Test
|
|
||||||
|
|
||||||
class PatchOptionsTest {
|
|
||||||
private var patches = setOf(PatchOptionsTestPatch)
|
|
||||||
|
|
||||||
private val serializedJson =
|
|
||||||
"[{\"patchName\":\"PatchOptionsTestPatch\",\"options\":[{\"key\":\"key1\",\"value\":null},{\"key\":\"key2\"," +
|
|
||||||
"\"value\":true}]}]"
|
|
||||||
|
|
||||||
private val changedJson =
|
|
||||||
"[{\"patchName\":\"PatchOptionsTestPatch\",\"options\":[{\"key\":\"key1\",\"value\":\"test\"},{\"key\":\"key2" +
|
|
||||||
"\",\"value\":false}]}]"
|
|
||||||
|
|
||||||
@Test
|
|
||||||
fun `serializes and deserializes`() {
|
|
||||||
assert(serializedJson == Options.serialize(patches))
|
|
||||||
|
|
||||||
patches.setOptions(changedJson)
|
|
||||||
|
|
||||||
assert(PatchOptionsTestPatch.option1 == "test")
|
|
||||||
assert(PatchOptionsTestPatch.option2 == false)
|
|
||||||
}
|
|
||||||
|
|
||||||
@Patch("PatchOptionsTestPatch")
|
|
||||||
object PatchOptionsTestPatch : BytecodePatch(emptySet()) {
|
|
||||||
var option1 by stringPatchOption("key1", null, null, "title1", "description1")
|
|
||||||
var option2 by booleanPatchOption("key2", true, null, "title2", "description2")
|
|
||||||
|
|
||||||
override fun execute(context: BytecodeContext) {
|
|
||||||
// Do nothing
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package app.revanced.library
|
||||||
|
|
||||||
|
import app.revanced.patcher.patch.booleanOption
|
||||||
|
import app.revanced.patcher.patch.bytecodePatch
|
||||||
|
import app.revanced.patcher.patch.floatsOption
|
||||||
|
import app.revanced.patcher.patch.stringOption
|
||||||
|
import kotlinx.serialization.json.*
|
||||||
|
import java.io.ByteArrayOutputStream
|
||||||
|
import kotlin.test.Test
|
||||||
|
import kotlin.test.assertIs
|
||||||
|
|
||||||
|
class SerializationTest {
|
||||||
|
private val testPatch = bytecodePatch("Test patch") {
|
||||||
|
compatibleWith("com.example.package"("1.0.0"))
|
||||||
|
compatibleWith("com.example.package2")
|
||||||
|
|
||||||
|
dependsOn(bytecodePatch(), bytecodePatch())
|
||||||
|
|
||||||
|
stringOption("key1", null, null, "title1", "description1")
|
||||||
|
booleanOption("key2", true, null, "title2", "description2")
|
||||||
|
floatsOption("key3", listOf(1.0f), mapOf("list" to listOf(1f)), "title3", "description3")
|
||||||
|
}
|
||||||
|
|
||||||
|
private var patches = setOf(testPatch)
|
||||||
|
|
||||||
|
@Test
|
||||||
|
fun `serializes and deserializes`() {
|
||||||
|
val serializedJson = ByteArrayOutputStream().apply { patches.serializeTo(this) }.toString()
|
||||||
|
val deserializedJson = Json.parseToJsonElement(serializedJson)
|
||||||
|
|
||||||
|
// Test patch serialization.
|
||||||
|
|
||||||
|
assertIs<JsonArray>(deserializedJson)
|
||||||
|
|
||||||
|
val deserializedPatch = deserializedJson[0].jsonObject
|
||||||
|
|
||||||
|
assert(deserializedPatch["name"]!!.jsonPrimitive.content == "Test patch")
|
||||||
|
|
||||||
|
assert(deserializedPatch["compatiblePackages"]!!.jsonObject.size == 2) {
|
||||||
|
"The patch should be compatible with two packages."
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(deserializedPatch["dependencies"]!!.jsonArray.size == 2) {
|
||||||
|
"Even though the dependencies are named the same, they are different objects."
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test option serialization.
|
||||||
|
|
||||||
|
val options = deserializedPatch["options"]!!.jsonArray
|
||||||
|
|
||||||
|
assert(options.size == 3) { "The patch should have three options." }
|
||||||
|
|
||||||
|
assert(options[0].jsonObject["title"]!!.jsonPrimitive.content == "title1")
|
||||||
|
assert(options[0].jsonObject["default"]!!.jsonPrimitive.contentOrNull == null)
|
||||||
|
assert(options[1].jsonObject["default"]!!.jsonPrimitive.boolean)
|
||||||
|
assert(options[2].jsonObject["values"]!!.jsonObject["list"]!!.jsonArray[0].jsonPrimitive.float == 1f)
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user