diff --git a/app/apk/proguard-rules.pro b/app/apk/proguard-rules.pro index 526822b6418fa..ac99cce4d80a7 100644 --- a/app/apk/proguard-rules.pro +++ b/app/apk/proguard-rules.pro @@ -22,20 +22,6 @@ int mActivityHandlesConfigFlags; } --keepclassmembernames class org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream { - private org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream$CurrentEntry entry; - private void closeCopiedEntry(boolean); - private final org.apache.commons.compress.archivers.zip.StreamCompressor streamCompressor; -} - --keepclassmembernames class org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream$CurrentEntry { - private boolean hasWritten; -} - --keepclassmembernames class org.apache.commons.compress.archivers.zip.StreamCompressor { - void reset(); -} - # main -keep,allowoptimization public class com.topjohnwu.magisk.signing.SignBoot { public static void main(java.lang.String[]); diff --git a/app/core/build.gradle.kts b/app/core/build.gradle.kts index bfb4ab2e2282e..216f1076d1b32 100644 --- a/app/core/build.gradle.kts +++ b/app/core/build.gradle.kts @@ -33,7 +33,10 @@ dependencies { api(libs.timber) api(libs.markwon.core) implementation(libs.bcpkix) - implementation(libs.commons.compress) + implementation(libs.commons.io) + implementation(libs.commons.codec) + implementation(libs.commons.lang) + implementation(files("libs/commons-compress-1.27.2-SNAPSHOT.jar")) api(libs.libsu.core) api(libs.libsu.service) diff --git a/app/core/libs/commons-compress-1.27.2-SNAPSHOT.jar b/app/core/libs/commons-compress-1.27.2-SNAPSHOT.jar new file mode 100644 index 0000000000000..653133fbf359a Binary files /dev/null and b/app/core/libs/commons-compress-1.27.2-SNAPSHOT.jar differ diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/download/DownloadEngine.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/download/DownloadEngine.kt index 98d792372969a..4583cdf4c912e 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/core/download/DownloadEngine.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/download/DownloadEngine.kt @@ -29,8 +29,6 @@ import com.topjohnwu.magisk.core.isRunningAsStub import com.topjohnwu.magisk.core.ktx.cachedFile import com.topjohnwu.magisk.core.ktx.copyAll import com.topjohnwu.magisk.core.ktx.copyAndClose -import com.topjohnwu.magisk.core.ktx.reflectField -import com.topjohnwu.magisk.core.ktx.reflectMethod import com.topjohnwu.magisk.core.ktx.set import com.topjohnwu.magisk.core.ktx.withStreams import com.topjohnwu.magisk.core.ktx.writeTo @@ -324,35 +322,17 @@ class DownloadEngine( zout.putArchiveEntry(ZipArchiveEntry("META-INF/com/google/android/updater-script")) zout.write("#MAGISK\n".toByteArray()) - val entryField = zout.javaClass.reflectField("entry") - val hasWrittenField = entryField.type.reflectField("hasWritten") - val closeEntryMethod = zout.javaClass.reflectMethod("closeCopiedEntry", Boolean::class.java) - val streamCompressorField = zout.javaClass.reflectField("streamCompressor") - val resetMethod = streamCompressorField.type.reflectMethod("reset") - for (entry in zin) { val path = entry.name if (path.isNotEmpty() && !path.startsWith("META-INF")) { - val method = entry.method - val size = entry.size - // Force STORED method to avoid decompression for better performance - if (entry.method != ZipEntry.STORED) { + if (!entry.isDirectory) { + // Force STORED method to avoid decompression for better performance + val archiveEntry = ZipArchiveEntry(entry) entry.method = ZipEntry.STORED entry.size = entry.compressedSize - } - val archiveEntry = ZipArchiveEntry(path) - archiveEntry.method = method - archiveEntry.crc = entry.crc - zout.putArchiveEntry(archiveEntry) - if (!entry.isDirectory) { - archiveEntry.method = ZipEntry.STORED - zin.copyAll(zout) - hasWrittenField.set(entryField.get(zout), true) - archiveEntry.compressedSize = entry.compressedSize - archiveEntry.size = size - archiveEntry.method = method - closeEntryMethod(zout, false) - resetMethod(streamCompressorField.get(zout)) + zout.addRawArchiveEntry(archiveEntry, zin) + } else { + zout.putArchiveEntry(entry) } } } diff --git a/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt b/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt index 6808b0c0385d6..7ebb5f80a028f 100644 --- a/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt +++ b/app/core/src/main/java/com/topjohnwu/magisk/core/ktx/XJVM.kt @@ -13,7 +13,6 @@ import java.io.IOException import java.io.InputStream import java.io.OutputStream import java.lang.reflect.Field -import java.lang.reflect.Method import java.text.DateFormat import java.text.SimpleDateFormat import java.util.Collections @@ -87,9 +86,6 @@ fun MutableMap.synchronized(): MutableMap = Collections.synch fun Class<*>.reflectField(name: String): Field = getDeclaredField(name).apply { isAccessible = true } -fun Class<*>.reflectMethod(name: String, vararg types: Class<*>): Method = - getDeclaredMethod(name, *types).apply { isAccessible = true } - inline fun Flow.concurrentMap(crossinline transform: suspend (T) -> R): Flow { return flatMapMerge { value -> flow { emit(transform(value)) } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8dedc95dd1cec..8bc43461b8f22 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -12,7 +12,9 @@ room = "2.6.1" [libraries] bcpkix = { module = "org.bouncycastle:bcpkix-jdk18on", version = "1.78.1" } -commons-compress = { module = "org.apache.commons:commons-compress", version = "1.27.1" } +commons-io = { module = "commons-io:commons-io", version = "2.16.1" } +commons-codec = { module = "commons-codec:commons-codec", version = "1.17.1" } +commons-lang = { module = "org.apache.commons:commons-lang3", version = "3.17.0" } retrofit = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } retrofit-moshi = { module = "com.squareup.retrofit2:converter-moshi", version.ref = "retrofit" } retrofit-scalars = { module = "com.squareup.retrofit2:converter-scalars", version.ref = "retrofit" }