fix: properly log messages and progress

This commit is contained in:
oSumAtrIX 2023-08-28 01:43:44 +02:00
parent 64a96fc3ce
commit 7911a8f49e
No known key found for this signature in database
GPG Key ID: A9B3094ACDB604B4

View File

@ -21,13 +21,9 @@ import kotlinx.coroutines.runBlocking
import java.io.File import java.io.File
import java.io.PrintWriter import java.io.PrintWriter
import java.io.StringWriter import java.io.StringWriter
import java.util.logging.Level
import java.util.logging.LogRecord import java.util.logging.LogRecord
import java.util.logging.Logger import java.util.logging.Logger
import java.util.logging.SimpleFormatter
private const val PATCHER_CHANNEL = "app.revanced.manager.flutter/patcher"
private const val INSTALLER_CHANNEL = "app.revanced.manager.flutter/installer"
class MainActivity : FlutterActivity() { class MainActivity : FlutterActivity() {
private val handler = Handler(Looper.getMainLooper()) private val handler = Handler(Looper.getMainLooper())
@ -37,9 +33,16 @@ class MainActivity : FlutterActivity() {
override fun configureFlutterEngine(flutterEngine: FlutterEngine) { override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
super.configureFlutterEngine(flutterEngine) super.configureFlutterEngine(flutterEngine)
val mainChannel = MethodChannel(flutterEngine.dartExecutor.binaryMessenger, PATCHER_CHANNEL)
installerChannel = val patcherChannel = "app.revanced.manager.flutter/patcher"
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, INSTALLER_CHANNEL) val installerChannel = "app.revanced.manager.flutter/installer"
val mainChannel =
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, patcherChannel)
this.installerChannel =
MethodChannel(flutterEngine.dartExecutor.binaryMessenger, installerChannel)
mainChannel.setMethodCallHandler { call, result -> mainChannel.setMethodCallHandler { call, result ->
when (call.method) { when (call.method) {
"runPatcher" -> { "runPatcher" -> {
@ -79,9 +82,7 @@ class MainActivity : FlutterActivity() {
keyStoreFilePath, keyStoreFilePath,
keystorePassword keystorePassword
) )
} else { } else result.notImplemented()
result.notImplemented()
}
} }
"stopPatcher" -> { "stopPatcher" -> {
@ -116,110 +117,94 @@ class MainActivity : FlutterActivity() {
val cacheDir = File(cacheDirPath) val cacheDir = File(cacheDirPath)
Thread { Thread {
try { fun updateProgress(progress: Double, header: String, log: String) {
Logger.getLogger("").apply {
handlers.forEach {
it.close()
removeHandler(it)
}
object : java.util.logging.Handler() {
override fun publish(record: LogRecord) = formatter.format(record).toByteArray().let {
if (record.level.intValue() > Level.INFO.intValue())
System.err.write(it)
else
System.out.write(it)
}
override fun flush() {
System.out.flush()
System.err.flush()
}
override fun close() = flush()
}.also {
it.level = Level.ALL
it.formatter = SimpleFormatter()
}.let(::addHandler)
}
handler.post { handler.post {
installerChannel.invokeMethod( installerChannel.invokeMethod(
"update", "update",
mapOf( mapOf(
"progress" to 0.1, "progress" to progress,
"header" to "", "header" to header,
"log" to "Copying original APK" "log" to log
) )
) )
} }
}
fun postStop() = handler.post { stopResult!!.success(null) }
// Setup logger
Logger.getLogger("").apply {
handlers.forEach {
it.close()
removeHandler(it)
}
object : java.util.logging.Handler() {
override fun publish(record: LogRecord) =
updateProgress(-1.0, "", record.message)
override fun flush() = Unit
override fun close() = flush()
}.let(::addHandler)
}
try {
updateProgress(0.0, "", "Copying APK")
if (cancel) { if (cancel) {
handler.post { stopResult!!.success(null) } postStop()
return@Thread return@Thread
} }
originalFile.copyTo(inputFile, true) originalFile.copyTo(inputFile, true)
if (cancel) { if (cancel) {
handler.post { stopResult!!.success(null) } postStop()
return@Thread return@Thread
} }
handler.post { updateProgress(0.05, "Reading APK...", "Reading APK")
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.2,
"header" to "Reading APK...",
"log" to "Reading input APK"
)
)
}
val patcher = val patcher = Patcher(
Patcher( PatcherOptions(
PatcherOptions( inputFile,
inputFile, cacheDir,
cacheDir, Aapt.binary(applicationContext).absolutePath,
Aapt.binary(applicationContext).absolutePath, cacheDir.path,
cacheDir.path,
)
) )
)
if (cancel) { if (cancel) {
handler.post { stopResult!!.success(null) } postStop()
return@Thread return@Thread
} }
handler.post { updateProgress(0.1, "Loading patches...", "Loading patches")
installerChannel.invokeMethod(
"update",
mapOf("progress" to 0.3, "header" to "Loading patches...", "log" to "Loading patches")
)
}
val patches = val patches = PatchBundleLoader.Dex(
PatchBundleLoader.Dex( File(patchBundleFilePath)
File(patchBundleFilePath) ).filter { patch ->
).filter { patch -> val isCompatible = patch.compatiblePackages?.any {
(patch.compatiblePackages?.any { it.name == patcher.context.packageMetadata.packageName } == true || patch.compatiblePackages.isNullOrEmpty()) && it.name == patcher.context.packageMetadata.packageName
selectedPatches.any { it == patch.patchName } } ?: false
}
val compatibleOrUniversal =
isCompatible || patch.compatiblePackages.isNullOrEmpty()
compatibleOrUniversal && selectedPatches.any { it == patch.patchName }
}
if (cancel) { if (cancel) {
handler.post { stopResult!!.success(null) } postStop()
return@Thread return@Thread
} }
handler.post { updateProgress(0.15, "Executing...", "")
installerChannel.invokeMethod(
"update", // Update the progress bar every time a patch is executed from 0.15 to 0.7
mapOf( val totalPatchesCount = patches.size
"progress" to 0.5, val progressStep = 0.55 / totalPatchesCount
"header" to "Executing patches...", var progress = 0.15
"log" to ""
)
)
}
patcher.apply { patcher.apply {
acceptIntegrations(listOf(integrations)) acceptIntegrations(listOf(integrations))
@ -227,59 +212,34 @@ class MainActivity : FlutterActivity() {
runBlocking { runBlocking {
apply(false).collect { patchResult: PatchResult -> apply(false).collect { patchResult: PatchResult ->
patchResult.exception?.let { if (cancel) {
if (cancel) { handler.post { stopResult!!.success(null) }
handler.post { stopResult!!.success(null) } this.cancel()
this.cancel() this@apply.close()
return@collect return@collect
}
StringWriter().use { writer ->
it.printStackTrace(PrintWriter(writer))
handler.post {
installerChannel.invokeMethod(
"update",
mapOf("progress" to 0.5, "header" to "", "log" to "${patchResult.patchName} failed: $writer")
)
}
}
} ?: run {
if (cancel) {
handler.post { stopResult!!.success(null) }
this.cancel()
return@collect
}
val msg = "${patchResult.patchName} succeeded"
handler.post {
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.5,
"header" to "",
"log" to msg
)
)
}
} }
val msg = patchResult.exception?.let {
val writer = StringWriter()
it.printStackTrace(PrintWriter(writer))
"${patchResult.patchName} failed: $writer"
} ?: run {
"${patchResult.patchName} succeeded"
}
updateProgress(progress, "", msg)
progress += progressStep
} }
} }
} }
if (cancel) { if (cancel) {
handler.post { stopResult!!.success(null) } postStop()
patcher.close() patcher.close()
return@Thread return@Thread
} }
handler.post { updateProgress(0.8, "Building...", "")
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.7,
"header" to "Repacking APK...",
"log" to ""
)
)
}
val res = patcher.get() val res = patcher.get()
patcher.close() patcher.close()
@ -287,7 +247,7 @@ class MainActivity : FlutterActivity() {
ZipFile(patchedFile).use { file -> ZipFile(patchedFile).use { file ->
res.dexFiles.forEach { res.dexFiles.forEach {
if (cancel) { if (cancel) {
handler.post { stopResult!!.success(null) } postStop()
return@Thread return@Thread
} }
file.addEntryCompressData( file.addEntryCompressData(
@ -308,92 +268,33 @@ class MainActivity : FlutterActivity() {
} }
if (cancel) { if (cancel) {
handler.post { stopResult!!.success(null) } postStop()
return@Thread return@Thread
} }
handler.post { updateProgress(0.9, "Signing...", "Signing APK")
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 0.9,
"header" to "Signing APK...",
"log" to ""
)
)
}
try { try {
Signer("ReVanced", keystorePassword).signApk( Signer("ReVanced", keystorePassword)
patchedFile, .signApk(patchedFile, outFile, keyStoreFile)
outFile,
keyStoreFile
)
} catch (e: Exception) { } catch (e: Exception) {
//log to console
print("Error signing APK: ${e.message}") print("Error signing APK: ${e.message}")
e.printStackTrace() e.printStackTrace()
} }
handler.post { updateProgress(1.0, "Patched", "Patched")
installerChannel.invokeMethod(
"update",
mapOf(
"progress" to 1.0,
"header" to "Finished!",
"log" to "Finished!"
)
)
}
} catch (ex: Throwable) { } catch (ex: Throwable) {
if (!cancel) { if (!cancel) {
val stack = ex.stackTraceToString() val stack = ex.stackTraceToString()
handler.post { updateProgress(
installerChannel.invokeMethod( -100.0,
"update", "Aborted",
mapOf( "An error occurred:\n$stack"
"progress" to -100.0, )
"header" to "Aborted...",
"log" to "An error occurred! Aborted\nError:\n$stack"
)
)
}
} }
} }
handler.post { result.success(null) } handler.post { result.success(null) }
}.start() }.start()
} }
// inner class ManagerLogger : Logger {
// override fun error(msg: String) {
// handler.post {
// installerChannel
// .invokeMethod(
// "update",
// mapOf("progress" to -1.0, "header" to "", "log" to msg)
// )
// }
// }
//
// override fun warn(msg: String) {
// handler.post {
// installerChannel.invokeMethod(
// "update",
// mapOf("progress" to -1.0, "header" to "", "log" to msg)
// )
// }
// }
//
// override fun info(msg: String) {
// handler.post {
// installerChannel.invokeMethod(
// "update",
// mapOf("progress" to -1.0, "header" to "", "log" to msg)
// )
// }
// }
//
// override fun trace(_msg: String) { /* unused */
// }
// }
} }