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 runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
fetch-depth: 0 fetch-depth: 0
- name: Cache Gradle - name: Cache Gradle
uses: burrunan/gradle-cache-action@v1 uses: burrunan/gradle-cache-action@v3
- name: Build - name: Build
env: env:

View File

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

View File

@@ -16,7 +16,7 @@ jobs:
runs-on: ubuntu-latest runs-on: ubuntu-latest
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v4 uses: actions/checkout@v5
with: with:
# Make sure the release step uses its own credentials: # Make sure the release step uses its own credentials:
# https://github.com/cycjimmy/semantic-release-action#private-packages # https://github.com/cycjimmy/semantic-release-action#private-packages
@@ -24,7 +24,7 @@ jobs:
fetch-depth: 0 fetch-depth: 0
- name: Cache Gradle - name: Cache Gradle
uses: burrunan/gradle-cache-action@v1 uses: burrunan/gradle-cache-action@v3
- name: Build - name: Build
env: env:
@@ -32,7 +32,7 @@ jobs:
run: ./gradlew build clean run: ./gradlew build clean
- name: Setup Node.js - name: Setup Node.js
uses: actions/setup-node@v4 uses: actions/setup-node@v5
with: with:
node-version: "lts/*" node-version: "lts/*"
cache: 'npm' 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) # [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. 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). 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. [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, Any modifications to ReVanced Patcher must also be made available under the GPL,
along with build & install instructions. along with build & install instructions.

View File

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

View File

@@ -1,14 +1,14 @@
[versions] [versions]
android = "4.1.1.4" android = "4.1.1.4"
apktool-lib = "2.10.1.1" apktool-lib = "2.10.1.1"
binary-compatibility-validator = "0.15.1" binary-compatibility-validator = "0.18.1"
kotlin = "2.0.20" kotlin = "2.0.20"
kotlinx-coroutines-core = "1.8.1" kotlinx-coroutines-core = "1.10.2"
mockk = "1.13.10" mockk = "1.14.5"
multidexlib2 = "3.0.3.r3" multidexlib2 = "3.0.3.r3"
# Tracking https://github.com/google/smali/issues/64. # Tracking https://github.com/google/smali/issues/64.
#noinspection GradleDependency #noinspection GradleDependency
smali = "3.0.8" smali = "3.0.9"
xpp3 = "1.1.4c" xpp3 = "1.1.4c"
[libraries] [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/changelog": "^6.0.3",
"@semantic-release/git": "^10.0.1", "@semantic-release/git": "^10.0.1",
"gradle-semantic-release-plugin": "^1.10.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. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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 dependencies Other patches this patch depends on.
* @param compatiblePackages The packages the patch is compatible with. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * 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. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on. * @param dependencies Other patches this patch depends on.
@@ -171,7 +171,7 @@ class BytecodePatch internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on. * @param dependencies Other patches this patch depends on.
@@ -214,7 +214,7 @@ class RawResourcePatch internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @param compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @param dependencies Other patches this patch depends on. * @param dependencies Other patches this patch depends on.
@@ -258,7 +258,7 @@ class ResourcePatch internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @property compatiblePackages The packages the patch is compatible with.
* If null, the patch is compatible with all packages. * If null, the patch is compatible with all packages.
* @property dependencies Other patches this patch depends on. * @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. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @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. * 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. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @param block The block to build the patch.
* *
* @return The created [BytecodePatch]. * @return The created [BytecodePatch].
@@ -443,7 +443,7 @@ fun bytecodePatch(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @constructor Create a new [RawResourcePatch] builder.
*/ */
@@ -470,7 +470,7 @@ class RawResourcePatchBuilder internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @param block The block to build the patch.
* @return The created [RawResourcePatch]. * @return The created [RawResourcePatch].
*/ */
@@ -487,7 +487,7 @@ fun rawResourcePatch(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @constructor Create a new [ResourcePatch] builder.
*/ */
@@ -514,7 +514,7 @@ class ResourcePatchBuilder internal constructor(
* @param name The name of the patch. * @param name The name of the patch.
* If null, the patch is named "Patch" and will not be loaded by [PatchLoader]. * If null, the patch is named "Patch" and will not be loaded by [PatchLoader].
* @param description The description of the patch. * @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. * @param block The block to build the patch.
* *
* @return The created [ResourcePatch]. * @return The created [ResourcePatch].

View File

@@ -4,7 +4,6 @@ import org.w3c.dom.Document
import java.io.Closeable import java.io.Closeable
import java.io.File import java.io.File
import java.io.InputStream import java.io.InputStream
import java.io.StringWriter
import javax.xml.parsers.DocumentBuilderFactory import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.transform.OutputKeys import javax.xml.transform.OutputKeys
import javax.xml.transform.TransformerFactory import javax.xml.transform.TransformerFactory
@@ -36,20 +35,22 @@ class Document internal constructor(
readerCount.remove(it) readerCount.remove(it)
} }
it.outputStream().buffered().use { stream ->
val transformer = TransformerFactory.newInstance().newTransformer() 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. // Set to UTF-16 to prevent surrogate pairs from being escaped to invalid numeric character references, but save as UTF-8.
if (isAndroid) { if (isAndroid) {
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16") transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-16")
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes") 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 companion object {
private val readerCount = mutableMapOf<File, Int>() 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"
} }
} }