fix: duplicate dex entries

This commit is contained in:
Canny 2022-09-18 19:21:36 +03:00
parent d12e7721af
commit 4b796f75ee
No known key found for this signature in database
GPG Key ID: 395CCB0AA979F27B
2 changed files with 81 additions and 80 deletions

View File

@ -24,10 +24,13 @@ import app.revanced.manager.ui.Resource
import app.revanced.patcher.Patcher import app.revanced.patcher.Patcher
import app.revanced.patcher.PatcherOptions import app.revanced.patcher.PatcherOptions
import app.revanced.patcher.data.Data import app.revanced.patcher.data.Data
import app.revanced.patcher.extensions.PatchExtensions.dependencies
import app.revanced.patcher.extensions.PatchExtensions.patchName import app.revanced.patcher.extensions.PatchExtensions.patchName
import app.revanced.patcher.logging.Logger import app.revanced.patcher.logging.Logger
import app.revanced.patcher.patch.Patch import app.revanced.patcher.patch.Patch
import app.revanced.patcher.patch.impl.ResourcePatch
import java.io.File import java.io.File
import java.nio.file.Files
class PatcherWorker(context: Context, parameters: WorkerParameters) : class PatcherWorker(context: Context, parameters: WorkerParameters) :
CoroutineWorker(context, parameters) { CoroutineWorker(context, parameters) {
@ -100,7 +103,7 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) :
val integrations = workdir.resolve("integrations.apk") val integrations = workdir.resolve("integrations.apk")
try { try {
Log.d(tag, "Creating patcher") Log.d(tag, "Creating patcher")
val patcher = Patcher( val patcher = Patcher( // start patcher
PatcherOptions( PatcherOptions(
inputFile, inputFile,
cacheDirectory.absolutePath, cacheDirectory.absolutePath,
@ -131,8 +134,8 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) :
Log.d(tag, "Adding ${patches.size} patch(es)") Log.d(tag, "Adding ${patches.size} patch(es)")
patcher.addPatches(patches) patcher.addPatches(patches)
// patcher.addFiles(listOf(integrations)) {}
Log.d(tag, "Applying patches")
patcher.applyPatches().forEach { (patch, result) -> patcher.applyPatches().forEach { (patch, result) ->
if (result.isSuccess) { if (result.isSuccess) {
Log.i(tag, "[success] $patch") Log.i(tag, "[success] $patch")
@ -142,28 +145,26 @@ class PatcherWorker(context: Context, parameters: WorkerParameters) :
} }
Log.d(tag, "Saving file") Log.d(tag, "Saving file")
val result = patcher.save() // this function uses quite a bit of resources val result = patcher.save() // compile apk
ZipFile(patchedFile).use { fs ->
result.dexFiles.forEach { it -> if (patchedFile.exists()) Files.delete(patchedFile.toPath())
Log.d(tag, "Writing dex file ${it.name}")
fs.addEntryCompressData( ZipFile(patchedFile).use { fs -> // somehow this function is the most resource intensive
ZipEntry.createWithName(it.name), result.dexFiles.forEach { Log.d(tag, "Writing dex file ${it.name}")
it.stream.readBytes() fs.addEntryCompressData(ZipEntry.createWithName(it.name), it.stream.readBytes())}
)
result.resourceFile?.let { result.resourceFile?.let {
fs.copyEntriesFromFileAligned(ZipFile(it), ZipAligner::getEntryAlignment) fs.copyEntriesFromFileAligned(ZipFile(it), ZipAligner::getEntryAlignment)
} }
fs.copyEntriesFromFileAligned(ZipFile(inputFile), ZipAligner::getEntryAlignment) fs.copyEntriesFromFileAligned(ZipFile(inputFile), ZipAligner::getEntryAlignment)
} }
}
Log.d(tag, "Signing apk")
Signer("ReVanced", "s3cur3p@ssw0rd").signApk(patchedFile, outputFile) Signer("ReVanced", "s3cur3p@ssw0rd").signApk(patchedFile, outputFile)
Log.i(tag, "Successfully patched into $outputFile") Log.i(tag, "Successfully patched into $outputFile")
} finally { } finally {
Log.d(tag, "Deleting workdir") Log.d(tag, "Deleting workdir")
workdir.deleteRecursively() // workdir.deleteRecursively()
} }
return false return false
} }

View File

@ -144,7 +144,7 @@ class PatcherViewModel(private val app: Application, private val api: API) : Vie
.setInputData( .setInputData(
androidx.work.Data.Builder() androidx.work.Data.Builder()
.putString("workdir", workdir.toString()) .putString("workdir", workdir.toString())
.put("input", .putString("input",
getSelectedPackageInfo()?.applicationInfo?.publicSourceDir getSelectedPackageInfo()?.applicationInfo?.publicSourceDir
) )
.build()).build() .build()).build()