Compare commits

...

6 Commits

Author SHA1 Message Date
xehpuk
39aaf42b2b docs: Fix typo (#393) 2025-12-29 22:17:45 +01:00
Pun Butrach
d2cf491ffc docs: Use American spelling (#389) 2025-12-14 16:20:47 +01:00
semantic-release-bot
3a8b2ba935 chore: Release v21.1.0-dev.5 [skip ci]
# [21.1.0-dev.5](https://github.com/ReVanced/revanced-patcher/compare/v21.1.0-dev.4...v21.1.0-dev.5) (2025-10-16)
2025-10-16 15:03:36 +00:00
dependabot[bot]
39c5a66ce3 build(Needs bump): Bump dependencies 2025-10-16 17:01:58 +02:00
semantic-release-bot
b160a2adc0 chore: Release v21.1.0-dev.4 [skip ci]
# [21.1.0-dev.4](https://github.com/ReVanced/revanced-patcher/compare/v21.1.0-dev.3...v21.1.0-dev.4) (2025-07-18)

### Bug Fixes

* Correctly save XML files in UTF-8 by using a bufferedWriter ([#356](https://github.com/ReVanced/revanced-patcher/issues/356)) ([33fadcb](33fadcbd0c))
2025-07-18 19:33:42 +00:00
kitadai31
33fadcbd0c fix: Correctly save XML files in UTF-8 by using a bufferedWriter (#356) 2025-07-18 21:31:51 +02:00
11 changed files with 839 additions and 630 deletions

View File

@@ -12,12 +12,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
fetch-depth: 0
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v1
uses: burrunan/gradle-cache-action@v3
- name: Build
env:

View File

@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
- name: Open pull request
uses: repo-sync/pull-request@v2

View File

@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
uses: actions/checkout@v5
with:
# Make sure the release step uses its own credentials:
# https://github.com/cycjimmy/semantic-release-action#private-packages
@@ -24,7 +24,7 @@ jobs:
fetch-depth: 0
- name: Cache Gradle
uses: burrunan/gradle-cache-action@v1
uses: burrunan/gradle-cache-action@v3
- name: Build
env:
@@ -32,7 +32,7 @@ jobs:
run: ./gradlew build clean
- name: Setup Node.js
uses: actions/setup-node@v4
uses: actions/setup-node@v5
with:
node-version: "lts/*"
cache: 'npm'

View File

@@ -1,3 +1,12 @@
# [21.1.0-dev.5](https://github.com/ReVanced/revanced-patcher/compare/v21.1.0-dev.4...v21.1.0-dev.5) (2025-10-16)
# [21.1.0-dev.4](https://github.com/ReVanced/revanced-patcher/compare/v21.1.0-dev.3...v21.1.0-dev.4) (2025-07-18)
### Bug Fixes
* Correctly save XML files in UTF-8 by using a bufferedWriter ([#356](https://github.com/ReVanced/revanced-patcher/issues/356)) ([33fadcb](https://github.com/ReVanced/revanced-patcher/commit/33fadcbd0c7076b848bdca4d62a9c684d5781232))
# [21.1.0-dev.3](https://github.com/ReVanced/revanced-patcher/compare/v21.1.0-dev.2...v21.1.0-dev.3) (2025-06-20)

View File

@@ -117,9 +117,9 @@ you can follow the [ReVanced documentation](https://github.com/ReVanced/revanced
The documentation contains the fundamentals of ReVanced Patcher and how to use ReVanced Patcher to create patches.
You can find it [here](https://github.com/ReVanced/revanced-patcher/tree/main/docs).
## 📜 Licence
## 📜 License
ReVanced Patcher is licensed under the GPLv3 license. Please see the [licence file](LICENSE) for more information.
ReVanced Patcher 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 Patcher as long as you track changes/dates in source files.
Any modifications to ReVanced Patcher must also be made available under the GPL,
along with build & install instructions.

View File

@@ -1,3 +1,3 @@
org.gradle.parallel = true
org.gradle.caching = true
version = 21.1.0-dev.3
version = 21.1.0-dev.5

View File

@@ -1,14 +1,14 @@
[versions]
android = "4.1.1.4"
apktool-lib = "2.10.1.1"
binary-compatibility-validator = "0.15.1"
binary-compatibility-validator = "0.18.1"
kotlin = "2.0.20"
kotlinx-coroutines-core = "1.8.1"
mockk = "1.13.10"
kotlinx-coroutines-core = "1.10.2"
mockk = "1.14.5"
multidexlib2 = "3.0.3.r3"
# Tracking https://github.com/google/smali/issues/64.
#noinspection GradleDependency
smali = "3.0.8"
smali = "3.0.9"
xpp3 = "1.1.4c"
[libraries]

1391
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -4,6 +4,6 @@
"@semantic-release/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.1",
"semantic-release": "^24.1.2"
"semantic-release": "^24.2.9"
}
}

View File

@@ -27,7 +27,7 @@ typealias Package = Pair<PackageName, Set<VersionName>?>
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @param dependencies Other patches this patch depends on.
* @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages.
@@ -122,7 +122,7 @@ internal fun Iterable<Patch<*>>.forEachRecursively(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on.
@@ -171,7 +171,7 @@ class BytecodePatch internal constructor(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on.
@@ -214,7 +214,7 @@ class RawResourcePatch internal constructor(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on.
@@ -258,7 +258,7 @@ class ResourcePatch internal constructor(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @property compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages.
* @property dependencies Other patches this patch depends on.
@@ -375,7 +375,7 @@ private fun <B : PatchBuilder<*>> B.buildPatch(block: B.() -> Unit = {}) = apply
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @property extensionInputStream Getter for the extension input stream of the patch.
* An extension is a precompiled DEX file that is merged into the patched app before this patch is executed.
*
@@ -425,7 +425,7 @@ class BytecodePatchBuilder internal constructor(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @param block The block to build the patch.
*
* @return The created [BytecodePatch].
@@ -443,7 +443,7 @@ fun bytecodePatch(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
*
* @constructor Create a new [RawResourcePatch] builder.
*/
@@ -470,7 +470,7 @@ class RawResourcePatchBuilder internal constructor(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @param block The block to build the patch.
* @return The created [RawResourcePatch].
*/
@@ -487,7 +487,7 @@ fun rawResourcePatch(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
*
* @constructor Create a new [ResourcePatch] builder.
*/
@@ -514,7 +514,7 @@ class ResourcePatchBuilder internal constructor(
* @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch.
* @param use Weather or not the patch should be used.
* @param use Whether or not the patch should be used.
* @param block The block to build the patch.
*
* @return The created [ResourcePatch].

View File

@@ -4,7 +4,6 @@ import org.w3c.dom.Document
import java.io.Closeable
import java.io.File
import java.io.InputStream
import java.io.StringWriter
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.OutputKeys
import javax.xml.transform.TransformerFactory
@@ -36,20 +35,22 @@ class Document internal constructor(
readerCount.remove(it)
}
it.outputStream().buffered().use { stream ->
val transformer = TransformerFactory.newInstance().newTransformer()
// Set to UTF-16 but encode as UTF-8 to prevent surrogate pairs from being escaped to broken numeric character references.
if (isAndroid) {
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16")
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes")
val transformer = TransformerFactory.newInstance().newTransformer()
// Set to UTF-16 to prevent surrogate pairs from being escaped to invalid numeric character references, but save as UTF-8.
if (isAndroid) {
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16")
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes")
it.bufferedWriter(charset = Charsets.UTF_8).use { writer ->
transformer.transform(DOMSource(this), StreamResult(writer))
}
transformer.transform(DOMSource(this), StreamResult(stream))
} else {
transformer.transform(DOMSource(this), StreamResult(it))
}
}
}
private companion object {
private val readerCount = mutableMapOf<File, Int>()
private val isAndroid = System.getProperty("java.runtime.name").equals("Android Runtime")
private val isAndroid = System.getProperty("java.runtime.name") == "Android Runtime"
}
}