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

View File

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